我尝试将我的 iText5 代码移植到 iText7 中。我设法签署了一个未签名的 pdf 就好了,但是我在签署一个已经签名的文档时遇到了一些麻烦。
我简化了代码。下面将一些有趣的东西放入我的pdf中。代码:
using (var os = new MemoryStream())
{
var pdfSigner = new ExtendedPdfSigner(new PdfReader(new MemoryStream(File.ReadAllBytes(@"C:\Users\x\Desktop\signed.pdf"))), os, true);
var external = new ExternalBlankSignatureContainer(PdfName.Adobe_PPKLite, PdfName.Adbe_pkcs7_detached);
pdfSigner.SignExternalContainer(external, 8192);
File.WriteAllBytes(@"C:\Users\x\Desktop\tempFile.pdf", os.ToArray());
}
它还在第一个签名中显示“文档有后续更改”消息。
我不知道这是否是一个错误,但我什至在 7.1.3 快照中尝试过。
最佳答案
这是由于 iText 7 中的一个错误。在检索页面的注释以将签名小部件添加到它们时,所有注释都被触及:向它们添加了对其页面的可选引用,并将它们标记为 < em>改变了。
因此,此问题可以通过此代码重现(在 Java 中;在 C# 中类似):
try ( PdfDocument pdfDocument = new PdfDocument(new PdfReader(SOURCE), new PdfWriter(DEST), new StampingProperties().useAppendMode())) {
pdfDocument.getPage(1).getAnnotations();
}
( SignTwice 测试 testStampSigned
)
仅执行此 getter 会导致第 1 页上的所有注释被更改,因此 Adobe Reader 会发出有关注释修改的警告。如果签名是不允许更改的认证签名,这将导致原始签名无效!
单纯的 setter/getter 绝不能有这样的副作用。
关于c# - 多重签名不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51812973/