如何使用PDFMiner获取PDF中文本的位置?

23 投票
1 回答
26831 浏览
提问于 2025-04-18 16:51

PDFMiner的说明书上说:

PDFMiner可以让你获取页面上文本的确切位置。

不过,我一直找不到具体怎么做。PDFMiner的说明书内容比较少,所以我没搞明白该怎么操作。

1 个回答

26

你在每个布局对象上寻找 bbox 属性。关于如何解析PDF中的布局结构,PDFMiner的文档里有一些信息,具体可以查看这个链接,不过它并没有涵盖所有内容。

这里有一个例子:

from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTTextBox, LTTextLine, LTFigure


def parse_layout(layout):
    """Function to recursively parse the layout tree."""
    for lt_obj in layout:
        print(lt_obj.__class__.__name__)
        print(lt_obj.bbox)
        if isinstance(lt_obj, LTTextBox) or isinstance(lt_obj, LTTextLine):
            print(lt_obj.get_text())
        elif isinstance(lt_obj, LTFigure):
            parse_layout(lt_obj)  # Recursive


fp = open('example.pdf', 'rb')
parser = PDFParser(fp)
doc = PDFDocument(parser)

rsrcmgr = PDFResourceManager()
laparams = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
for page in PDFPage.create_pages(doc):
    interpreter.process_page(page)
    layout = device.get_result()
    parse_layout(layout)

如果你对单个 LTChar 对象的位置感兴趣,可以像上面的例子中对 LTFigure 那样,递归地解析 LTTextBoxLTTextLine 的子布局对象。

撰写回答