2401_87195233 2025-07-31 10:30 采纳率: 0%
浏览 9

如何制作一个发票截取软件

通过税务局批量下载的发票,并不是全部有用的,想要的那部分发票如何批量下载是一个难题,最好是能根据要求给发票图片编号

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-07-31 10:33
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    制作一个发票截取软件,可以通过 Python 实现,主要功能包括:

    • 从税务局下载的发票图片中识别并提取有用信息(如发票代码、号码、金额等)
    • 对发票图片进行编号和分类
    • 批量处理多张发票图像

    下面是一个完整的解决方案,包含详细步骤和示例代码。


    ✅ 一、所需工具与库

    1. OpenCV:用于图像处理(裁剪、灰度化、二值化等)
    2. Pytesseract:OCR文字识别(识别发票上的文字)
    3. Pillow (PIL):图像处理和保存
    4. os & glob:文件操作和批量读取
    5. 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 文件便于后续分析 |


    ✅ 五、总结

    通过上述步骤,你可以构建一个发票截取与编号软件,实现以下目标:

    1. 自动识别发票关键信息
    2. 对发票图片进行编号和分类
    3. 批量处理多张发票图片

    重点总结:

    • 图像预处理 是提升 OCR 准确率的关键。
    • 正则表达式 可有效提取结构化数据。
    • 批量处理 提高效率,适用于大量发票场景。

    如需进一步扩展,可以结合 PDF 解析API 接口 与税务局系统对接,实现更智能化的发票管理。需要我帮你写 API 接口部分吗?

    评论

报告相同问题?

问题事件

  • 创建了问题 7月31日