【问题标题】:Extract PDF Pages based on Header text in Python基于Python中的标题文本提取PDF页面
【发布时间】:2022-01-21 13:51:58
【问题描述】:

我有一份“亚洲涂料有限公司”的年度报告 pdf。我想提取“合并资产负债表页面”(PDF 中的第 216 页)。我使用 PyPDF 并创建了一个函数来提取所有文本,搜索关键术语“合并资产负债表”,并返回找到它的页码。

但是,我希望我的函数将其中包含“合并资产负债表”一词的一页识别为带有所需表格的 标题(也称为此 pdf 中的第 216 页)。

这是我的代码:

import PyPDF2
import re

def extract_page_num(keyTerm):
    
    # Open pdf
    object = PyPDF2.PdfFileReader("D:\AR_18126_ASIANPAINT_2020_2021_07062021194954.pdf")

    # get number of pages
    NumPages = object.getNumPages()

    # extract page number
    for i in range(0, NumPages):
        PageObj = object.getPage(i)
        Text = PageObj.extractText()
        Text = Text.replace('˜','fi')
        reSearch = re.findall(keyTerm, Text)
        if reSearch:
            #print("Page Number is " + str(i))
            #print(reSearch)
            return i
            
bs_no = extract_page_num('Consolidated Balance Sheet')

这是年度报告的链接:https://www.bseindia.com/bseplus/AnnualReport/500820/68521500820.pdf

提前感谢您抽出时间来解决我的问题!

【问题讨论】:

    标签: python pdf ocr finance pypdf


    【解决方案1】:

    选项 1 在不去提取格式信息的范围内,也许只是扩展您的搜索模式以使其更加独特会有所帮助。 例如,您可以查看提取的页面文本,并看到它位于开头附近,前面是 [page] 编号,后面是 '\nas at' 和日期。 我发现只需将搜索更改为即可找到正确的页面;

    bs_no = extract_page_num('Consolidated Balance Sheet\nas at')
    

    但是,对于所有情况,这可能不够准确。

    选项2 如果您想使用字体大小/名称等格式,您可以尝试使用 pdfplumber。这种类型的搜索会更长。

    我尝试了字体名称和字体大小; 两个pdf上的字体都不一致,字体大小也不一致。 标题的字体大小总是会更大,所以它可能是所有需要使用的。

    以下代码提取带有格式数据的单词我在提取的信息中包含字体大小/名称然后提取字体大小在 20 到 24 磅之间的文本,示例 pdf 中一个是 22,另一个是 20,然后在文本中搜索 keyTerm。

    这适用于您提供的两个 pdf 示例,但它可能需要调整或包含其他标准才能完全有效。

    import json
    import pdfplumber
    import re
    
    
    pdf1 = '68521500820.pdf'
    pdf2 = '68366500425.pdf'
    keyTerm = 'Consolidated Balance Sheet'
    with pdfplumber.open(pdf1) as pdf:
    
        for i in range(len(pdf.pages)):
            word_data = pdf.pages[i].extract_words(extra_attrs = ['fontname', 'size'])
            json_text = json.loads(json.dumps(word_data))
    
            head_text = ''
            for wt in range(len(json_text)):
                if 20 <= json_text[wt]['size'] <= 24:
                    head_text += json_text[wt]['text'] + ' '
    
            if re.findall(keyTerm, head_text.strip()):
                print("Page " + str(i + 1))
                print(head_text)
    
    
    print("")
    

    【讨论】:

    • 感谢您的回复。我已经尝试过了,它有效(并非在所有情况下)。就像你对bseindia.com/bseplus/AnnualReport/500425/68366500425.pdf 应用相同的一样。我想要一种方法让函数识别 re.findall 匹配的文本是标题并相应地提取页码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多