首页 > 解决方案 > 解析 PDF 文件并输出单个字符位置

问题描述

我试图通过识别每个字符和每个单词的内容和位置来从(数字)PDF 中提取文本信息。对于单词,pdftotext --bbox来自 xpdf / poppler 的效果很好,但我找不到提取字符位置的简单方法。

我试过的

我目前拥有的解决方案是将pdf转换为svg(通过pdf2svg),然后解析生成的svg以提取单个字符(=字形)位置。第三步,比较结果框,将每个字符分配给一个单词,并希望数字匹配。

问题

虽然上述方法适用于大多数“基本”字体,但这种方法在两种(主要)情况下会失败:

第二点(对我来说是主要的)通过识别常见的连字和(如果计数不匹配)将相应的边界框分成多个部分来解决部分问题;但这并不总是有效,因为例如“ffi”有时会连接到单个字形,有时会连接到两个字形“ff”+“i”,有时会连接到两个字形“f”+“fi”,具体取决于字体。

我希望什么

据我了解,pdf 实际上包含字形信息,而不是文字。如果是这样,所有从 pdf 中提取文本的程序(如pdftotext)必须首先提取并定位各种字符,然后将它们分组为单词/行;所以我有点惊讶我找不到为每个字符输出位置的选项。转换为 svg 本质上给了我这一点,但在转换中,所有关于内容的信息(即,如果有连字,则将字形到字符或字形到字符的映射)丢失,因为不再有字体了。并且通过再次查看字体来重做将每个字形与字符匹配的工作感觉就像重写 pdf 解析器......

因此,我将非常感谢有关如何解决此问题的任何想法。这里的最佳答案表明这可能对 TET 是可行的,但它是一种付费选择,并且更换我的整个基础设施来处理一个限制情况似乎是一个很大的矫枉过正......

标签: parsingpdfsvgpdftotext

解决方案


PDF 文件不一定明确指定每个字符的位置。通常,它将文本分成一系列字符(我认为都使用相同的字体,最多一行),然后为每次运行指定边界框的位置,该边界框应包含这些字符的字形。所以每个字形的确切位置将取决于用于渲染它的字体的度量(主要是字形宽度)。

Python 包pdfminer有一个脚本pdf2txt.py。尝试使用-t xml. 文档只是说XML format. Provides the most information.但是我的笔记表明它将应用字体度量并<text>为每个字形提供一个元素,包括字体和边界框信息。

各个地方都有不同的版本(例如 PyPI 和 github)。如果您需要 Python 3 支持,请查找pdfminer.six.


推荐阅读