Python自动化:开发发票识别工具,自动批量识别发票并汇总信息到Excel
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=["文件名", "发票编号", "开票日期", "金额", "税额"])
6. 结语
通过本教程,你学会了如何使用 Python 实现发票的自动化识别和批量处理,并将识别后的信息汇总到 Excel 中。
Python 提供了许多强大的工具,如 pytesseract 和 pandas,使我们能够高效地处理日常办公中的重复性工作。希望这篇文章能够帮助你更好地管理和处理发票数据!
如果你有任何疑问或改进建议,欢迎留言讨论!