PDFBOX2.X - 从 acroForm 读取错误数据

PDFBOX2.X - Read wrong Data from acroForm

我们在从 acroform 读取数据时遇到问题。

我们正在使用 PDFBOX2.x 版本创建 PDF 文件。我们的目标是使 pdf 可执行意味着我们可以下载包含 acroform 的 pdf 文件。我们可以收集数据,稍后我们可以上传它与数据库同步。

我们面临 PDFBox 调试器或我们可以在上传文件中说的问题。我们的文本框值正在自动更改。

请在下图中查看更多详细信息。

我们已经使用 PDF Debugger 工具来检查 PDF 内容。可以看到totalBuyoffCount值为0,但应该是3。

我已经使用 iTextDebugger 检查相同的字段

这完全是随机行为,我们注意到以下几点

有时0或1值变成N或Y 受影响的字段很少,但如果将其转换为 String 值,则会导致 NumberFormat 异常。 它使我们的整个文件损坏。

如果无法修复,那么您能否告诉我我们需要查看哪个区域,以便我们能够理解和调试为什么它的值发生变化,或者从哪里检索值,以防万一我们找到我们可以改变或覆盖此行为

查看有问题的 PDF 对象 (1499, gen 0) 发现

1499 0 obj
<<
/FT /Tx
/Q 0
/V (0)
/Ff 1
/Rect [0.0 1.0 1.0 1.0]
/Type /Annot
/Subtype /Widget
/T <77A2A671303FC282631C0C903EA8F40F>
/DA <2C85B77C2A5D81D53C5A3EB571EDBA1C>
/F 6
>>
endobj 

所以有人可能会想说 你看到“/V (0)”。而不是 3.

虽然这是正确的,但不幸的是,这并不意味着很多,因为该文件已加密!

因此,问题归结为第 0 代对象 1499 中的字符串 0 是否解密为“0”或“3”。

我自己没有实现 PDF 解密器,所以我不能声称用我自己的代码来检查这个。

我能做的第二好是检查 Adob​​e 将该值解密为什么。我的旧版 Adob​​e Acrobat 9.5 Preflight 显示:

显然 Adob​​e 就像 iText 一样将此 0 解密为“3”。使用一两个在线 PDF 解密器进行的额外检查支持此解密结果。

因此,PDFBox 似乎没有正确解密这个 0 字符串。

考虑到 OP 的进一步观察 “有时 0 或 1 值变成 N 或 Y 很少有字段受到影响” 看起来 PDFBox 有时无法正确解密单个字符串。

另一种选择是,相关文件的加密参数存在一些问题。我不太相信这一点,但我不能排除它。

错误

正如 Tilman 在他对 PDFBOX-4453 的评论中已经暗示的那样,错误是由于 PDFBox 的方式,特别是 SecurityHandler 跟踪哪些对象已经被解密,哪些对象仍然存在为:已经解密的对象存储在HashSet SecurityHandler.objects;当被要求解密一个对象时,SecurityHandler.decrypt 首先检查该对象是否在该集合中,只有在不在的情况下,它才会真正解密并添加到集合中。

因此,如果一个仍然加密的对象 equals 一个已经解密的对象,则解密这个加密对象的调用根本不会做任何事情。

在手头的文件中,之前有一个字符串被解密为“0”。因此,当totalBuyoffCount0的加密值被发送到SecurityHandler进行解密时,该值被错误地认为已经被解密,因此保持原样。

对于较长的字符串,这通常不是问题,因为它们的加密版本通常完全是乱码,因此不会在已解密的对象中找到它们。另一方面,短字符串,尤其是单字符字符串,可能具有有意义的加密版本,因此可能会发生冲突。

在引用的 Apache Jira 问题中讨论了修复此问题的选项。一种选择是用所讨论的单个对象的标志替换提到的集合,但其他选项也是可能的。