如何使PdfLayer.SetPrint与PdfStamper一起使用?

时间:2014-10-27 09:16:40

标签: pdf itext

我正在使用iText PdfStamper类在现有PDF上添加水印。我希望这些水印可以打开或关闭,所以我使用的是课程PdfLayer 但我也希望这些水印在打印文件时始终可见:我正在使用函数PdfLayer.setPrint()。 这是最后一步,遗憾的是无法按预期工作。

这是我的代码:

PdfReader reader = new PdfReader("C:/Temp/input.pdf");
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream("C:/Temp/output.pdf"));
PdfWriter writer = stamp.getWriter();
PdfLayer layer = new PdfLayer("Watermarks", writer);
layer.setOn(true);
layer.setPrint("Watermarks", true);
BaseFont bf = BaseFont.createFont();
PdfContentByte cb = stamp.getOverContent(1);
cb.beginText();
cb.setFontAndSize(bf, 18);
cb.beginLayer(layer);
cb.showTextAligned(Element.ALIGN_LEFT, "Watermark line 1", 50, 55, 0);
cb.showTextAligned(Element.ALIGN_LEFT, "Watermark line 2", 50, 40, 0);
cb.endLayer();
cb.endText();
stamp.close();
reader.close();

当我从Adobe Reader(版本10)检查图层属性时,我看到“初始状态:打印”属性保持在“可见时打印”,而它应该是“始终打印”。

我还尝试在新的PDF文档上创建图层,setPrint()可以正常工作。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我有同样的问题。我的代码想要在原始pdf的每一页上添加图像作为水印。并且只能查看水印,不允许打印。我也使用PdfStamperPdfLayer.setPrint()。但它没有用。我读了itext java源代码,找到了一种方法使它工作。这是代码:

PdfWriter writer = stamp.getWriter();
PdfLayer layer = new PdfLayer("Watermarks", writer);
layer.setOn(true);
layer.setOnPanel(false);
layer.setPrint("watermark", false);
writer.addToBody(layer.getPdfObject(), layer.getRef());

addToBody之后致电setPrint。这很有效。

答案 1 :(得分:0)

我有同样的问题。要解决此问题,您可以使用new DocumentgetImportedPage代替pdfStamper。 不幸的是,您松开了超链接,因为所有页面都转换为图像。我尝试使用PdfCopy,但我重现了同样的问题。我真的对能够在不更改源文件的情况下添加水印的解决方案感兴趣。 降级的样品溶液:

        PdfReader pdfReaderS = new PdfReader(filepathS);
    Document document = new Document(pdfReaderS.getPageSizeWithRotation(1));
    PdfWriter pdfWriterD = PdfWriter.getInstance(document, new FileOutputStream(filepathD));
    document.open();
    PdfContentByte pdfContentByteD = pdfWriterD.getDirectContent();

    BaseFont baseFont = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);

    int n = pdfReaderS.getNumberOfPages();

    PdfLayer pdfLayer = new PdfLayer("Watermark", pdfWriterD);
    pdfLayer.setPrint("Print", true);
    pdfLayer.setView(visibleScreen); 

    for (int i = 1; i <= n; i++) {                  
        Rectangle pageSizeS =pdfReaderS.getPageSizeWithRotation(i);
        float pageWidth = pageSizeS.getWidth() / 2;
        float pageheight = pageSizeS.getHeight() / 2;
        float degree = (float)(Math.toDegrees(Math.atan(pageSizeS.getHeight()/pageSizeS.getWidth())));

        document.setPageSize(pageSizeS);
        document.newPage();
        PdfImportedPage pdfImportedPage = pdfWriterD.getImportedPage(pdfReaderS, i);
        int rotation = pdfReaderS.getPageRotation(i); //This value can be 0, 90, 180 or 270. 

        if (rotation == 0) 
            pdfContentByteD.addTemplate(page, 1, 0, 0, 1, 0, 0);
        else if (rotation == 90)
             pdfContentByteD.addTemplate(page, 0, -1, 1, 0, 0, pageSizeS.getHeight());
        else if (rotation == 180)
            pdfContentByteD.addTemplate(page, -1, 0, 0, -1, pageSizeS.getHeight(), pageSizeS.getWidth());
        else if (rotation == 270)
             pdfContentByteD.addTemplate(page, 0, 1, -1, 0, pageSizeS.getWidth(), 0);           

        pdfContentByteD.beginLayer(pdfLayer);
        pdfContentByteD.beginText();
        pdfContentByteD.setFontAndSize(baseFont, policeSize);
        pdfContentByteD.setColorFill(col);
        pdfContentByteD.showTextAligned(PdfContentByte.ALIGN_CENTER, text, pageWidth, pageheight, degree);
        pdfContentByteD.endText();
        pdfContentByteD.endLayer();
    }
    document.close();
    pdfReaderS.close();