解析PDF文件并输出单个字符位置

时间:2019-05-16 16:02:57

标签: parsing pdf svg pdftotext

我正在尝试通过识别每个字符和每个单词的内容和位置,从(数字)PDF中提取文本信息。换句话说,xpdf / poppler中的pdftotext --bbox效果很好,但是我找不到提取字符位置的简便方法。

我尝试过的事情

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

问题

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

  • 在脚本字体(或某些极端斜体字体)中,边框比其内容大得多;结果,单词会大量重叠,并且很有可能一个字符完全包含在两个单词中。在这种情况下,映射会失败,因为一旦翻译为svg,我就无法知道哪个字形中包含哪个字符。
  • 在许多字体中,可以连接多个字符,从而产生一个字形。在这种情况下,字符框的数量与单词中的字符数不匹配,因此将每个字母与一个框匹配仍然是有问题的。

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

我希望的是

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

因此,对于任何解决此问题的想法,我将不胜感激。 The top answer here建议使用TET可以做到这一点,但这是一个付费的选择,而替换我的整个基础架构以处理一个极限情况似乎是一个大杀手......

1 个答案:

答案 0 :(得分:1)

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

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

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