Pdfminer разбора документов с макетом и bbox - PullRequest
0 голосов
/ 07 февраля 2020

Я использую pdfminer для анализа некоторых типов pdf (только для текста), таких как сертификаты степени и т. Д. c. Следовательно, для конкретного учреждения они остаются одинаковыми и могут различаться в разных учреждениях.

Поскольку я новичок в этом, я был бы признателен, если бы я мог получить какие-либо идеи о том, как анализировать различные объекты в макете (например, регистрация) число). Каковы различные способы синтаксического анализа или манипулирования ограничивающими прямоугольниками или какими-либо кривыми и т. Д. c.

Это может быть широким, но, учитывая документацию pdfminer, кажется, что это поможет другим пользователям. Ниже приведен пример кода, с которого я начал: -

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.layout import LAParams, LTTextBox, LTTextLine, LTImage, LTFigure
from pdfminer.converter import PDFPageAggregator
from pdfminer.converter import TextConverter
from pdfminer.converter import HTMLConverter
from io import StringIO

def get_layouts(pdf_doc):
    fp = open(pdf_doc, 'rb')
    parser = PDFParser(fp)
    doc = PDFDocument(parser)
    parser.set_document(doc)
    #print (doc.catalog)
    try:
        outlines = doc.get_outlines()
        for (level, title, dest, a, se) in outlines:
            print (' ' * level, title)
    except PDFNoOutlines:
        pass

    if not doc.is_extractable:
        raise PDFTextExtractionNotAllowed

    rsrcmgr = PDFResourceManager()
    laparams = LAParams()
    device = PDFPageAggregator(rsrcmgr, laparams=laparams)
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    text = ''
    for page in PDFPage.create_pages(doc):
        interpreter.process_page(page)
        layout = device.get_result()
        for lt_obj in layout:
            if isinstance(lt_obj, LTTextBox) or isinstance(lt_obj, LTTextLine):
                text += lt_obj.get_text()
        break
    return text
...