logo

Python增值税发票批量识别与表格导出工具(EXE版)

作者:蛮不讲李2025.09.18 16:39浏览量:0

简介:本文详细介绍如何使用Python实现增值税发票批量识别并导出为Excel表格,最终打包成独立EXE文件,解决非技术人员部署难题。包含OCR技术选型、发票信息解析、表格生成及PyInstaller打包全流程。

Python实现增值税发票批量识别和导出到表格(已打包成exe)

一、项目背景与需求分析

在财务工作中,增值税发票的批量识别与数据整理是高频且耗时的任务。传统方式依赖人工录入,存在效率低、易出错等问题。通过自动化技术实现发票批量识别与数据导出,可显著提升工作效率。本文将介绍如何使用Python开发一个完整的解决方案,包含OCR识别、信息解析、Excel导出及EXE打包,使非技术人员也能轻松使用。

二、技术选型与工具准备

  1. OCR引擎选择

    • Tesseract OCR:开源免费,支持中文识别,需训练发票专用模型
    • EasyOCR:基于深度学习,内置中文模型,识别准确率高
    • 百度OCR/阿里OCR:商业API,识别率高但需付费
      本文选用EasyOCR,因其平衡了识别准确率与使用便捷性。
  2. 依赖库安装

    1. pip install easyocr pandas openpyxl pyinstaller
  3. 开发环境

    • Python 3.8+
    • Windows/Linux/macOS(打包后仅EXE需Windows)

三、核心功能实现

1. 发票图像预处理

  1. import cv2
  2. import numpy as np
  3. def preprocess_invoice(image_path):
  4. # 读取图像
  5. img = cv2.imread(image_path)
  6. # 转换为灰度图
  7. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  8. # 二值化处理
  9. _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
  10. # 降噪
  11. denoised = cv2.fastNlMeansDenoising(binary, None, 10, 7, 21)
  12. return denoised

预处理步骤提升OCR识别率,特别针对扫描件或低质量图片。

2. 发票信息识别与解析

  1. import easyocr
  2. import re
  3. def extract_invoice_data(image_path):
  4. # 初始化EasyOCR阅读器(中文+数字)
  5. reader = easyocr.Reader(['ch_sim', 'en'])
  6. # 识别文本
  7. results = reader.readtext(image_path)
  8. # 初始化数据字典
  9. invoice_data = {
  10. '发票号码': '',
  11. '开票日期': '',
  12. '购买方名称': '',
  13. '销售方名称': '',
  14. '金额': '',
  15. '税额': '',
  16. '价税合计': ''
  17. }
  18. # 定义关键词匹配模式
  19. patterns = {
  20. '发票号码': r'发票号码[::]?\s*(\S+)',
  21. '开票日期': r'开票日期[::]?\s*(\d{4}[-/]\d{1,2}[-/]\d{1,2})',
  22. '购买方名称': r'购买方名称[::]?\s*([^\n]+)',
  23. '销售方名称': r'销售方名称[::]?\s*([^\n]+)',
  24. '金额': r'金额[::]?\s*(\d+\.\d{2})',
  25. '税额': r'税额[::]?\s*(\d+\.\d{2})',
  26. '价税合计': r'价税合计(大写)?[::]?\s*(\d+\.\d{2})'
  27. }
  28. # 提取识别结果中的文本
  29. texts = [result[1] for result in results]
  30. combined_text = '\n'.join(texts)
  31. # 填充数据字典
  32. for field, pattern in patterns.items():
  33. match = re.search(pattern, combined_text)
  34. if match:
  35. invoice_data[field] = match.group(1).strip()
  36. return invoice_data

通过关键词匹配与正则表达式,从OCR结果中提取结构化数据。

3. 批量处理与Excel导出

  1. import pandas as pd
  2. import os
  3. def batch_process_invoices(input_folder, output_excel):
  4. # 获取输入文件夹中所有图片
  5. image_files = [f for f in os.listdir(input_folder)
  6. if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))]
  7. all_data = []
  8. for image_file in image_files:
  9. image_path = os.path.join(input_folder, image_file)
  10. # 预处理
  11. processed_img = preprocess_invoice(image_path)
  12. # 临时保存处理后的图像(EasyOCR需要图像路径)
  13. temp_path = 'temp_processed.png'
  14. cv2.imwrite(temp_path, processed_img)
  15. # 识别数据
  16. data = extract_invoice_data(temp_path)
  17. data['文件名'] = image_file
  18. all_data.append(data)
  19. # 删除临时文件
  20. os.remove(temp_path)
  21. # 创建DataFrame
  22. df = pd.DataFrame(all_data)
  23. # 导出到Excel
  24. df.to_excel(output_excel, index=False, engine='openpyxl')
  25. print(f"成功导出到 {output_excel}")

