求助Python操作pdf读取数据输入excel中

查看 75|回复 9
作者:980041382   
需要处理的eg pdf在这里:https://wwwc.lanzoub.com/iEaI20qu3n9c
[color=]这是我目前写的代码
[Python] 纯文本查看 复制代码import fitz
import re
import os
import pandas as pd
from tqdm import tqdm
def extract_text_from_pdf(pdf_file):
    try:
        doc = fitz.open(pdf_file)
    except fitz.EmptyFileError:
        print(f"跳过空文件: {pdf_file}")
        return ""
    text = ''
    for page_num in range(doc.page_count):
        page = doc.load_page(page_num)
        text += page.get_text()
    return text
def extract_data_from_text(text, pattern, table_pattern):
    matches = list(re.finditer(pattern, text))
    table_matches = list(re.finditer(table_pattern, text))
    if not matches:
        return 0
    for match in matches:
        for table_match in table_matches:
            if table_match.start()

[color=]我想要pdf里面的本期增加添加到excel表格中,但是它可能识别到关键词在文中出现了两次就填了2

[color=]这个住房公积金同样没有读取到


[color=]这个更是明明pdf里面有的 都没有搜到
求求大佬帮我实现帮我抓取pdf中表格栏里面,本期增加对应的值

费用, 微软

980041382
OP
  

@Ryan_XQ @柒點 @枫MapleLCG 帮我审核一下贴子
980041382
OP
  

我选的图床好垃圾啊。。图片都显示不了。。。三个图片链接分别是https://www.imagehub.cc/image/pU617
https://www.imagehub.cc/image/pU0p6
https://www.imagehub.cc/image/pUlsk
pzx521521   

你是先将所有的转换为文字再提取, 这样表格的数据就很难提取出对应的格式,
特别是你的 extract_data_from_text 并不适合所有的方法
1.要么对所有不适合的做特殊处理
2.要么换一种提取方式,不要用文字提取
以表格  提取社会保险费的本期增加  为例:
[Python] 纯文本查看 复制代码import pdfplumber
def getFieldVal(table, findField, findVal, getField):
    ans = ''
    if findField in table[0] and getField in table[0]:
        iField = table[0].index(findField)
        iGetField = table[0].index(getField)
        for i in range(1, len(table)):
            if table[i][iField] == findVal:
                ans = table[i][iGetField]
    return ans
if __name__ == '__main__':
    pdf = pdfplumber.open("./data1/2015GQY视讯.PDF")
    page = pdf.pages[129]
    tables = page.extract_tables()
    for table in tables:
        val = getFieldVal(table,'项目','3、社会保险费', '本期增加')
        if val != '':
            print(val)
            break
更精确的找法 应该是
先找到表标题 找到表,  然后在用行列定位:
如  以  提取社会保险费的本期增加 为例:
通过  短期薪酬列示 找到表
通过  "项目" "3、社会保险费" "本期增加"
获取到值
980041382
OP
  


pzx521521 发表于 2023-3-23 10:16
你是先将所有的转换为文字再提取, 这样表格的数据就很难提取出对应的格式,
特别是你的 extract_data_from ...

哎主要我有两万多份财报。pdf肯定格式千奇百怪。但是转换成文字再提取的话就比较万金油,老哥能写个完整版的看看吗
980041382
OP
  


pzx521521 发表于 2023-3-23 10:16
你是先将所有的转换为文字再提取, 这样表格的数据就很难提取出对应的格式,
特别是你的 extract_data_from ...

[Asm] 纯文本查看 复制代码import os
import pandas as pd
import pdfplumber
from tqdm import tqdm
def extract_tables_from_pdf(pdf_file):
    with pdfplumber.open(pdf_file) as pdf:
        tables = []
        for page in pdf.pages:
            tables += page.extract_tables()
        return tables
def get_field_value(table, find_field, find_val, get_field):
    if find_field in table[0] and get_field in table[0]:
        field_index = table[0].index(find_field)
        get_field_index = table[0].index(get_field)
        for row in table[1:]:
            if row[field_index] == find_val:
                return row[get_field_index]
    return None
def parse_filename(filename):
    year = filename[:4]
    company = filename[4:].replace(".PDF", "")
    return year, company
keywords = [
    "温室气体减排费用",
    "减排费用",
    "减排设备",
    "环保装备折旧",
    "污染物减排费用",
    "环境污染责任保险投保费用",
    "节水费用",
    "节水设备",
    "节水装备折旧",
    "节能费用",
    "节能设备",
    "节能设备折旧",
    "绿色生产超额费用",
    "绿色办公超额费用",
    "绿色采购费用",
    "绿色建设费用",
    "非财务报告鉴证费用",
    "审计费用",
    "营业收入",
    "社会保险费",
    "住房公积金",
    "基本养老保险",
    "失业保险费",
    "离职后福利-设定提存计划",
    "辞退福利",
    "短期带薪缺勤",
    "工会经费和职工教育经费",
    "职工福利费",
    "产品质量保证",
    "售后服务费",
    "对外捐赠",
    "捐赠支出",
    # ... 在此处添加其余的关键字
]
folder_path = "D:\data1"
pdf_files = [file for file in os.listdir(folder_path) if file.endswith(".PDF")]
data = pd.DataFrame(columns=["公司名称", "年份"] + keywords)
for pdf_file in tqdm(pdf_files, desc="处理 PDF 文件"):
    year, company = parse_filename(pdf_file)
    tables = extract_tables_from_pdf(os.path.join(folder_path, pdf_file))
    extracted_data = []
    for keyword in keywords:
        value = None
        for table in tables:
            value = get_field_value(table, "项目", keyword, "本期增加")
            if value:
                break
        extracted_data.append(float(value.replace(',', '')) if value else 0)
    data = data.append(
        pd.Series([company, year] + extracted_data, index=data.columns), ignore_index=True
    )
data.to_csv("financial_report_data1.csv", index=False, encoding="utf-8-sig")
按照你的思路 我写了版 可获取到的数据值是空的
980041382
OP
  

有没有具有方法通用性高一点的呢
pzx521521   


980041382 发表于 2023-3-23 10:48
哎主要我有两万多份财报。pdf肯定格式千奇百怪。但是转换成文字再提取的话就比较万金油,老哥能写个完整 ...

千奇百怪 没有办法的
或许你需要自己训练一个ai...
980041382
OP
  


pzx521521 发表于 2023-3-23 11:17
千奇百怪 没有办法的
或许你需要自己训练一个ai...

那具体到这个表格该怎么实现呀
980041382
OP
  


pzx521521 发表于 2023-3-23 11:17
千奇百怪 没有办法的
或许你需要自己训练一个ai...

我上面回复你的那个代码 也是提取出表格来,然后处理最后还是为0
您需要登录后才可以回帖 登录 | 立即注册