别再手动敲发票了!用Python+EasyOCR,5分钟搞定票据信息自动提取(保姆级教程)

张开发
2026/4/18 18:05:54 15 分钟阅读

分享文章

别再手动敲发票了!用Python+EasyOCR,5分钟搞定票据信息自动提取(保姆级教程)
别再手动敲发票了用PythonEasyOCR5分钟搞定票据信息自动提取保姆级教程每次月底报销时面对堆积如山的发票和收据你是否也感到头疼手动录入金额、日期、税号不仅耗时费力还容易出错。今天我们就用Python和开源的EasyOCR库打造一个能自动识别票据信息的工具将繁琐的财务工作压缩到5分钟内完成。这个方案特别适合财务人员、行政工作者以及需要处理大量票据的职场人士。即使你是Python初学者跟着这篇教程一步步操作也能轻松上手。我们会从环境配置开始逐行解析代码最后实现将识别结果自动导出为Excel表格的全流程。1. 环境准备与工具安装在开始之前我们需要准备好Python环境和必要的库。建议使用Python 3.7或更高版本这样可以避免一些兼容性问题。首先创建一个新的虚拟环境可选但推荐python -m venv invoice_ocr source invoice_ocr/bin/activate # Linux/Mac invoice_ocr\Scripts\activate # Windows然后安装核心依赖库pip install easyocr opencv-python pandasEasyOCR是一个基于深度学习的开源OCR库支持80多种语言对中文和数字的识别效果尤其出色。它内置了训练好的模型开箱即用不需要我们自己训练。注意第一次运行时会自动下载预训练模型文件较大约200MB请确保网络通畅。2. 基础票据识别功能实现让我们先实现一个最简单的票据识别功能。假设我们有一张发票的图片invoice.jpg需要提取上面的文字信息。import easyocr # 初始化阅读器指定中文和英文 reader easyocr.Reader([ch_sim, en]) # 读取图片并识别文字 result reader.readtext(invoice.jpg) # 打印识别结果 for detection in result: print(detection[1]) # detection[1]是识别出的文本这段代码会输出图片中所有识别出的文字。每个识别结果包含三个部分文字所在位置的坐标识别出的文本内容识别的置信度0-1之间的数值常见问题排查如果遇到CUDA out of memory错误可以尝试减小批处理大小reader easyocr.Reader([ch_sim, en], gpuFalse) # 使用CPU模式对于分辨率较低的图片可以先用图像处理软件提高质量3. 精准提取关键信息单纯的文字识别还不够我们需要从结果中提取出有用的结构化信息如发票金额开票日期发票代码/号码销售方名称下面是一个改进版的代码加入了信息提取逻辑import re from datetime import datetime def extract_invoice_info(texts): info {amount: None, date: None, code: None, seller: None} # 金额识别匹配金额或价税合计后的数字 amount_pattern r(金额|价税合计)[:]\s*(\d\.\d{2}) # 日期识别匹配yyyy-mm-dd或yyyy年mm月dd日格式 date_pattern r(\d{4})[-年](\d{1,2})[-月](\d{1,2})日? # 发票代码/号码识别通常为12位数字8位数字 code_pattern r发票代码[:]\s*(\d{12}).*发票号码[:]\s*(\d{8}) for text in texts: # 尝试匹配金额 amount_match re.search(amount_pattern, text) if amount_match and not info[amount]: info[amount] float(amount_match.group(2)) # 尝试匹配日期 date_match re.search(date_pattern, text) if date_match and not info[date]: year, month, day date_match.groups() info[date] f{year}-{month.zfill(2)}-{day.zfill(2)} # 其他信息的提取逻辑类似... return info优化技巧对于不同格式的发票可以准备多套正则表达式结合文本位置信息坐标可以提高匹配准确率对关键字段可以设置置信度阈值过滤低质量识别结果4. 处理复杂场景与常见问题实际工作中的发票往往并不完美可能会遇到以下问题4.1 图片质量不佳的解决方案问题类型解决方案代码示例模糊不清使用OpenCV锐化cv2.filter2D(img, -1, kernel)光线不均自适应阈值处理cv2.adaptiveThreshold()倾斜变形透视变换矫正cv2.getPerspectiveTransform()import cv2 import numpy as np def enhance_image(image_path): img cv2.imread(image_path) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 锐化处理 kernel np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) sharpened cv2.filter2D(gray, -1, kernel) # 自适应阈值 thresh cv2.adaptiveThreshold(sharpened, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) return thresh4.2 提高特定字段的识别准确率对于发票中的关键数字如金额、税号我们可以采取特殊处理金额识别优化先定位包含¥或符号的区域对该区域进行高精度识别二次校验数字格式通常有两位小数日期识别优化优先检查发票顶部和底部区域结合上下文关键词开票日期、日期校验日期合理性不超过当前日期5. 批量处理与自动化输出最后我们将整个流程封装成一个完整的解决方案支持批量处理发票并导出Excel。import os from pandas import DataFrame def batch_process_invoices(folder_path): reader easyocr.Reader([ch_sim, en]) all_invoices [] for filename in os.listdir(folder_path): if filename.lower().endswith((.jpg, .png, .jpeg)): filepath os.path.join(folder_path, filename) enhanced_img enhance_image(filepath) # 临时保存处理后的图片 temp_path temp_processed.jpg cv2.imwrite(temp_path, enhanced_img) # 识别文字 results reader.readtext(temp_path, detail0) info extract_invoice_info(results) info[filename] filename all_invoices.append(info) # 导出到Excel df DataFrame(all_invoices) df.to_excel(invoice_results.xlsx, indexFalse) return df进阶功能建议添加自动分类功能差旅、办公、餐饮等与财务系统API对接实现自动填报搭建简单的Web界面方便非技术人员使用在实际使用中我发现对于增值税专用发票识别准确率能达到90%以上。而对于一些手写或打印质量较差的小票可能需要人工二次核对。建议对低置信度的结果进行标记方便后续检查。

更多文章