基于 PaddleOCR 的快递面单与发票信息抽取 Excel 导出实战
摘要物流面单和发票图片里包含大量可结构化的信息但如果只停留在“识别出文字”业务人员仍然需要人工复制运单号、联系人、地址、发票号码、金额等字段。本文基于一个完整 Python 项目演示如何把公开真实单据图片经过 OCR 文本识别、文档类型判断、规则字段抽取和 Excel/CSV/JSON 导出整理成可复核的数据表和标注结果图。项目默认支持三种输入方式paddle模式调用 PaddleOCR 做实时识别auto模式优先使用 PaddleOCR 并在不可用时回退text模式读取已经由真实单据 OCR 得到的文本文件便于离线复现同一组正式结果。本文的截图使用 FedEx 国际空运单样例和 ReceiptBank 发票样例生成不使用手绘 demo 单据或占位图。关键词PaddleOCR、快递面单识别、发票 OCR、关键信息抽取、Excel 导出、openpyxl、Python 项目实战一、项目目标实际办公自动化里OCR 项目交付的重点不是单张图片能不能识别出几行文字而是能否把文字继续整理成业务需要的字段。快递面单里常见字段包括运单号、寄件人、收件人、电话、地址、物品名称和重量发票里常见字段包括发票号码、开票日期、购买方、销售方、税额和价税合计。这些字段具有明显的格式特征第一版项目不需要训练专门的字段抽取模型。更稳妥的方案是把 OCR 输出统一成文本行再用“文档分类 关键词 正则规则”抽取字段最后导出 Excel 给人工复核。下图是本次真实样例运行后的整体摘要。程序处理了 2 张公开单据图片分别识别为发票和快递面单并生成 Excel、CSV、JSON 与标注结果图。二、技术方案项目的处理链路分为七个环节图片输入、OCR 文本识别、文档分类、字段抽取、结构化记录、Excel/CSV/JSON 导出、标注结果图保存。OCR 后端与字段抽取模块保持解耦只要 OCR 输出统一的文本行对象后续规则和导出逻辑就可以复用。核心模块如下main.py命令行入口负责解析输入目录、输出目录、OCR 模式和配置文件。src/ocr_engine.py封装 PaddleOCR、离线样例文本和真实 OCR 文本回放。src/extractor.py负责文档类型判断和字段规则抽取。src/exporter.py导出 Excel、CSV、JSON。src/visualizer.py绘制 OCR 标注框、字段结果面板、摘要图和 Excel 预览图。configs/extraction_rules.yml维护快递面单和发票的关键词、必填字段和展示标签。这种拆分方式适合后续扩展。如果要把命令行项目升级成 Flask/FastAPI Web 系统只需要在上传接口里调用同一套 pipeline不必重写 OCR 和字段抽取逻辑。三、真实样例运行结果本次验证使用两张公开单据图片一张 ReceiptBank 发票图片和一张 FedEx 国际空运单样例。程序读取图片后根据 OCR 文本判断文档类型再抽取对应字段。发票样例中程序抽取到了发票号码、日期、购买方、销售方、金额、税额和合计金额。发票结果中的关键字段如下文档类型invoice 发票号码B35139 发票日期04-18-17 购买方THORS HAMMER CONSTRUCTION INC 销售方Pacific West Systems Supply Ltd. 不含税金额399.94 税额20.00 合计金额447.94快递面单样例中程序抽取到了运单号、寄件人、寄件电话、寄件地址、收件人、收件地址和物品名称。公开样例中部分联系信息是匿名或留空的程序会在 Excel 中保留缺失字段数量方便人工复核。快递面单结果中的关键字段如下文档类型waybill 运单号1234 5678 9011 寄件人XXX Wong 寄件电话612-9045-4979 寄件地址Unit 6, 1307 Botany Road 收件人XXX Chan 收件地址200 West Grand Ave 物品名称Silicon wafer for semiconductor四、核心代码设计OCR 引擎层返回统一的OCRLine数据结构每条记录包含文本、置信度和文本框坐标。PaddleOCR 实时识别、离线样例文本和真实 OCR 文本回放都转换成相同格式后面的分类、抽取、导出代码不需要关心 OCR 来源。dataclassclassOCRLine:text:strscore:float1.0box:Optional[list]None文档类型判断使用配置文件中的关键词计分。快递面单会命中Air Waybill、FedEx、Shipper、Recipient等关键词发票会命中SALES INVOICE、Invoice No.、Invoice Date、Sub-Total、PLEASE PAY THIS AMOUNT等关键词。doc_types:waybill:keywords:-Air Waybill-FedEx-Shipper-Recipientinvoice:keywords:-SALES INVOICE-Invoice No.-Invoice Date-Sub-Total字段抽取阶段根据文档类型选择不同规则。运单号可以匹配中文“运单号”、英文Waybill No.也可以匹配空运单中常见的分组数字发票号码可以匹配中文“发票号码”、英文Invoice No.以及表格中跟在日期字段附近的编号。tracking_nofirst_match([r(?:运单号|快递单号|物流单号|Waybill\s*No\.?)[:\s]*([A-Z0-9]{8,30}),r\b(\d{4}\s\d{4}\s\d{4})\b,],text)total_amountfirst_match([r(?:价税合计|合计金额|小写)[:\s¥]*([0-9](?:\.[0-9]{1,2})?),r(?:PLEASE\sPAY\sTHIS\sAMOUNT|Amount\sDue)[:\s$]*([0-9](?:\.[0-9]{1,2})?),],text)规则抽取的优点是透明、可解释、易维护。遇到新模板时可以先查看RawText工作表中的 OCR 原文再补充字段别名或正则表达式。五、Excel 导出与复核项目使用openpyxl生成.xlsx文件同时导出 CSV 和 JSON。Excel 中包含四个工作表Summary处理数量、类型分布和生成时间。Records一张单据一行适合业务筛选和统计。Fields一个字段一行适合字段级复核。RawText保存 OCR 原文方便定位识别错误和规则缺口。下面是Records工作表预览。发票和快递面单被统一整理成结构化记录后续可以导入业务系统也可以直接给人工审核。保留RawText很关键。很多 OCR 项目的错误并不在字段规则而是图片中的文字本身识别错了。把原文写入 Excel 后可以按下面的顺序排查字段为空或异常 ↓ 查看 RawText 中是否识别出对应文本 ↓ 如果 RawText 没有优先优化图片质量或 OCR 参数 ↓ 如果 RawText 有补充 extractor.py 中的字段规则六、运行方式先安装基础依赖pipinstall-rrequirements.txt如果要复现本文的真实样例结果可以使用随项目提供的公开单据图片和 OCR 文本文件python main.py--modetext\--inputdemo_data/real_run_images\--ocr-text-dir demo_data/real_ocr_texts\--outputoutputs_real_final\--blog-assets images/results_real_final运行成功后会生成outputs_real_final/extracted_fields.xlsx outputs_real_final/data/extracted_records.csv outputs_real_final/data/extraction_result.json outputs_real_final/images/annotated_*.png outputs_real_final/images/extraction_summary.png outputs_real_final/images/excel_preview.png如果本机已经安装 PaddlePaddle 和 PaddleOCR可以直接对自己的图片运行实时 OCRpipinstall-rrequirements-paddleocr.txt python main.py--modepaddle--inputyour_images--outputoutputs也可以使用自动模式python main.py--modeauto--inputyour_images--outputoutputsauto模式会优先尝试 PaddleOCR适合已经配置好 OCR 环境的机器text模式适合课程设计、博客复现和资源包验证因为它不依赖模型下载也不会因为外部模型版本变化导致截图不一致。七、扩展方向当前项目已经完成命令行批处理、字段抽取、表格导出和结果可视化。后续可以继续扩展增加 Flask/FastAPI 上传页面实现浏览器上传单据和下载 Excel。增加 PySide6 桌面界面让非技术用户选择图片目录后直接运行。接入数据库把每次抽取记录保存到 SQLite、MySQL 或 PostgreSQL。增加人工复核页面允许用户修正字段后再导出。扩展更多文档类型例如收据、采购单、合同首页、营业执照等。对于课程设计或 CSDN 项目实战这个版本已经覆盖了 OCR 项目的完整闭环真实图片输入、OCR 文本解析、结构化字段输出、Excel 复核和结果图展示。对于企业内部工具则可以在此基础上继续补充权限、审计和人工确认流程。八、总结本文实现了一个基于 PaddleOCR 思路的快递面单与发票信息抽取项目。它不是简单的 OCR API 调用而是把 OCR 输出继续加工为业务可用的 Excel、CSV、JSON 和标注图。项目通过统一 OCR 行结构解耦识别后端通过 YAML 配置和规则抽取保持可维护性通过 RawText 和字段置信度保留复核依据。真实业务中OCR 抽取结果建议保留人工复核尤其是物流结算、财务报销和客户资料入库等场景。程序负责减少重复录入人工负责确认关键字段这样才能兼顾效率和准确性。参考资料PaddleOCR GitHubhttps://github.com/PaddlePaddle/PaddleOCRPaddleOCR Quick Starthttps://paddlepaddle.github.io/PaddleOCR/main/en/quick_start.htmlPaddleOCR General OCR Pipelinehttps://paddlepaddle.github.io/PaddleOCR/main/en/version3.x/pipeline_usage/OCR.htmlopenpyxl 文档https://openpyxl.readthedocs.io/Pillow ImageDraw 文档https://pillow.readthedocs.io/en/stable/reference/ImageDraw.htmlReceiptBank 发票公开样例https://commons.wikimedia.org/wiki/File:Receiptbank_Invoice.pngFedEx 空运单说明https://www.fedex.com/en-us/shipping/air-waybill.html