Java 添加LTV后,某些pdf文件的签名已损坏

Java 添加LTV后,某些pdf文件的签名已损坏,java,pdfbox,Java,Pdfbox,我正在尝试在数字签名文档中添加LTV。在某些文件中,它工作正常,但在某些文件中,它不工作。 我附上所有文件以供参考 我的LTV添加代码链接如下 下面给出了成功输入和输出文件链接 输入文件: 输出文件: 下面给出了失败的输入和输出文件链接 输入文件: 输出文件: 请帮我解释一下为什么在某些文件中,签名使用相同的代码被破坏。原因是源PDF已经损坏,因此,您的签名和扩展文件的第一个修订版已经损坏 源PDF只有一个版本,其交叉引用表如下所示: xref 0 118 0000000000 65535 f

我正在尝试在数字签名文档中添加LTV。在某些文件中,它工作正常,但在某些文件中,它不工作。 我附上所有文件以供参考

我的LTV添加代码链接如下

下面给出了成功输入和输出文件链接 输入文件输出文件

下面给出了失败的输入和输出文件链接 输入文件输出文件


请帮我解释一下为什么在某些文件中,签名使用相同的代码被破坏。

原因是源PDF已经损坏,因此,您的签名和扩展文件的第一个修订版已经损坏

源PDF只有一个版本,其交叉引用表如下所示:

xref
0 118
0000000000 65535 f
00000001800万元
...
0000304213 00000N
119 64
000030449900000N
...
000031609百万元
185 5
000031632530000N
...
0000316700000N
192 1
000031696900000N
194 8
0000317581 00000N
...
00003422320000N
(PDF的签名版和扩展版有一个与第一次修订版相似的对照表。)

如您所见,它由多个部分组成,并且有间隙(例如,对象118没有条目)

这是无效的:

对于从未进行增量更新的文件,交叉引用部分应仅包含一个小节,其对象编号从0开始

(ISO 32000-1和ISO 32000-2,在这两种情况下,第7.5.4节“交叉参考表”)

通常情况下,Adobe Acrobat在遇到使PDF失效的小问题时通常会非常松懈


通常情况下,也就是说,除非在签名修订后验证具有集成签名和增量更新的文档,在这种情况下,Adobe Acrobat通常认为此类问题可疑,并且签名验证失败,即使它在验证同一个PDF时没有在签名修订后进行增量更新,也不会抱怨

您的示例PDF根据其Info字典由
Aspose.PDF for Java 16.10.0
生成。事实上,众所周知,Aspose PDF组件会创建此类无效的第一个交叉引用表,请参阅和Aspose免费支持论坛上的线程


iText 7在其早期的7.0.x版本中也生成了类似的中断交叉引用表,请参见。

除非在签名修订后验证具有集成签名和增量更新的文档->是否有任何方法在同一调用中添加数字签名和LTV而不必对文档进行增量更新?否则我如何解决我的问题?“我如何解决我的问题?”-您可以拒绝损坏的PDF。或者你可以修理它们。当然,修复只能在没有先前签名的PDF中进行。(简单地在同一个调用中添加数字签名和LTV,而不进行增量更新,只会将问题转移到下一个处理该PDF的服务,例如,稍后再次为其添加时间戳。)我无法拒绝该PDF。我上传到DocuSign平台的是同一个pdf,但是他们能够处理pdf而不被拒绝。然后他们修复它。AdobeAcrobat也修复了它。尽管如此,您还是应该当心并准备好拒绝一些损坏的PDF。否则,已签名的文档可能会说用户不想说的话。