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

Parsing 解析PDF文件并输出单字符位置,parsing,pdf,svg,pdftotext,Parsing,Pdf,Svg,Pdftotext,我试图通过识别每个字符和单词的内容和位置,从(数字)PDF中提取文本信息。换句话说,xpdf/poppler中的pdftotext--bbox非常有效,但我找不到一种简单的方法来提取字符位置 我尝试过的 我目前的解决方案是将pdf转换为svg(通过pdf2svg),然后解析生成的svg以提取单个字符(=glyph)位置。在第三步中,比较结果框,将每个字符分配给一个单词,希望数字匹配 问题 虽然上述方法适用于大多数“基本”字体,但有两种(主要)情况下这种方法失败: 在脚本字体(或某些极端斜体字体

我试图通过识别每个字符和单词的内容和位置,从(数字)PDF中提取文本信息。换句话说,xpdf/poppler中的
pdftotext--bbox
非常有效,但我找不到一种简单的方法来提取字符位置

我尝试过的

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

问题

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

  • 在脚本字体(或某些极端斜体字体)中,边界框比其内容大得多;因此,单词之间会有明显的重叠,一个字符完全包含在两个单词中是很有可能的。在这种情况下,映射失败,因为一旦我转换为svg,我就没有关于哪个glyph中包含哪个字符的信息
  • 在许多字体中,可以连接多个字符,从而产生一个字形。在这种情况下,字符框的计数与单词中的字符数不匹配,将每个字母匹配到一个框也是有问题的
第二点(对我来说是主要的一点)有一个部分解决方法,通过识别公共连字和(如果计数不匹配)将相应的边界框拆分为多个部分;但这并不总是可行的,因为例如“ffi”有时被连接到单个字形,有时被连接到两个字形“ff”+“i”,有时被连接到两个字形“f”+“fi”,具体取决于字体

我希望的

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


因此,如果你能想出解决这个问题的办法,我将不胜感激。这表明这在TET中可能是可行的,但这是一个付费的选项,而将我的整个基础结构替换为只处理一个限制情况似乎是一个很大的过度…

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

Python包pdfminer有一个脚本
pdf2txt.py
。尝试使用
-t xml
调用它。文档只是说
XML格式。提供了最多的信息。
但我的注释表明,它将应用字体度量,并为每个glyph提供一个
元素,其中包含字体和边框信息


在不同的地方有不同的版本(例如PyPI和github)。如果需要Python3支持,请查找pdfminer.six。PDF文件不一定明确指定每个字符的位置。通常,它会将一个文本拆分为多个字符(我认为所有字符都使用相同的字体,最多一行),然后为每个字符指定边界框的位置,该边界框应包含这些字符的图示符。因此,每个字形的确切位置将取决于用于渲染它的字体的度量(主要是字形宽度)

Python包pdfminer有一个脚本
pdf2txt.py
。尝试使用
-t xml
调用它。文档只是说
XML格式。提供了最多的信息。
但我的注释表明,它将应用字体度量,并为每个glyph提供一个
元素,其中包含字体和边框信息


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

我尝试了
pdfminer.six
,实际上它为每个单独的glyph输出一个bbox(在我的例子中,由于所有pdf都是自动生成的,所以它实际上是其中的一个字符或连字)。所以,这就成功了!我尝试了
pdfminer.six
,实际上它为每个单独的glyph输出一个bbox(在我的例子中,由于所有的pdf都是自动生成的,所以实际上是其中的一个字符或连字)。所以,这就成功了!