iText Stamping – Java

我在压印PDF文档时遇到了麻烦,而没有使数字签名无效。

目前,我成功加盖了PDF。 但是,如果文档先前已签名,则签名不再有效。 我理解为什么会发生这种情况,但如果我使用Acrobat添加文本或使用注释标记它,则签名有效。

我尝试添加注释或注释,但它仍然使签名无效。 有没有办法在不使数字签名无效的情况下使用iText为PDF添加图章?

这是我用来标记的代码片段:

PdfReader reader = new PdfReader(inputstream); stamp = new PdfStamper(reader, new FileOutputStream(file)); PdfContentByte pcb; BaseFont bf = BaseFont.createFont("Courier", BaseFont.CP1250,BaseFont.EMBEDDED); Rectangle r = reader.getPageSizeWithRotation(1); pcb = stamp.getOverContent(1); // set the font and size float size = 12; pcb.setFontAndSize(bf, size); float width = 90; float centerX = 0, startY = 0; centerX = r.getWidth() - (width / 2) - 20; startY = r.getHeight() - (15 * 2) - 145; pcb.beginText(); pcb.showTextAligned(PdfContentByte.ALIGN_CENTER, stampText, centerX, startY, 0); pcb.setFontAndSize(bf, 10); pcb.showTextAligned(PdfContentByte.ALIGN_CENTER, date, centerX-9, startY-8, 0); pcb.endText(); stamp.close(); 

任何帮助将不胜感激,谢谢

我做到了’:)

以下是使用iText将自定义文本添加到文档而不会使数字签名无效的代码。

 //Read the source PDF PdfReader reader = new PdfReader(inputstream); //Create PdfStamp object stamp = new PdfStamper(reader, new FileOutputStream(file), '\0', true); //Create the proper annotation PdfAnnotation annot = PdfAnnotation.createFreeText(stamp.getWriter(), new Rectangle(150, 150, 200, 200), "Annotation 1", pcb); annot.setFlags(PdfAnnotation.FLAGS_PRINT); //Insert the annotation stamp.addAnnotation(annot, 1); //Close the stamp stamp.close(); 

编辑:

为了在不使数字签名无效的情况下将图像标记插入到文档中,我使用了以下代码:

 //Read the pdf PdfReader reader = new PdfReader(inputstream); //Use PdfStamper in append mode stamp = new PdfStamper(reader, new FileOutputStream(file), '\0', true); //Read the image Image img = Image.getInstance(ImageIO.read(imgStream), null); float w = img.getScaledWidth(); float h = img.getScaledHeight(); Rectangle location = new Rectangle(70, 770 - h, 70 + w, 770); //Create stamp annotation PdfAnnotation stampAnnot = PdfAnnotation.createStamp(stamp.getWriter(), location, null, "ITEXT"); img.setAbsolutePosition(0, 0); //Create new PdfContentByte from the stamp writer //If you use cd = stamp.getOverContent(1) - you'll invalidate the signatures PdfContentByte cb = new PdfContentByte(stamp.getWriter()); PdfAppearance app = cb.createAppearance(w, h); app.addImage(img); stampAnnot.setAppearance(PdfName.N, app); stampAnnot.setFlags(PdfAnnotation.FLAGS_PRINT); stamp.addAnnotation(stampAnnot, 1); reader.close();