pdfminer:根据字体大小仅提取文本

pdfminer: extract only text according to font size

我只想从我的 pdf 文件中提取字体大小为 9.80000000000006810.000000000000057 的文本。 下面的代码 returns 一个 pdf 文件的每个文本块及其字符的字体大小列表。

Extract_Data=[]
for page_layout in extract_pages(path):
    print(page_layout)
    for element in page_layout:
        if isinstance(element, LTTextContainer):
            for text_line in element:
                for character in text_line:
                    if isinstance(character, LTChar):
                        Font_size=character.size
            Extract_Data.append([Font_size,(element.get_text())])

给我一个 Extract_Data 列表,其中包含各种字体大小

[[9.800000000000068, 'aaa\n'], [11.0, 'dffg\n'], [10.000000000000057, 'bbb\n'], [10.0, 'hs\n'], [8.0, '2\n']]

示例:字体大小10.000000000000057

Extract_Data=[]
for page_layout in extract_pages(path):
    print(page_layout)
    for element in page_layout:
        if isinstance(element, LTTextContainer):
            for text_line in element:
                for character in text_line:
                    if isinstance(character, LTChar):
                        if character.size == '10.000000000000057':
                            element.get_text()
                Extract_Data.append(element.get_text())
                Data = ''.join(map(str, Extract_Data))

给了我一个包含所有文本的 Data 列表。我怎样才能让它只提取字体大小 '10.000000000000057' 个字符?

['aaa\ndffg\nbbb\nhs\n2\n']

我还想集成到一个函数中,该函数对多个文件执行此操作,从而生成一个 pandas df,每个 pdf 有一行。 期望的输出:[['aaa\n bbb\n']]。按照 eksewhere 的建议将像素转换为点 (int(character.size) * 72 / 96) 没有帮助。也许这与此有关? https://github.com/pdfminer/pdfminer.six/issues/202

这是后面要集成的功能:

directory = 'C:/Users/Sample/'
resource_manager = PDFResourceManager()
for file in os.listdir(directory):
    if not file.endswith(".pdf"):
        continue
    fake_file_handle = io.StringIO()
    manager = PDFResourceManager()
    device = PDFPageAggregator(manager, laparams=params)
    interpreter = PDFPageInterpreter(manager, device)
    device = TextConverter(interpreter, fake_file_handle, laparams=LAParams())
    params = LAParams(detect_vertical=True, all_texts=True)
    elements = []
    with open(os.path.join(directory, file), 'rb') as fh:
        parser = PDFParser(fh)
        document = PDFDocument(parser, '')
        if not document.is_extractable:
            raise PDFTextExtractionNotAllowed

        for page in enumerate (PDFPage.create_pages(document)):
            for element in page:

Pdfminer 是错误的工具。

使用 pdfplumber(在后台使用 pdfminer)而不是 https://github.com/jsvine/pdfplumber,因为它具有过滤对象的实用功能(例如,根据您尝试执行的字体大小),而 pdfminer 是主要用于获取所有文本。

import pdfplumber

def get_filtered_text(file_to_parse: str) -> str:
    with pdfplumber.open(file_to_parse) as pdf: 
        text = pdf.pages[0]
        clean_text = text.filter(lambda obj: not (obj["object_type"] == "char" and obj["size"] != 9))
        print(clean_text.extract_text())

get_filtered_text("./my_pdf.pdf")

我上面的例子比你的简单,因为它只检查字体大小 9.0,而你有

9.800000000000068 and 10.000000000000057

所以 obj["size"] 条件在你的情况下会更复杂

obj["size"] 的数据类型为 Decimal (from decimal import Decimal),因此您可能必须执行类似 obj["size"].compare(Decimal(9.80000000068)) == 0

的操作