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 解密器,所以我不能声称用我自己的代码来检查这个。
我能做的第二好是检查 Adobe 将该值解密为什么。我的旧版 Adobe Acrobat 9.5 Preflight 显示:
显然 Adobe 就像 iText 一样将此 0
解密为“3”。使用一两个在线 PDF 解密器进行的额外检查支持此解密结果。
因此,PDFBox 似乎没有正确解密这个 0
字符串。
考虑到 OP 的进一步观察 “有时 0 或 1 值变成 N 或 Y 很少有字段受到影响” 看起来 PDFBox 有时无法正确解密单个字符串。
另一种选择是,相关文件的加密参数存在一些问题。我不太相信这一点,但我不能排除它。
错误
正如 Tilman 在他对 PDFBOX-4453 的评论中已经暗示的那样,错误是由于 PDFBox 的方式,特别是 SecurityHandler
跟踪哪些对象已经被解密,哪些对象仍然存在为:已经解密的对象存储在HashSet SecurityHandler.objects
;当被要求解密一个对象时,SecurityHandler.decrypt
首先检查该对象是否在该集合中,只有在不在的情况下,它才会真正解密并添加到集合中。
因此,如果一个仍然加密的对象 equals
一个已经解密的对象,则解密这个加密对象的调用根本不会做任何事情。
在手头的文件中,之前有一个字符串被解密为“0”。因此,当totalBuyoffCount
、0
的加密值被发送到SecurityHandler
进行解密时,该值被错误地认为已经被解密,因此保持原样。
对于较长的字符串,这通常不是问题,因为它们的加密版本通常完全是乱码,因此不会在已解密的对象中找到它们。另一方面,短字符串,尤其是单字符字符串,可能具有有意义的加密版本,因此可能会发生冲突。
在引用的 Apache Jira 问题中讨论了修复此问题的选项。一种选择是用所讨论的单个对象的标志替换提到的集合,但其他选项也是可能的。
我们在从 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 解密器,所以我不能声称用我自己的代码来检查这个。
我能做的第二好是检查 Adobe 将该值解密为什么。我的旧版 Adobe Acrobat 9.5 Preflight 显示:
显然 Adobe 就像 iText 一样将此 0
解密为“3”。使用一两个在线 PDF 解密器进行的额外检查支持此解密结果。
因此,PDFBox 似乎没有正确解密这个 0
字符串。
考虑到 OP 的进一步观察 “有时 0 或 1 值变成 N 或 Y 很少有字段受到影响” 看起来 PDFBox 有时无法正确解密单个字符串。
另一种选择是,相关文件的加密参数存在一些问题。我不太相信这一点,但我不能排除它。
错误
正如 Tilman 在他对 PDFBOX-4453 的评论中已经暗示的那样,错误是由于 PDFBox 的方式,特别是 SecurityHandler
跟踪哪些对象已经被解密,哪些对象仍然存在为:已经解密的对象存储在HashSet SecurityHandler.objects
;当被要求解密一个对象时,SecurityHandler.decrypt
首先检查该对象是否在该集合中,只有在不在的情况下,它才会真正解密并添加到集合中。
因此,如果一个仍然加密的对象 equals
一个已经解密的对象,则解密这个加密对象的调用根本不会做任何事情。
在手头的文件中,之前有一个字符串被解密为“0”。因此,当totalBuyoffCount
、0
的加密值被发送到SecurityHandler
进行解密时,该值被错误地认为已经被解密,因此保持原样。
对于较长的字符串,这通常不是问题,因为它们的加密版本通常完全是乱码,因此不会在已解密的对象中找到它们。另一方面,短字符串,尤其是单字符字符串,可能具有有意义的加密版本,因此可能会发生冲突。
在引用的 Apache Jira 问题中讨论了修复此问题的选项。一种选择是用所讨论的单个对象的标志替换提到的集合,但其他选项也是可能的。