Python增值税发票批量识别与表格导出工具(EXE版)
2025.09.18 16:39浏览量:0简介:本文详细介绍如何使用Python实现增值税发票批量识别并导出为Excel表格,最终打包成独立EXE文件,解决非技术人员部署难题。包含OCR技术选型、发票信息解析、表格生成及PyInstaller打包全流程。
Python实现增值税发票批量识别和导出到表格(已打包成exe)
一、项目背景与需求分析
在财务工作中,增值税发票的批量识别与数据整理是高频且耗时的任务。传统方式依赖人工录入,存在效率低、易出错等问题。通过自动化技术实现发票批量识别与数据导出,可显著提升工作效率。本文将介绍如何使用Python开发一个完整的解决方案,包含OCR识别、信息解析、Excel导出及EXE打包,使非技术人员也能轻松使用。
二、技术选型与工具准备
OCR引擎选择:
- Tesseract OCR:开源免费,支持中文识别,需训练发票专用模型
- EasyOCR:基于深度学习,内置中文模型,识别准确率高
- 百度OCR/阿里OCR:商业API,识别率高但需付费
本文选用EasyOCR,因其平衡了识别准确率与使用便捷性。
依赖库安装:
pip install easyocr pandas openpyxl pyinstaller
开发环境:
- Python 3.8+
- Windows/Linux/macOS(打包后仅EXE需Windows)
三、核心功能实现
1. 发票图像预处理
import cv2
import numpy as np
def preprocess_invoice(image_path):
# 读取图像
img = cv2.imread(image_path)
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化处理
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 降噪
denoised = cv2.fastNlMeansDenoising(binary, None, 10, 7, 21)
return denoised
预处理步骤提升OCR识别率,特别针对扫描件或低质量图片。
2. 发票信息识别与解析
import easyocr
import re
def extract_invoice_data(image_path):
# 初始化EasyOCR阅读器(中文+数字)
reader = easyocr.Reader(['ch_sim', 'en'])
# 识别文本
results = reader.readtext(image_path)
# 初始化数据字典
invoice_data = {
'发票号码': '',
'开票日期': '',
'购买方名称': '',
'销售方名称': '',
'金额': '',
'税额': '',
'价税合计': ''
}
# 定义关键词匹配模式
patterns = {
'发票号码': r'发票号码[::]?\s*(\S+)',
'开票日期': r'开票日期[::]?\s*(\d{4}[-/]\d{1,2}[-/]\d{1,2})',
'购买方名称': r'购买方名称[::]?\s*([^\n]+)',
'销售方名称': r'销售方名称[::]?\s*([^\n]+)',
'金额': r'金额[::]?\s*(\d+\.\d{2})',
'税额': r'税额[::]?\s*(\d+\.\d{2})',
'价税合计': r'价税合计(大写)?[::]?\s*(\d+\.\d{2})'
}
# 提取识别结果中的文本
texts = [result[1] for result in results]
combined_text = '\n'.join(texts)
# 填充数据字典
for field, pattern in patterns.items():
match = re.search(pattern, combined_text)
if match:
invoice_data[field] = match.group(1).strip()
return invoice_data
通过关键词匹配与正则表达式,从OCR结果中提取结构化数据。
3. 批量处理与Excel导出
import pandas as pd
import os
def batch_process_invoices(input_folder, output_excel):
# 获取输入文件夹中所有图片
image_files = [f for f in os.listdir(input_folder)
if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))]
all_data = []
for image_file in image_files:
image_path = os.path.join(input_folder, image_file)
# 预处理
processed_img = preprocess_invoice(image_path)
# 临时保存处理后的图像(EasyOCR需要图像路径)
temp_path = 'temp_processed.png'
cv2.imwrite(temp_path, processed_img)
# 识别数据
data = extract_invoice_data(temp_path)
data['文件名'] = image_file
all_data.append(data)
# 删除临时文件
os.remove(temp_path)
# 创建DataFrame
df = pd.DataFrame(all_data)
# 导出到Excel
df.to_excel(output_excel, index=False, engine='openpyxl')
print(f"成功导出到 {output_excel}")
4. EXE打包(使用PyInstaller)
创建main.py
包含上述功能,然后执行:
pyinstaller --onefile --windowed --icon=invoice.ico main.py
参数说明:
--onefile
:生成单个EXE文件--windowed
:不显示控制台窗口--icon
:设置程序图标
四、优化与改进方向
识别准确率提升:
- 收集真实发票样本,微调EasyOCR模型
- 添加人工校正界面,允许用户修正错误
功能扩展:
- 支持PDF发票识别
- 添加发票分类功能(如按月份、客户)
- 实现数据自动校验(如金额合计计算)
性能优化:
- 多线程处理批量发票
- 添加进度显示
- 优化内存使用
五、实际应用与部署
企业部署方案:
- 内部网络部署,限制访问权限
- 集成到现有财务系统
- 定期自动执行任务
用户使用指南:
- 准备发票图片文件夹
- 运行EXE程序
- 选择输入文件夹和输出文件
- 查看结果并验证
错误处理机制:
- 图像无法读取时提示
- 识别失败时记录日志
- 提供详细的错误信息
六、完整代码示例
# main.py 完整示例
import easyocr
import cv2
import pandas as pd
import os
import re
from datetime import datetime
class InvoiceRecognizer:
def __init__(self):
self.reader = easyocr.Reader(['ch_sim', 'en'])
def preprocess(self, image_path):
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
denoised = cv2.fastNlMeansDenoising(binary, None, 10, 7, 21)
return denoised
def extract_data(self, image_path):
processed = self.preprocess(image_path)
temp_path = 'temp_processed.png'
cv2.imwrite(temp_path, processed)
results = self.reader.readtext(temp_path)
texts = [result[1] for result in results]
combined = '\n'.join(texts)
patterns = {
'发票号码': r'发票号码[::]?\s*(\S+)',
'开票日期': r'开票日期[::]?\s*(\d{4}[-/]\d{1,2}[-/]\d{1,2})',
'购买方名称': r'购买方名称[::]?\s*([^\n]+)',
'销售方名称': r'销售方名称[::]?\s*([^\n]+)',
'金额': r'金额[::]?\s*(\d+\.\d{2})',
'税额': r'税额[::]?\s*(\d+\.\d{2})',
'价税合计': r'价税合计(大写)?[::]?\s*(\d+\.\d{2})'
}
data = {field: '' for field in patterns}
data['文件名'] = os.path.basename(image_path)
for field, pattern in patterns.items():
match = re.search(pattern, combined)
if match:
data[field] = match.group(1).strip()
os.remove(temp_path)
return data
def main():
input_dir = input("请输入发票图片文件夹路径: ").strip('"')
output_file = input("请输入输出Excel文件路径: ").strip('"') or f"发票数据_{datetime.now().strftime('%Y%m%d')}.xlsx"
recognizer = InvoiceRecognizer()
all_data = []
for img_file in os.listdir(input_dir):
if img_file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')):
img_path = os.path.join(input_dir, img_file)
try:
data = recognizer.extract_data(img_path)
all_data.append(data)
except Exception as e:
print(f"处理 {img_file} 时出错: {str(e)}")
if all_data:
df = pd.DataFrame(all_data)
df.to_excel(output_file, index=False, engine='openpyxl')
print(f"成功导出 {len(all_data)} 条发票数据到 {output_file}")
else:
print("未找到可处理的发票图片")
if __name__ == "__main__":
main()
七、总结与展望
本文实现的Python解决方案,通过OCR技术、数据处理和EXE打包,提供了完整的增值税发票批量识别与导出功能。相比传统方式,该方案具有以下优势:
- 自动化处理,大幅提升效率
- 结构化数据输出,便于后续分析
- 独立EXE文件,无需安装Python环境
- 开源免费,可根据需求定制
未来可进一步集成机器学习模型,提升复杂场景下的识别准确率,或开发Web版本实现远程使用。此工具特别适合中小企业财务部门,能有效降低人力成本,减少人为错误。
发表评论
登录后可评论,请前往 登录 或 注册