我有一个问题与数字签名PDF文件已标记为PDF/A-3A兼容。使用PDFBox(最新版本,2.0.24)最终在Adobe Acrobat中获得无效签名,而使用iText7(最新版本)获得有效签名。目标是获得符合PAdES LTV的签名。
我的流程如下(使用PDFBox和iText7):
我还注意到只要做:
document.load(inputStream);
document.save(outputStream);
我破坏了签名。从我的测试来看,实际的嵌入并不是问题的真正原因,而只是我在嵌入签名后重新打开PDF并将其保存回磁盘。
使用相同的过程(密钥、证书等),我最终在Adobe Acrobat中通过iText7获得一个有效的LTV签名。
PDDocumentInformation info = pdDocument.getDocumentInformation();
if (info != null && StringUtils.containsIgnoreCase(info.getProducer(), "Aspose")) {
try {
pdDocument.save(inMemoryStream);
pdDocument.close();
pdDocument = PDDocument.load(inMemoryStream.toByteArray());
inMemoryStream.reset();
} catch (Exception e) {
谢谢@MKL和@TilmanHausher,你是对的。假设使用某个库生成的所有文档都必须自动规范化,这不是一个好主意,因为现有的签名将会失效。最后,更好的想法是保持代码原样,并期待一个正确构造的PDF。在创建的地方修复问题。
问题是由原始PDF中的错误引起的。您的PDFBox代码在追加模式下签名(即在增量更新中),因此在签名版本中也存在错误。您的iText代码不在追加模式下登录,而是重写整个PDF;在这样做的时候,它不会犯与您的原始PDF生产者相同的错误,所以该错误不再出现在签名版本中。Adobe Acrobat在验证带有更新的签名时对此类问题非常敏感。
PDF中初始修订版的对照表不能分成单独的小节,但如果是原始PDF,它已经被拆分:
0 75
0000000000 65535 f
0000000018 00000 n
...
0000313374 00000 n
0000313397 00000 n
76 20
0000313419 00000 n
0000313443 00000 n
...
0000846048 00000 n
0000846175 00000 n
类似的情况已经在这个答案,这个答案,这个答案,和其他地方讨论过;您还可以在这些答案中找到一些规范参考。
我在PDF文档中(以编程方式)填写一个表单(AcroPdf),然后在文档上签名。我从doc.pdf开始,使用pdfbox的setfields.java示例创建doc_filler.pdf。然后我对doc_fill.pdf进行签名,创建doc?filled_signer.pdf,使用一些代码,基于签名示例并在Acrobat Reader中打开pdf。输入的字段数据是可见的,并且签名面板告诉我 “此签
然而,我想使用相同的文件,这意味着我不再假装复制PDF了。我要抓取文档,签名,并覆盖原来的。 由于我了解到让FileInputStream和FileOutputStream指向同一个文件不是一个好主意,所以我只是尝试使用file类。 我尝试了以下操作:
问题内容: 我在PDF文档中(以编程方式)填写了表格(AcroPdf),然后在文档上签名。我从doc.pdf开始,使用PDFBox的setFields.java示例创建doc_filled.pdf。然后,我根据签名示例使用一些代码对doc_filled.pdf进行签名,以创建doc?filled_signed.pdf,然后在Acrobat Reader中打开pdf。输入的字段数据可见,签名面板告诉
所以我最近一直在处理PDF文档的签名,今天我遇到了一个新的奇妙的问题。因此,当我签署文档(文档实际上是在服务器上签署的)并在我的机器中打开文档时,签名显示有效,并且启用了LTV,因此几乎与预期的工作方式相同。但是,当我在老板的计算机上打开相同的文档时,它显示即使在证书被信任后也无法验证签名的身份,但如果我打开证书属性,它会说证书是有效的,吊销已经成功执行。这可能是什么原因? 图1:证书本身是可信的
目标是实现一个PDF签名过程,其中服务器根据请求向客户端提供要签名的哈希。然后,客户端使用通过PKCS#11接口从智能卡获得的私钥对给定哈希进行签名。然后,签名被发送回服务器,以便使用iTextSharp 5.5.4附加到PDF文件中。 在Acrobat Reader中查看签名时,我发现错误“自签名应用以来,文档已被更改或损坏”。 下面是我在服务器上计算哈希的方法。 客户端对给定的哈希签名后,我将
使用iText7,我试图对PDF进行签名,以获得外部实体的签名。该过程必须按如下方式执行 使用Web服务并获得证书, 获取要签名的PDF哈希。哈希在发送到外部实体进行签名之前必须有前缀。 我为此创建了一个临时PDF。 在信息交换中使用网络服务。 发送哈希; 通过短信获取确认; 获取签名的哈希。 使用签名的哈希,我签署最终的PDF。 问题是,我发现一个错误,即在应用签名后,文档已被更改或损坏<项目实