通过税务局批量下载的发票,并不是全部有用的,想要的那部分发票如何批量下载是一个难题,最好是能根据要求给发票图片编号
4条回答 默认 最新
檀越@新空间 2025-07-31 10:33关注上午好☀️☀️☀️️
本答案参考通义千问制作一个发票截取软件,可以通过 Python 实现,主要功能包括:
- 从税务局下载的发票图片中识别并提取有用信息(如发票代码、号码、金额等)
- 对发票图片进行编号和分类
- 批量处理多张发票图像
下面是一个完整的解决方案,包含详细步骤和示例代码。
✅ 一、所需工具与库
- OpenCV:用于图像处理(裁剪、灰度化、二值化等)
- Pytesseract:OCR文字识别(识别发票上的文字)
- Pillow (PIL):图像处理和保存
- os & glob:文件操作和批量读取
- re (正则表达式):提取发票关键信息(如发票代码、号码)
pip install opencv-python pytesseract pillow⚠️ 注意:安装 Pytesseract 需要先安装 Tesseract OCR 工具。
- Windows: Tesseract 安装包
- Linux:
sudo apt-get install tesseract-ocr - macOS:
brew install tesseract
✅ 二、核心功能说明
1. 图像预处理(增强识别效果)
- 转为灰度图
- 二值化处理
- 去噪
- 裁剪区域(仅保留发票内容)
2. 使用 OCR 提取发票信息
- 识别发票代码、号码、金额等字段
- 使用正则表达式匹配关键字段
3. 发票编号与分类
- 按照识别到的发票代码 + 号码命名文件
- 保存为指定格式(如:
发票_代码_号码.jpg)
✅ 三、完整实现步骤
步骤 1:导入必要的库
import cv2 import numpy as np import pytesseract from PIL import Image import os import re
步骤 2:图像预处理函数
def preprocess_image(image_path): # 读取图像 img = cv2.imread(image_path) # 转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理 _, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY) # 去噪 kernel = np.ones((3, 3), np.uint8) opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=2) return opening
步骤 3:OCR 识别发票信息
def extract_invoice_info(image_path): # 预处理 processed_img = preprocess_image(image_path) # 保存临时图像 temp_path = "temp.jpg" cv2.imwrite(temp_path, processed_img) # 使用 pytesseract 进行 OCR 识别 text = pytesseract.image_to_string(Image.open(temp_path), lang='chi_sim') # 正则表达式提取发票信息 invoice_code_match = re.search(r'发票代码:(\d+)', text) invoice_number_match = re.search(r'发票号码:(\d+)', text) total_amount_match = re.search(r'价税合计:([\d,.]+)', text) invoice_code = invoice_code_match.group(1) if invoice_code_match else "未知" invoice_number = invoice_number_match.group(1) if invoice_number_match else "未知" total_amount = total_amount_match.group(1) if total_amount_match else "未知" return { "code": invoice_code, "number": invoice_number, "amount": total_amount }
步骤 4:批量处理发票图片
def batch_process_invoices(input_folder, output_folder): if not os.path.exists(output_folder): os.makedirs(output_folder) for filename in os.listdir(input_folder): if filename.lower().endswith(('.png', '.jpg', '.jpeg')): image_path = os.path.join(input_folder, filename) info = extract_invoice_info(image_path) # 构建新文件名 new_filename = f"发票_{info['code']}_{info['number']}.jpg" new_path = os.path.join(output_folder, new_filename) # 复制原图到输出目录 os.rename(image_path, new_path) print(f"已处理: {filename} -> {new_filename}")
步骤 5:运行程序
if __name__ == "__main__": input_folder = "invoices" # 输入发票图片文件夹 output_folder = "processed_invoices" # 输出文件夹 batch_process_invoices(input_folder, output_folder)
✅ 四、优化建议
| 优化点 | 说明 | |--------|------| | 图像定位 | 使用轮廓检测或模板匹配来定位发票区域 | | 多语言支持 | 若发票含英文,可使用
lang='eng'或lang='chi_sim+eng'| | 错误处理 | 添加异常捕获机制,避免因识别失败导致程序崩溃 | | 结果导出 | 将识别结果导出为 CSV 文件便于后续分析 |
✅ 五、总结
通过上述步骤,你可以构建一个发票截取与编号软件,实现以下目标:
- 自动识别发票关键信息
- 对发票图片进行编号和分类
- 批量处理多张发票图片
重点总结:
- 图像预处理 是提升 OCR 准确率的关键。
- 正则表达式 可有效提取结构化数据。
- 批量处理 提高效率,适用于大量发票场景。
如需进一步扩展,可以结合 PDF 解析 或 API 接口 与税务局系统对接,实现更智能化的发票管理。需要我帮你写 API 接口部分吗?
解决 无用评论 打赏 举报