是否可以逐行阅读PDF?

时间:2013-08-28 13:22:58

标签: java pdf

Java中有没有办法逐行读取PDF并将其转换为文本?我之前使用过iTextPDFParser但它逐页读取而不是逐行读取。这有一些缺点。如果有任何方法可以逐行阅读PDF,请告诉我。

1 个答案:

答案 0 :(得分:3)

在开始之前,你应该问自己一些更抽象的问题。第一个是“文档中的文本行是什么?”你知道,问题在于PDF代表了一大堆可打印的文档(我不会说所有,但它非常接近)。

文字放置在页面上,其中包含许多操作符:Tj ' " TJ。例如,(a string) Tj将当前字体中的“字符串”与页面上的当前文本转换(字/字符间距/缩放,转换矩阵)放在一起。即使这已经过度简化,因为字符串中的8位字符可能会以各种方式解释,具体取决于用于此字体实例的编码。

让我们这样看待它 - 如果你在页面上放置文本行,生成应用程序可能会很好地使用'运算符移动到下一行并放置一行文本。这很好,逐行提取很容易。如果一个应用程序决定将所有纯文本放在页面上,然后是所有斜体文本,然后是所有粗体文本(我正在查看 troff),那么你就不会得到任何东西你期望的顺序。实际上,应用程序可以按照您想要的任何顺序将文本放在页面上。

好的,你说,只需取出文字并按阅读顺序对其进行排序。这很简单。您将获得每段文本的边界框,并从上到下从左到右进行排序。列怎么样?插页盒怎么样?那么small caps还是初始drop caps怎么样? sub和上标怎么样?地图上的文字如何跟随道路或河流的轮廓? 的阅读顺序是什么?如果文字是汉字怎么办?如果它是汉字和英语的混合怎么办?如果希伯来语有数字怎么办?那么ligatures呢?无论如何,字边界在哪里?如果一个单词一次放置一个字形怎么办?我如何知道字形何时成为单词的一部分而我应该放入空格?如果页面上没有空格怎么办?那么discretionary hyphens呢?

这使您可以了解问题的范围以及在解释典型文本提取的输出时需要考虑的事项。大多数PDF文本提取工具都可以提取文本,撤消编码,退出单词和排序。

我参与了Acrobat 1.0和2.0中的文本提取工具,我们点击了该列表中的所有内容。我们有一位工程师/研究员在2.0产品的文本提取代码上全职工作,他在1.0产品的中间开始 - 接近两年才能做到这一点(ish)。

所以你想逐行?卷起袖子。