iText 冲压 - Java
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), '[=10=]', 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), '[=11=]', 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();
我在不使数字签名无效的情况下对 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), '[=10=]', 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), '[=11=]', 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();