2014-10-27 158 views
2

我使用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()的作品。

我在做什麼錯?

回答

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(); 
+1

這個解決方案對我來說已經足夠了,謝謝。無論如何,我必須適應你的代碼旋轉: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

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()); 

它叫addToBodysetPrint後。這很好。

+0

我使用iText 5.我不知道它是否是一個bug。我讀了iText 7 java源代碼,我認爲setPrint在itext 7中工作沒有問題。 – ttqq 2017-04-04 09:50:41

相關問題