如果在PDF文档中识别文本结构如此困难,那么PDF阅读器是如何做到如此出色的呢?

35
我一直在尝试编写一个简单的控制台应用程序或PowerShell脚本来提取大量PDF文档中的文本。有几个库和CLI工具可以完成此任务,但事实证明没有一个能够可靠地识别文档结构。特别是我担心的是文本列的识别。即使是非常昂贵的PDFLib TET工具也经常混淆两个相邻文本列的内容。
经常注意到PDF格式没有任何列的概念,甚至没有单词。类似问题的几个答案在SO上提到了这一点。问题如此之大,以至于它甚至需要学术研究。这篇期刊文章指出:
所有PDF文件中的数据对象都以视觉导向的方式表示,作为一系列运算符,这些运算符通常不传达关于更高级别文本单位(例如令牌、行或列)的信息——有关这些单位之间边界的信息仅通过空格隐含地提供。
因此,我尝试过的所有提取工具(iTextSharp、PDFLib TET和Python PDFMiner)都未能识别文本列边界。其中,PDFLib TET表现最佳。
然而,SumatraPDF这个非常轻巧且开源的PDF阅读器和许多类似的应用程序可以完美地识别列和文本区域。如果我在其中一个应用程序中打开一个文档,在页面上选择所有文本(甚至使用CTRL+A选择整个文档),将其复制并粘贴到文本文件中,文本几乎完美地按正确顺序呈现。它偶尔会将页脚和页眉文本混合到其中一个列中。

所以我的问题是,这些应用程序如何做到看起来如此困难(即使对于PDFLib这样的昂贵工具)?

编辑于2014年3月31日:就我所知,PDFBox在文本提取方面比iTextSharp好得多(尽管进行了定制策略实现),而PDFLib TET比PDFBox略好,但价格相当昂贵。Python PDFMiner无望。最好的结果来自谷歌。人们可以将PDF上传到Google Drive(每次2GB),然后将其下载为文本。这就是我正在做的事情。我编写了一个小工具,将我的PDF拆分为10页文件(Google只会转换前10页),然后在下载后将它们拼合在一起。

2014年4月7日更新:取消上次的建议。最好的提取方法是使用MS Word。这可以在Acrobat Pro中自动化(工具>操作向导>创建新操作)。使用.NET OpenXml库可以自动将Word转换为文本。这里有一个类可以非常干净地执行提取(从docx到txt)。我的初步测试发现,与文档结构相关的MS Word转换要准确得多,但一旦转换为纯文本,则此问题并不那么重要。


2
我不知道其他产品,但在iTextSharp的情况下,您不会得到最终的全功能文本提取器。相反,您将获得一个框架和两个示例策略,一个非常简单(按PDF中出现的绘图命令顺序获取文本),另一个是位置感知型(从上到下,从左到右阅读)。后者可以轻松地(例如采用@David给出的提示)扩展以尝试识别列。这意味着需要一些工作,而且似乎还没有人投资解决此问题并允许结果进入iTextSharp的开源中。 - mkl
使用Word是个不错的选择。另一个可能性是在Word中使用VBA从文档中提取任何你想要的信息。 - Rick Henderson
2个回答

27
我曾经为一款 PDF 编辑器产品编写过一种算法,正如您提到的那样,该产品仍然是当今使用最多的 PDF 编辑器之一。我认为您提到的原因有几个,但其中一个重要的原因是关注点。
您说得对,PDF(通常)不包含任何结构信息。PDF 更关心页面的视觉呈现,而不一定关心页面的“含义”。这意味着在其最纯粹的形式中,它不需要关于线条、段落、列或任何类似的信息。实际上,它甚至不需要有关文本本身的信息,有很多 PDF 文件即使您复制和粘贴文本也会出现乱码。
因此,如果您想要提取格式化的文本,您确实需要查看页面上所有文本片段,可能还要考虑一些线条信息,并将它们重新组合起来。通常,这是通过编写引擎来完成的,该引擎查看空格并首先决定哪些是行,哪些是段落等等。例如,表格非常难处理,因为它们非常多样化。
另一种策略可能是:
- 查看某些 PDF 文件中可用的一些结构信息。某些 PDF/A 文件和所有 PDF/UA 文件(用于档案和通用可访问性的 PDF)必须具有可用于检索结构的结构信息。其他 PDF 文件也可能具有该信息。 - 查看 PDF 文档的创建者,并具有特定的算法以处理这些 PDF。如果您知道您只对 Word 感兴趣,或者您知道您将处理的 99% 的 PDF 将来自 Word 2011,则使用该知识可能是值得的。
那么为什么有些产品在此方面比其他产品更好呢?我想是因为关注点不同。PDF 规范非常广泛,一些工具更关注低级别的 PDF 任务,一些则更关注高级别的 PDF 任务。有些面向“办公室”使用 - 有些则面向“图形艺术”使用。根据您的关注点,您可以决定某个功能是否值得大量关注。

此外,这可能看起来像是一个糟糕的答案,但我相信它实际上是真的。这是一个算法难度很大的问题,只需要一个天才开发人员实现一种比市场上平均产品更好的算法。如果您聪明并且足够关注它,特别是如果您对编写这个目标市场有一个好的理解,那么您将做得很好,而其他人则会表现平庸。

(不过,当时我编写代码时没有掌握这个技巧——我们从未有足够的注意力去跟进并制作出真正优秀的东西)


2
关于“正确性”:这可能被认为是一个“移动目标”。假设您在左侧有3行小文本,右侧有2行较大的文本。通用文本提取器能否假定原始文本的“正确”顺序? - Jongware
1
完全正确。问题也在于我们大多数时间都在处理设计重的文档,而文字识别并不喜欢杂志设计师在页面上所做的事情。对于简单的商业报告来说,做正确的事情要容易得多,而对于在InDesign中设计的文件来说则更加困难... - David van Driessche

6
为了正确提取格式化文本,一个库/实用程序应该:
  1. 检索有关PDF中使用的字体属性的正确信息(字形大小、提示信息等)
  2. 维护图形状态(即非字体参数,如文本和页面缩放等)
  3. 实现一些算法来决定页面上哪些符号应被视为单词、行或列。
我不是你在问题中提到的产品的专家,因此以下结论应该带着一定的保留看待。
那些不会绘制PDF的工具往往在前两个要求上缺乏专业知识。他们没有必要深入处理字体细节,也可能没有经过良好的测试以维护图形状态。
任何一个将PDF转换为图像的工具都可能会尽早意识到其文本定位的不足之处。修复这些问题将有助于在文本提取方面表现出色。

实际上,不需要提示 - 对您的好答案进行一些小细节备注。 - David van Driessche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接