
对于经常处理报销的职场人士或财务人员来说,电子发票的汇总是一项重复性工作,耗时耗力。使用 Python 批量提取电子发票中的关键信息(如发票号码、开票日期、销售方信息、价税合计等),提升效率。
pip install pdfplumber pandas 1、PDF 文本提取:自动遍历文件夹中的所有PDF格式电子发票,使用Python库解析PDF文件内容。
2、正则表达式匹配:从文本中识别目标信息,精准识别发票号码、开票日期、销售方名称、纳税人识别号、价税合计等关键字段。。
3、数据导出:将提取结果整理为结构化表格(如Excel),便于后续统计或导入财务系统。

完整的 Python 类示例,实现电子发票信息的批量提取。
import pdfplumber
import re
import pandas as pd
import os
class InvoiceProcessor:
def __init__(self, pdf_folder):
self.pdf_folder = pdf_folder
self.invoice_list = []
def extract_text_from_pdf(self, pdf_path):
full_text = ""
try:
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
text = page.extract_text()
if text:
full_text += text + "\n"
return full_text
except Exception as e:
print(f"错误:无法读取文件 {pdf_path},原因:{e}")
return None
def parse_invoice_info(self, text):
data = {}
invoice_no_match = re.search(r'发票号码[::]?\s*([A-Za-z0-9]+)', text)
data["发票号码"] = invoice_no_match.group(1) if invoice_no_match else "未识别"
date_match = re.search(r'开票日期[::]?\s*(\d{4}[年-]\d{1,2}[月-]\d{1,2}日?)', text)
data["开票日期"] = date_match.group(1) if date_match else "未识别"
seller_match = re.search(
r'销\s*名称\s*[::]?\s*([^\n,,::\d]{4,}?(?:公司|有限))',
text, re.MULTILINE
)
data["销售方名称"] = seller_match.group(1).strip() if seller_match else "未识别"
tax_id_match = re.search(r'纳税人识别号[::]?\s*([A-Za-z0-9]{18})', text)
data["纳税人识别号"] = tax_id_match.group(1) if tax_id_match else "未识别"
total_match = re.search(r'价税合计[^¥]*¥\s*([0-9.,]+)', text)
data["价税合计"] = total_match.group(1).replace(',', '') if total_match else "未识别"
return data
def process_all_invoices(self):
for filename in os.listdir(self.pdf_folder):
if filename.endswith(".pdf"):
pdf_path = os.path.join(self.pdf_folder, filename)
print(f"处理文件:{filename}")
text = self.extract_text_from_pdf(pdf_path)
print(text)
if text:
info = self.parse_invoice_info(text)
info["文件名"] = filename # 记录来源文件
self.invoice_list.append(info)
else:
print(f"跳过文件(读取失败):{filename}")
def save_to_excel(self, output_path="发票汇总.xlsx"):
if self.invoice_list:
df = pd.DataFrame(self.invoice_list)
df.to_excel(output_path, index=False)
print(f"数据已导出至:{output_path}")
else:
print("无数据可导出")
if __name__ == "__main__":
processor = InvoiceProcessor("E:\BXTY2000000023102194") # 指定发票PDF所在文件夹
processor.process_all_invoices()
processor.save_to_excel()代码说明:
在实际应用中,可能会遇到以下问题:
1、发票格式多样性:不同企业的发票模板可能缺失固定关键词或使用别名(如“税号”替代“纳税人识别号”)。解决方案是扩展正则表达式模式,例如添加多个备选匹配规则:
# 示例:兼容多种表述
tax_id_patterns = [
r'纳税人识别号[::]\s*(\w{18})',
r'税号[::]\s*(\w{18})',
r'信用代码[::]\s*(\w{18})'
]
for pattern in tax_id_patterns:
match = re.search(pattern, text)
if match:
data["纳税人识别号"] = match.group(1)
break2、PDF 文本质量:部分发票可能为扫描版或包含图片,导致文本提取失败。可考虑结合 OCR 库处理图像内容。
3、批量处理效率:对于上百个文件,可引入多线程加速处理。
通过Python批量处理电子发票将手工耗时数小时的工作压缩至几分钟内完成,显著提升效率。
“无他,惟手熟尔”!有需要的用起来!更多Python阅读在首页。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!