批量提取同版式PDF指定数据并写入DataFrame的技术问询
批量提取PDF红框金额并生成DataFrame方案
依赖库安装
先安装所需工具库:
pip install pymupdf pandas
核心实现逻辑
利用PyMuPDF读取PDF中的矩形注释(红框属于这类标注),定位对应区域的文本,结合版式一致性提取目标字段,最后遍历文件夹完成批量处理。
完整代码
import os import pandas as pd import fitz # PyMuPDF def extract_pdf_data(pdf_path): pdf_records = [] doc = fitz.open(pdf_path) for page in doc: annots = page.annots() if not annots: continue for annot in annots: # 筛选矩形标注(红框) if annot.type[0] == fitz.PDF_ANNOT_RECT: rect = annot.rect # 提取红框区域内的文本 text = page.get_textbox(rect).strip() # 根据固定版式解析字段,需按实际PDF格式调整分割规则 parts = text.split() if len(parts) >= 3: date = parts[0] department = ' '.join(parts[1:-1]) amount = parts[-1] # 转换金额为数值类型,处理千位分隔符 try: amount = float(amount.replace(',', '')) except ValueError: amount = None pdf_records.append({ 'Date': date, 'Department': department, 'Amount': amount }) doc.close() return pdf_records def batch_process_folder(folder_path): all_records = [] # 遍历文件夹内所有PDF文件 for filename in os.listdir(folder_path): if filename.lower().endswith('.pdf'): pdf_path = os.path.join(folder_path, filename) records = extract_pdf_data(pdf_path) all_records.extend(records) # 生成目标DataFrame并保存 df = pd.DataFrame(all_records, columns=['Date', 'Department', 'Amount']) df.to_csv('extracted_data.csv', index=False, encoding='utf-8-sig') df.to_excel('extracted_data.xlsx', index=False) return df # 替换为你的目标文件夹路径后执行 if __name__ == '__main__': target_folder = './pdf_files' result_df = batch_process_folder(target_folder) print(result_df.head())
关键调整说明
- 红框定位:若红框不是PDF标准注释,需提前测量红框在页面的固定坐标,替换为直接按坐标提取文本(例如
page.get_textbox(fitz.Rect(x0, y0, x1, y1)))。 - 文本解析:如果红框内的字段是分行显示,将
text.split()改为text.split('\n'),再按行分配对应字段。 - 金额处理:根据实际金额格式调整字符替换规则,比如处理货币符号、小数点格式等。
内容的提问来源于stack exchange,提问作者george99gr
相关产品推荐
相关产品推荐

