使用 pdfminer.six 检测垂直文本元素(不仅仅是文本内容)

Detecting vertical text elements (not just text content) with pdfminer.six

我在尝试检测 pdfminer.six 中的垂直文本元素时遇到了一个简单的问题。使用如下代码片段,我可以毫无问题地阅读垂直文本:

output_string = StringIO()
with open('../example_files/example1.pdf', 'rb') as infi:
    parser = PDFParser(infi)
    doc = PDFDocument(parser)
    rsrcmgr = PDFResourceManager()
    device = TextConverter(rsrcmgr, output_string, laparams=LAParams(detect_vertical=True, all_texts=True))
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.create_pages(doc):
        interpreter.process_page(page)
print(output_string.getvalue())

但是,每当我尝试使用 PDFPageAggregator 而不是 TextConverter 以便我可以获得对象时,就像这样:

with open('../example_files/example1.pdf', 'rb') as infi:
    parser = PDFParser(infi)
    doc = PDFDocument(parser)
    rsrcmgr = PDFResourceManager()
    device = PDFPageAggregator(rsrcmgr, laparams=LAParams(detect_vertical=True, all_texts=True))
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.create_pages(doc):
        interpreter.process_page(page)
        layout = device.get_result()
        for element in page_layout:
            print(element)

我将捕获水平文本框(以及线条、矩形等),但不会捕获垂直文本。有没有办法让我在对象层次结构级别捕获垂直文本,以便我可以检查它的位置?

我花了一段时间才弄明白这一点,但关键是意识到文本元素可以是 LTImage 对象的子元素。我没有意识到这一点,也没有意识到我需要递归迭代 LTImage 对象的子对象才能找到所有内容。