首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python 自动化办公中批量提取电子发票的信息,提升效率

Python 自动化办公中批量提取电子发票的信息,提升效率

作者头像
用户11081884
发布2026-07-20 18:52:04
发布2026-07-20 18:52:04
840
举报

对于经常处理报销的职场人士或财务人员来说,电子发票的汇总是一项重复性工作,耗时耗力。使用 Python 批量提取电子发票中的关键信息(如发票号码、开票日期、销售方信息、价税合计等),提升效率。

安装依赖库

代码语言:javascript
复制
  pip install pdfplumber pandas 

实现批量提取的步骤:

1、PDF 文本提取:自动遍历文件夹中的所有PDF格式电子发票,使用Python库解析PDF文件内容。

2、正则表达式匹配:从文本中识别目标信息,精准识别发票号码、开票日期、销售方名称、纳税人识别号、价税合计等关键字段。。

3、数据导出:将提取结果整理为结构化表格(如Excel),便于后续统计或导入财务系统。

代码示例

完整的 Python 类示例,实现电子发票信息的批量提取。

代码语言:javascript
复制
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()

代码说明:

  • PDF 读取:extract_text_from_pdf 方法使用 pdfplumber 逐页提取文本,避免内存溢出。
  • 正则表达式设计:模式基于常见发票格式,如“发票号码:”后接字符序列。通过分组捕获目标值。
  • 错误处理:添加 try-except 块,确保单文件失败不影响整体流程。
  • 数据导出:利用 pandasto_excel 方法快速生成表格,自动处理列对齐。

在实际应用中,可能会遇到以下问题:

1、发票格式多样性:不同企业的发票模板可能缺失固定关键词或使用别名(如“税号”替代“纳税人识别号”)。解决方案是扩展正则表达式模式,例如添加多个备选匹配规则:

代码语言:javascript
复制
# 示例:兼容多种表述
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)
        break

2、PDF 文本质量:部分发票可能为扫描版或包含图片,导致文本提取失败。可考虑结合 OCR 库处理图像内容。

3、批量处理效率:对于上百个文件,可引入多线程加速处理。

通过Python批量处理电子发票将手工耗时数小时的工作压缩至几分钟内完成,显著提升效率。

“无他,惟手熟尔”!有需要的用起来!更多Python阅读在首页

如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装依赖库
  • 实现批量提取的步骤:
  • 代码示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档