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.png | 12345678 | 2023-01-10 | 1500.00 | 225.00 |
invoice2.jpg | 87654321 | 2023-01-15 | 2500.00 | 375.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
,使我们能够高效地处理日常办公中的重复性工作。希望这篇文章能够帮助你更好地管理和处理发票数据!