如何使PdfLayer.SetPrint与PdfStamper一起使用?
我使用iText PdfStamper
类在现有的PDF上添加水印。我希望这些水印可以打开或关闭,所以我使用的类别为PdfLayer
。
但我也希望这些水印在打印文件时始终可见:我正在使用函数PdfLayer.setPrint()
。 这是最后一步,不幸的是无法按预期工作。如何使PdfLayer.SetPrint与PdfStamper一起使用?
这里是我的代码:
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阅读器(版本10)层的属性,我看到了“初始状态:打印”属性停留在“打印时可见”,而它应该是“始终打印”。
我也尝试在一个新的PDF文档上创建图层,并且有setPrint()
的作品。
我在做什么错?
我有同样的问题。作为解决方法,您可以使用new Document
和getImportedPage
而不是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();
我有同样的问题。我的代码想在原始pdf的每个页面上添加一个图像作为水印。而水印只能被查看,不允许打印。我也使用PdfStamper
和PdfLayer.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
后。这很好。
我使用iText 5.我不知道它是否是一个bug。我读了iText 7 java源代码,我认为setPrint在itext 7中工作没有问题。 – ttqq 2017-04-04 09:50:41
这个解决方案对我来说已经足够了,谢谢。无论如何,我必须适应你的代码旋转:if(r == 0)content.addTemplate(page,1,0,0,1,0,0); else if(r == 90)\t content.addTemplate(page,0,-1,1,0,pageSizeS.getHeight()); else if(r == 180)content.addTemplate(page,-1,0,0,-1,pageSizeS.getHeight(),pageSizeS.getWidth()); else if(r == 270)content.addTemplate(page,0,1,-1,0,pageSizeS.getWidth(),0);' – 2014-10-30 08:23:28