31

我一直在尝试编写一个简单的控制台应用程序或 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(一次 2GB)上传到 Google Drive,然后以文本形式下载。这就是我正在做的事情。我编写了一个小实用程序,可以将我的 PDF 拆分为 10 页文件(Google 只会转换前 10 页),然后在下载后将它们缝合在一起。

编辑 2014 年 4 月 7 日。取消我的最后一个。最好的提取是通过 MS Word 实现的。这可以在 Acrobat Pro 中自动执行(工具 > 动作向导 > 创建新动作)。Word 到文本可以使用 .NET OpenXml 库实现自动化。这是一个可以非常巧妙地进行提取(docx 到 txt)的类。我最初的测试发现,MS Word 转换在文档结构方面要准确得多,但是一旦转换为纯文本,这一点就不那么重要了。

4

2 回答 2

26

我曾经写过一个算法,它完全符合您对 PDF 编辑器产品的描述,它仍然是当今使用的第一大 PDF 编辑器。您提到的(我认为)有几个原因,但重要的一个是专注。

您是正确的,PDF(通常)不包含任何结构信息。PDF 对页面的视觉表示感兴趣,而不一定对页面的“含义”感兴趣。这意味着在其最纯粹的形式中,它不需要有关行、段落、列或任何类似内容的信息。实际上,它甚至不需要有关文本本身的信息,并且有很多 PDF 文件,您甚至无法在其中复制和粘贴文本而不会出现乱码。

因此,如果您希望能够提取格式化文本,您必须确实查看页面上的所有文本片段,也许还要考虑一些艺术线条信息,并且您必须将它们拼凑在一起. 通常这是通过编写一个查看空白然后首先决定什么是行、什么是段落等等的引擎来实现的。例如,表格是出了名的困难,因为它们是如此多样化。

替代策略可能是:

  • 查看某些PDF 文件中可用的一些结构信息。一些 PDF/A 文件和所有 PDF/UA 文件(用于存档的 PDF 和用于通用可访问性的 PDF)必须具有可以很好地用于检索结构的结构信息。其他 PDF 文件也可能包含该信息。
  • 查看 PDF 文档的创建者,并有特定的算法来很好地处理这些 PDF。如果您知道您只对 Word 感兴趣,或者如果您知道您将处理的 99% 的 PDF 都来自 Word 2011,那么使用这些知识可能是值得的。

那么为什么有些产品在这方面比其他产品更好呢?我猜是重点。PDF 规范非常广泛,有些工具更侧重于较低级别的 PDF 任务,有些更侧重于更高级别的 PDF 任务。有些面向“办公室”使用 - 有些面向“图形艺术”使用。根据您的关注点,您可能会决定某个功能是否值得关注。

此外,这似乎是一个糟糕的答案,但我相信这是真的,这是一个算法难题,只需要一个天才开发人员就可以实现比市场上的平均产品好得多的算法。这是那些领域之一——如果你很聪明,并且你有足够的注意力来集中注意力,特别是如果你很清楚你写这篇文章的目标市场是什么——你会做对的,而其他人会变得平庸。

(不,我当时写代码的时候并没有正确地理解它——我们从来没有足够的注意力去跟进并做出真正好的东西)

于 2014-03-27T06:49:16.063 回答
6

要正确提取格式化文本,库/实用程序应该:

  1. 检索有关 PDF 中使用的字体属性的正确信息(字形大小、提示信息等)
  2. 保持图形状态(即非字体参数,如文本和页面缩放等)
  3. 实现一些算法来决定页面上的哪些符号应该被视为单词、行或列。

我不是您在问题中提到的产品的真正专家,因此应该对以下结论持保留态度。

绘制PDF 的工具往往在前两个要求方面的专业知识较少。他们不必处理更深层次的字体细节,并且在维护图形状态方面可能没有经过很好的测试。

任何将 PDF 转换为图像的体面工具都可能迟早会意识到其在文本定位方面的缺点。修复这些将有助于在文本提取方面表现出色。

于 2014-03-27T04:46:12.883 回答