1

我有一个 pdf,其中 pdf doc 的内容流看起来像 image1。

在此处输入图像描述

但是一旦我在 adobe dc 中打开 pdf 并尝试更改阅读顺序。整个内容流被改变。(请看图2)

在此处输入图像描述

这是源pdf的链接https://drive.google.com/file/d/1V2K3-2GdWG5DuTUv1fyfIIT54en70kI2/view

有没有办法以编程方式做同样的事情(将图形文本的内容流转换为正确的流)

提前致谢 !

4

1 回答 1

2

有没有办法以编程方式做同样的事情(将图形文本的内容流转换为正确的流)

首先,这两个流都是正确的,只是在屏幕上创建相同文本的方法不同(并且在手头的情况下相当不同),它们中的每一个都彼此有效,并且不同的 PDF 处理器使用不同的方法。

创建原始 PDF 的处理器似乎已通过将文本分成小块(小于文本行)并尽可能独立地绘制这些块来完成任务,即作为具有文本属性的单独文本对象 ( BT .. ET )在每个(TmTfTc)中设置,通过变换矩阵更改(cm)定位和重新缩放,包含在保存/恢复图形状态指令(q .. Q)中。

另一方面,Adobe Acrobat 似乎更喜欢将页面主文本包含在单个文本对象中,其中文本属性仅在它们更改时设置,并且没有文本对象或图形状态在其间切换。

这些都不比另一个更“正确”或更“图形化”。如果有的话,这些结构反映了这些指令是如何由各自的 PDF 处理器在内部存储或处理的。

话虽如此,您确实希望将前一种风格转换为后者。

主要问题是后一种风格规范(至少没有公开的文件对其进行规范描述)。因此,虽然您肯定可以尝试按照您的示例进行引导,但您永远无法确定您完全理解了这种风格。因此,您总是必须预料到在特殊的、尚未遇到的情况下会出现差异。此外,不能保证 Adob​​e 会在软件版本中一丝不苟地坚持这种风格。

尽管如此,您当然可以尝试尽可能地遵循这种风格(如您所见)。

实现必须遍历相应的内容流,跟踪当前图形状态,并尽可能长时间地将文本绘制(和相关)指令转换为单个文本对象。

您已将问题标记为。因此,您似乎不确定使用哪个 PDF 库来实现它。这里有两种选择的一些想法:

  • 为了处理内容流和跟踪当前图形状态,iText提供了它的com.itextpdf.text.pdf.parserAPI,特别是PdfContentStreamProcessor(iText 5.x) / 它的com.itextpdf.kernel.pdf.canvas.parserAPI,特别是PdfCanvasProcessor(iText 7.x)。

    您可以将它们扩展到除了分析当前内容之外,还可以用更新版本替换有问题的内容流,例如,就像我在iText 5的这个答案或iText 7的这个答案中所做的那样。

  • 相同任务的 PDFBox 提供了基于PDFStreamEngine. 基于这些类,应该同样可以创建一个图形状态感知内容流编辑器。

这两个库还提供了更简单的类,用于将内容流解析为指令序列,但这些类不跟踪图形状态,留给您实现。

于 2019-07-25T17:10:58.400 回答