1. 前言

在企业的日常运营中,发票管理是一项非常重要的工作。对于财务人员来说,手动识别和录入大量发票信息不仅耗时耗力,而且容易出错。而使用 Python 自动化发票识别工具,可以大大提升发票处理的效率,并将识别后的信息自动汇总到 Excel 中,方便后续的数据分析和管理。本文将教你如何使用 Python 搭建一个简单的发票识别工具,并实现批量识别和信息汇总。

2. 准备工作

2.1 安装必要的库

我们将使用以下几个 Python 库来实现发票识别和信息处理:

  • pytesseract:用于图像文字识别 (OCR)。
  • opencv-python:用于图像处理。
  • pandas:用于数据处理和汇总。
  • openpyxl:用于将数据写入 Excel。

在命令行或终端中运行以下命令来安装这些库:

pip install pytesseract opencv-python pandas openpyxl

另外,pytesseract 依赖于 Tesseract-OCR 引擎,你需要先下载并安装 Tesseract-OCR(https://github.com/ub-mannheim/tesseract/wiki)(Windows 用户可以安装 .exe 文件)。

2.2 设置 Tesseract 路径

安装 Tesseract 后,请在代码中指定其安装路径(Windows 用户),以便 pytesseract 能够正常使用:

import pytesseract

# 指定 Tesseract-OCR 安装路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

3. 编写发票识别工具

接下来,我们将编写一个工具来批量识别存放在同一个文件夹中的发票图像,并将识别后的信息提取出来。

3.1 编写发票识别代码

以下代码展示了如何使用 pytesseract 识别发票中的关键信息,并将结果存储到 Excel 文件中:

import pytesseract
import cv2
import pandas as pd
import os

# 设置发票图像文件夹路径
invoice_folder = 'invoices/'  # 替换为你的发票图像文件夹路径

# 初始化一个空的 DataFrame 用于存储识别结果
invoice_data = pd.DataFrame(columns=["文件名", "发票编号", "开票日期", "金额", "税额"])

# 遍历文件夹中的所有图像文件
for file in os.listdir(invoice_folder):
    if file.endswith('.png') or file.endswith('.jpg') or file.endswith('.jpeg'):
        file_path = os.path.join(invoice_folder, file)
        
        # 使用 OpenCV 读取图像
        img = cv2.imread(file_path)

        # 使用 pytesseract 识别图像中的文字
        text = pytesseract.image_to_string(img, lang='chi_sim')

        # 提取发票中的关键信息(简单示例:根据关键词提取)
        invoice_number = None
        invoice_date = None
        amount = None
        tax = None

        # 查找关键字段(可以根据发票格式进行正则表达式匹配)
        for line in text.split('\n'):
            if "发票编号" in line:
                invoice_number = line.split(":")[-1].strip()
            elif "开票日期" in line:
                invoice_date = line.split(":")[-1].strip()
            elif "金额" in line:
                amount = line.split(":")[-1].strip()
            elif "税额" in line:
                tax = line.split(":")[-1].strip()

        # 将识别到的信息存储到 DataFrame 中
        invoice_data = invoice_data.append({
            "文件名": file,
            "发票编号": invoice_number,
            "开票日期": invoice_date,
            "金额": amount,
            "税额": tax
        }, ignore_index=True)

# 查看识别结果
print(invoice_data)

# 将识别结果保存为 Excel 文件
invoice_data.to_excel('invoice_summary.xlsx', index=False)
  • 3.2 代码说明
  • 读取图像:使用 opencv 的 cv2.imread() 方法逐个读取文件夹中的发票图像文件。
  • 识别文字:使用 pytesseract.image_to_string() 方法将图像中的文字内容转换为字符串格式。
  • 提取关键信息:通过查找关键字段(如“发票编号”、“开票日期”等),提取发票中的重要信息。
  • 保存结果:使用 pandas 将识别到的数据保存到 invoice_summary.xlsx 中,便于后续查看和分析。

3.3 结果示例

运行上述代码后,你将会在 invoice_summary.xlsx 文件中看到类似以下的结果:

文件名发票编号开票日期金额税额
invoice1.png123456782023-01-101500.00225.00
invoice2.jpg876543212023-01-152500.00375.00

4. 高级功能:使用正则表达式提高识别精度

在实际使用中,由于发票格式多样,直接通过字符串查找关键信息可能不够准确。为了提高识别的精度,我们可以使用 re(正则表达式)来更精准地定位和提取数据。

以下代码展示了如何使用正则表达式来匹配发票中的信息:

import re

# 使用正则表达式提取发票信息
invoice_number = re.search(r'发票编号[::]\s*(\d+)', text)
invoice_date = re.search(r'开票日期[::]\s*([\d-]+)', text)
amount = re.search(r'金额[::]\s*(\d+\.\d{2})', text)
tax = re.search(r'税额[::]\s*(\d+\.\d{2})', text)

# 获取匹配结果(如果存在匹配则取第一个分组)
invoice_number = invoice_number.group(1) if invoice_number else None
invoice_date = invoice_date.group(1) if invoice_date else None
amount = amount.group(1) if amount else None
tax = tax.group(1) if tax else None

通过使用正则表达式匹配,可以更好地适应不同格式的发票文本,从而提高识别的准确性。

5. 一键搞定发票识别和汇总

通过将上述步骤整合到一个自动化脚本中,我们可以轻松实现一键批量处理所有发票的目标。

以下是完整的代码:

import pytesseract
import cv2
import pandas as pd
import os
import re

# 设置 Tesseract-OCR 安装路径(Windows 用户)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# 设置发票图像文件夹路径
invoice_folder = 'invoices/'

# 初始化一个空的 DataFrame 用于存储识别结果
invoice_data = pd.DataFrame(columns=["文件名", "发票编号", "开票日期", "金额", "税额"])

# 遍历文件夹中的所有图像文件
for file in os.listdir(invoice_folder):
    if file.endswith('.png') or file.endswith('.jpg') or file.endswith('.jpeg'):
        file_path = os.path.join(invoice_folder, file)
        img = cv2.imread(file_path)
        text = pytesseract.image_to_string(img, lang='chi_sim')

        # 使用正则表达式提取信息
        invoice_number = re.search(r'发票编号[::]\s*(\d+)', text)
        invoice_date = re.search(r'开票日期[::]\s*([\d-]+)', text)
        amount = re.search(r'金额[::]\s*(\d+\.\d{2})', text)
        tax = re.search(r'税额[::]\s*(\d+\.\d{2})', text)

        # 获取匹配结果
        invoice_number = invoice_number.group(1) if invoice_number else None
        invoice_date = invoice_date.group(1) if invoice_date else None
        amount = amount.group(1) if amount else None
        tax = tax.group(1) if tax else None

        # 将信息存入 DataFrame
        invoice_data = invoice_data.append({
            "文件名": file,
            "发票编号": invoice_number,
            "开票日期": invoice_date,
            "金额": amount,
            "税额": tax
        }, ignore_index=True)

# 保存结果到 Excel
invoice_data.to_excel('invoice_summary.xlsx', index=False)

6. 结语

通过本教程,你学会了如何使用 Python 实现发票的自动化识别和批量处理,并将识别后的信息汇总到 Excel 中。

Python 提供了许多强大的工具,如 pytesseract 和 pandas,使我们能够高效地处理日常办公中的重复性工作。希望这篇文章能够帮助你更好地管理和处理发票数据!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。