pdfminer - 提取 LTFigure 对象后面的文本

pdfminer - extract text behind LTFigure object

我正在使用 python pdfminer 库(参见 docs)从 pdf 文件中提取文本。

然而,pdfminer 似乎无法提取某些文件中的所有文本,而是提取 LTFigure 对象。假设从该对象的位置来看,它“覆盖”了一些文本,因此不会提取该文本。

pdf 文件和带有从 pdf 中提取信息的代码的短 jupyter notebook 都在 Github 我专门为提出这个问题而创建的存储库中:

https://github.com/druskacik/ltfigure-pdfminer

我不是 pdf 文件如何工作的专家,但常识告诉我,如果我可以在浏览器中使用 control + f 查找文本,它应该是可提取的。

我考虑过使用其他一些库,但问题是我还需要提取单词的位置(以便将它们用于我的机器学习模型),这是只有 pdfminer 似乎提供的功能。

鉴于您还考虑了其​​他库,我建议使用 poppler-util 的 pdftohtml 将 pdf 转换为 xml:

!apt-get install -y poppler-utils
!pdftohtml -c -hidden -xml document.pdf output.xml

它将输出一个 xml 文件,其中包含框的文本和顶部、左侧、宽度和高度值。 pdfminer 无法识别的文本没有问题。

好的,所以我终于想出了解决方案。这非常简单 - 可以用与迭代相同的方式迭代 LTFigure 对象,例如LTTextBox 对象。

interpreter.process_page(page)
layout = device.get_result()

for lobj in layout:
    if isinstance(lobj, LTTextBox):
        for element in lobj:
            if isinstance(element, LTTextLine):
                text = element.get_text()
                print(text)

    elif isinstance(lobj, LTFigure):
        for element in lobj:
            if isinstance(element, LTChar):
                text = element.get_text()
                print(text)

请注意,正确的方法(以确保解析器读取文档中的所有内容)是递归地迭代 pdfminer 对象,如下所示:How does one obtain the location of text in a PDF with PDFMiner?