当前位置: 首页 > 知识库问答 >
问题:

如果识别PDF文档中的文本结构如此困难,PDF阅读器是如何做到这一点的?

百里智勇
2023-03-14

我一直在尝试编写一个简单的控制台应用程序或PowerShell脚本,从大量PDF文档中提取文本。有几个库和CLI工具可以提供这种功能,但事实证明,它们都不能可靠地识别文档结构。我特别关注文本列的识别。即使是非常昂贵的PDFLib-TET工具也经常混淆相邻两列文本的内容。

人们经常注意到,PDF格式没有任何列的概念,甚至没有单词。类似问题的几个答案都提到了这一点。这个问题如此严重,甚至值得进行学术研究。这篇期刊文章指出:

PDF文件中的所有数据对象都以面向视觉的方式表示,作为一系列运算符...通常不传达关于更高级别文本单元的信息,如令牌、行或列——关于这些单元之间边界的信息只能通过空白隐式获得

因此,我尝试过的所有提取工具(iTextSharp、PDFLib-TET和Python-PDFMiner)都无法识别文本列边界。在这些工具中,PDFLib TET表现最好。

然而,苏门答腊PDF,一个非常轻量级的开源PDF阅读器,以及许多其他类似的阅读器可以完美地识别列和文本区域。如果我在其中一个应用程序中打开一个文档,选择页面上的所有文本(甚至使用CTRL a键复制整个文档)并将其粘贴到文本文件中,文本将以正确的顺序呈现,几乎完美无瑕。它偶尔会将页脚和页眉文本混合到其中一列中。

所以我的问题是,这些应用程序如何完成看似如此困难的任务(即使是像PDFLib这样昂贵的工具)?

编辑2014年3月31日:不管怎样,我发现PDFBox在文本提取方面比iTextSharp好得多(尽管有定制的策略实现),PDFLib TET比PDFBox稍好,但它相当昂贵。Python PDFMiner是没有希望的。我见过的最好的结果来自谷歌。人们可以将PDF(每次2GB)上传到谷歌驱动器,然后以文本形式下载它们。这就是我正在做的。我写了一个小实用程序,将我的PDF拆分成10个页面文件(谷歌只会转换前10个页面),然后一旦下载就将它们重新拼接在一起。

2014年4月7日编辑。取消我上次的约会。最佳提取是通过MS Word实现的。这可以在Acrobat Pro(工具)中实现自动化

共有2个答案

端木澄邈
2023-03-14

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

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

我并不是你在问题中提到的产品的专家,所以下面的结论应该是有保留的。

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

任何把PDF翻译成图像的好工具迟早都会意识到它在文本定位方面的缺陷。解决这些问题将有助于在文本提取方面出类拔萃。

罗智志
2023-03-14

我曾经写过一个算法,它做了你提到的一个PDF编辑器产品,它仍然是今天使用的第一个PDF编辑器。你提到的有几个原因(我认为),但重要的是专注。

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

因此,如果你想提取格式化的文本,你必须查看页面上的所有文本片段,也许还要考虑一些线条艺术信息,然后你必须把它们拼凑起来。通常情况下,这是通过编写一个查看空白的引擎来实现的,然后首先决定什么是线条,什么是段落等等。众所周知,表格很难,例如,因为它们太多样化了。

替代策略可以是:

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

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

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

(不,当时我在写代码的时候并没有完全理解——我们从来没有足够的精力去坚持到底,做出真正好的东西。)

 类似资料:
  • 问题内容: 如何 使用PHP 从PDF文档中提取文本? (我不能使用其他工具,我没有root用户访问权限) 我发现一些函数可用于纯文本,但是它们不能很好地处理Unicode字符: http://www.hashbangcode.com/blog/zend-lucene-and-pdf-documents-part-2-pdf- data-extraction-437.html 问题答案: 下载 c

  • 如何用Python阅读pdf?我知道一种将其转换为文本的方法,但我想直接从PDF阅读内容。 谁能解释一下python中的哪个模块最适合pdf提取

  • 我使用此代码将pdf转换为文本。 我已经创建了主目录并将源文件粘贴到其中。 我得到的输出是 并且没有创建带有. txt的文件。问题在哪里?

  • 需要解析一个PDF文件,以便只提取最初的文本行,并寻找不同的Python包来完成这项工作,但没有任何运气。 尝试过: tika,它给出了不同的终端错误消息,并且非常慢 pdftotext安装失败 pdf2text在“导入pdf2text”时失败,并且当更改为“pdftotext”时,即使通过显示安装了“extractor”,也无法使用“importerror:无法导入名称'extractor'”导

  • 问题内容: 我很难尝试使用itextpdf生成包含希腊字母的PDF文件。我正在从外部来源将字符串读取为UTF-8字符串。英文字母出现在结果中,而不是希腊字母。搜索问题,我认为可能与所使用的字体有关。如果这是问题,我不知道要使用哪个ttf文件。这是创建字体的方法 衷心感谢您的任何帮助! 问题答案: 您需要使用带有希腊字符的字体。您可以在此处找到希腊unicode字体。 您可以在此处查看来自itext

  • 问题内容: 我正在尝试读取“ file.txt”,然后使用Golang将内容放入变量中。这是我尝试过的… 文件已成功读取,并且从 os.Open 返回的返回类型为 * os.File 问题答案: 这取决于您要执行的操作。 它输出&{0xc082016240}的原因是因为您正在打印文件描述符()的指针值,而不是文件内容。要获取文件内容,可以从文件描述符中获取。 要将所有文件内容(以字节为单位)读取到