如何用Python自动化从批量PDF发票提取指定值并写入Excel?
批量PDF发票提取数据至Excel的Python实现
完全可以用Python实现这个自动化任务,尤其适合处理上百份PDF发票的场景。下面是一套可落地的实现方案,核心用到pdfplumber(精准提取PDF文本)和pandas(高效处理并写入Excel)两个库。
前置准备
先安装依赖库:
pip install pdfplumber pandas
完整代码实现
import os import re import pdfplumber import pandas as pd def extract_invoice_data(pdf_path): """从单份PDF发票中提取目标数据""" invoice_data = { "发票编号": "", "开票日期": "", "总金额": "", "供应商名称": "" } with pdfplumber.open(pdf_path) as pdf: # 读取第一页(多数发票核心信息在第一页) first_page = pdf.pages[0] text = first_page.extract_text() # 用正则匹配目标字段,需根据你的发票格式调整正则表达式 # 示例:匹配发票编号(格式如"发票编号: 12345678") inv_num_match = re.search(r"发票编号:\s*(\w+)", text) if inv_num_match: invoice_data["发票编号"] = inv_num_match.group(1) # 匹配开票日期(格式如"开票日期: 2024-05-20") date_match = re.search(r"开票日期:\s*(\d{4}-\d{2}-\d{2})", text) if date_match: invoice_data["开票日期"] = date_match.group(1) # 匹配总金额(格式如"总金额: ¥1234.56") total_match = re.search(r"总金额:\s*¥(\d+\.\d{2})", text) if total_match: invoice_data["总金额"] = float(total_match.group(1)) # 匹配供应商名称(格式如"供应商: XX科技有限公司") vendor_match = re.search(r"供应商:\s*(.+)", text) if vendor_match: invoice_data["供应商名称"] = vendor_match.group(1) return invoice_data def batch_process_invoices(folder_path, output_excel): """批量处理指定文件夹下的所有PDF发票""" all_invoice_data = [] # 遍历文件夹下的所有PDF文件 for filename in os.listdir(folder_path): if filename.endswith(".pdf"): pdf_full_path = os.path.join(folder_path, filename) print(f"正在处理: {filename}") data = extract_invoice_data(pdf_full_path) data["文件名"] = filename # 保留原文件名便于核对 all_invoice_data.append(data) # 将数据转换为DataFrame并写入Excel df = pd.DataFrame(all_invoice_data) df.to_excel(output_excel, index=False, encoding="utf-8") print(f"处理完成!结果已保存至: {output_excel}") # 主程序入口 if __name__ == "__main__": # 替换为你的PDF发票文件夹路径 INVOICE_FOLDER = "./invoices" # 替换为输出Excel的路径 OUTPUT_EXCEL = "./发票汇总.xlsx" batch_process_invoices(INVOICE_FOLDER, OUTPUT_EXCEL)
关键说明
- 正则表达式调整:代码中的正则是通用示例,实际要根据你的发票具体格式修改(比如有些发票的字段名是"发票号码"而不是"发票编号",金额符号可能是"$")。可以先提取单份发票的文本,打印出来后针对性编写正则。
- 复杂PDF处理:如果遇到扫描版PDF(图片转的PDF),
pdfplumber无法提取文本,需要结合OCR工具如pytesseract,先将PDF转图片再识别文本。 - 测试先行:批量处理前,先拿1-2份发票测试
extract_invoice_data函数,确保能正确提取数据后再跑批量。
内容的提问来源于stack exchange,提问作者Vikrant
相关产品推荐
相关产品推荐

