我有一个 pdf,其中 pdf doc 的内容流看起来像 image1。
但是一旦我在 adobe dc 中打开 pdf 并尝试更改阅读顺序。整个内容流被改变。(请看图2)
这是源pdf的链接https://drive.google.com/file/d/1V2K3-2GdWG5DuTUv1fyfIIT54en70kI2/view
有没有办法以编程方式做同样的事情(将图形文本的内容流转换为正确的流)
提前致谢 !
我有一个 pdf,其中 pdf doc 的内容流看起来像 image1。
但是一旦我在 adobe dc 中打开 pdf 并尝试更改阅读顺序。整个内容流被改变。(请看图2)
这是源pdf的链接https://drive.google.com/file/d/1V2K3-2GdWG5DuTUv1fyfIIT54en70kI2/view
有没有办法以编程方式做同样的事情(将图形文本的内容流转换为正确的流)
提前致谢 !
有没有办法以编程方式做同样的事情(将图形文本的内容流转换为正确的流)
首先,这两个流都是正确的,只是在屏幕上创建相同文本的方法不同(并且在手头的情况下相当不同),它们中的每一个都彼此有效,并且不同的 PDF 处理器使用不同的方法。
创建原始 PDF 的处理器似乎已通过将文本分成小块(小于文本行)并尽可能独立地绘制这些块来完成任务,即作为具有文本属性的单独文本对象 ( BT .. ET )在每个(Tm,Tf,Tc)中设置,通过变换矩阵更改(cm)定位和重新缩放,包含在保存/恢复图形状态指令(q .. Q)中。
另一方面,Adobe Acrobat 似乎更喜欢将页面主文本包含在单个文本对象中,其中文本属性仅在它们更改时设置,并且没有文本对象或图形状态在其间切换。
这些都不比另一个更“正确”或更“图形化”。如果有的话,这些结构反映了这些指令是如何由各自的 PDF 处理器在内部存储或处理的。
话虽如此,您确实希望将前一种风格转换为后者。
主要问题是后一种风格不规范(至少没有公开的文件对其进行规范描述)。因此,虽然您肯定可以尝试按照您的示例进行引导,但您永远无法确定您完全理解了这种风格。因此,您总是必须预料到在特殊的、尚未遇到的情况下会出现差异。此外,不能保证 Adobe 会在软件版本中一丝不苟地坚持这种风格。
尽管如此,您当然可以尝试尽可能地遵循这种风格(如您所见)。
实现必须遍历相应的内容流,跟踪当前图形状态,并尽可能长时间地将文本绘制(和相关)指令转换为单个文本对象。
您已将问题标记为itext和pdfbox。因此,您似乎不确定使用哪个 PDF 库来实现它。这里有两种选择的一些想法:
为了处理内容流和跟踪当前图形状态,iText提供了它的com.itextpdf.text.pdf.parser
API,特别是PdfContentStreamProcessor
(iText 5.x) / 它的com.itextpdf.kernel.pdf.canvas.parser
API,特别是PdfCanvasProcessor
(iText 7.x)。
您可以将它们扩展到除了分析当前内容之外,还可以用更新版本替换有问题的内容流,例如,就像我在iText 5的这个答案或iText 7的这个答案中所做的那样。
相同任务的 PDFBox 提供了基于PDFStreamEngine
. 基于这些类,应该同样可以创建一个图形状态感知内容流编辑器。
这两个库还提供了更简单的类,用于将内容流解析为指令序列,但这些类不跟踪图形状态,留给您实现。