0

我使用 iReport 生成了一个包含 3 页的报告。现在签名只出现在一页中。但我需要使用 iText 对每一页进行签名。

PdfReader reader = new PdfReader(fullFilePath);

String outputPath = reportPath + randomUUID + fileExtension;
FileOutputStream fout = new FileOutputStream(outputPath);
stp = PdfStamper.createSignature(reader, fout, '\0', null, true);
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setCrypto(key, chain, null,PdfSignatureAppearance.SELF_SIGNED);
sap.setReason("test");
sap.setLocation("test");

String imagePath = servletContextPath + "/resources/img/signature.png";
File file = new File(imagePath);
byte[] imageByte = new byte[(int) file.length()];

try (FileInputStream fileInputStream = new FileInputStream(file)) {
    fileInputStream.read(imageByte);
    Image image = Image.getInstance(imageByte);
    sap.setImage(image);
}

// comment next line to have an invisible signature
for (int page = 1; page <= reader.getNumberOfPages(); page++){
    sap.setVisibleSignature(signatureRectangle, page, null);
}
4

2 回答 2

1
sap.setVisibleSignature(signatureRectangle, page, null);

设置视觉表示,它不会添加另一个。因此,您在循环中对该方法的所有调用,但最后一个都是徒劳的。

IText 签名创建代码原样只能为每个签名创建一个可视化表示,虽然根据规范可能有多个小部件可视化相同的签名,但 PDF 查看器可能会拒绝它作为具有多个可视化的签名的合法值是有问题的。

编辑:

Adobe,例如,在他们的数字签名外观v9 白皮书中写道:

文档中签名的位置可能会影响其法律意义。出于这个原因,签名字段永远不会引用多个注释。如果多个位置与签名相关联,则含义可能会变得模棱两可。

因此,他们将来可能会完全停止接受具有多个注释(即可视化)的签名。

于 2013-03-28T08:00:25.847 回答
1

除了法律问题,如果您仍想使用 Itext api (version 5.5.*) 对所有页面进行签名,您应该在页面中包含签名外观preClose(HashMap<PdfName, Integer> exclusionSizes)的类方法中进行一些修改。PdfSignatureAppearance

在类内搜索writer.addAnnotation(sigField, pagen);PdfSignatureAppearance并替换为

for (int p = 1; p <= writer.reader.getNumberOfPages(); p++) {
   writer.addAnnotation(sigField, p);
}

它将签名的引用添加到所有页面。

于 2016-11-23T06:20:43.437 回答