4. EXE打包(使用PyInstaller)

创建main.py包含上述功能,然后执行:

  1. pyinstaller --onefile --windowed --icon=invoice.ico main.py

参数说明:

  • --onefile:生成单个EXE文件
  • --windowed:不显示控制台窗口
  • --icon:设置程序图标

四、优化与改进方向

  1. 识别准确率提升

    • 收集真实发票样本,微调EasyOCR模型
    • 添加人工校正界面,允许用户修正错误
  2. 功能扩展

    • 支持PDF发票识别
    • 添加发票分类功能(如按月份、客户)
    • 实现数据自动校验(如金额合计计算)
  3. 性能优化

    • 多线程处理批量发票
    • 添加进度显示
    • 优化内存使用

五、实际应用与部署

  1. 企业部署方案

    • 内部网络部署,限制访问权限
    • 集成到现有财务系统
    • 定期自动执行任务
  2. 用户使用指南

    • 准备发票图片文件夹
    • 运行EXE程序
    • 选择输入文件夹和输出文件
    • 查看结果并验证
  3. 错误处理机制

    • 图像无法读取时提示
    • 识别失败时记录日志
    • 提供详细的错误信息

六、完整代码示例

  1. # main.py 完整示例
  2. import easyocr
  3. import cv2
  4. import pandas as pd
  5. import os
  6. import re
  7. from datetime import datetime
  8. class InvoiceRecognizer:
  9. def __init__(self):
  10. self.reader = easyocr.Reader(['ch_sim', 'en'])
  11. def preprocess(self, image_path):
  12. img = cv2.imread(image_path)
  13. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  14. _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
  15. denoised = cv2.fastNlMeansDenoising(binary, None, 10, 7, 21)
  16. return denoised
  17. def extract_data(self, image_path):
  18. processed = self.preprocess(image_path)
  19. temp_path = 'temp_processed.png'
  20. cv2.imwrite(temp_path, processed)
  21. results = self.reader.readtext(temp_path)
  22. texts = [result[1] for result in results]
  23. combined = '\n'.join(texts)
  24. patterns = {
  25. '发票号码': r'发票号码[::]?\s*(\S+)',
  26. '开票日期': r'开票日期[::]?\s*(\d{4}[-/]\d{1,2}[-/]\d{1,2})',
  27. '购买方名称': r'购买方名称[::]?\s*([^\n]+)',
  28. '销售方名称': r'销售方名称[::]?\s*([^\n]+)',
  29. '金额': r'金额[::]?\s*(\d+\.\d{2})',
  30. '税额': r'税额[::]?\s*(\d+\.\d{2})',
  31. '价税合计': r'价税合计(大写)?[::]?\s*(\d+\.\d{2})'
  32. }
  33. data = {field: '' for field in patterns}
  34. data['文件名'] = os.path.basename(image_path)
  35. for field, pattern in patterns.items():
  36. match = re.search(pattern, combined)
  37. if match:
  38. data[field] = match.group(1).strip()
  39. os.remove(temp_path)
  40. return data
  41. def main():
  42. input_dir = input("请输入发票图片文件夹路径: ").strip('"')
  43. output_file = input("请输入输出Excel文件路径: ").strip('"') or f"发票数据_{datetime.now().strftime('%Y%m%d')}.xlsx"
  44. recognizer = InvoiceRecognizer()
  45. all_data = []
  46. for img_file in os.listdir(input_dir):
  47. if img_file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')):
  48. img_path = os.path.join(input_dir, img_file)
  49. try:
  50. data = recognizer.extract_data(img_path)
  51. all_data.append(data)
  52. except Exception as e:
  53. print(f"处理 {img_file} 时出错: {str(e)}")
  54. if all_data:
  55. df = pd.DataFrame(all_data)
  56. df.to_excel(output_file, index=False, engine='openpyxl')
  57. print(f"成功导出 {len(all_data)} 条发票数据到 {output_file}")
  58. else:
  59. print("未找到可处理的发票图片")
  60. if __name__ == "__main__":
  61. main()

七、总结与展望

本文实现的Python解决方案,通过OCR技术、数据处理和EXE打包,提供了完整的增值税发票批量识别与导出功能。相比传统方式,该方案具有以下优势:

  1. 自动化处理,大幅提升效率
  2. 结构化数据输出,便于后续分析
  3. 独立EXE文件,无需安装Python环境
  4. 开源免费,可根据需求定制

未来可进一步集成机器学习模型,提升复杂场景下的识别准确率,或开发Web版本实现远程使用。此工具特别适合中小企业财务部门,能有效降低人力成本,减少人为错误。

相关文章推荐

发表评论