当前位置: 首页 > news >正文

基于 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 购买方:THOR'S 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:float=1.0box:Optional[list]=None

文档类型判断使用配置文件中的关键词计分。快递面单会命中Air WaybillFedExShipperRecipient等关键词;发票会命中SALES INVOICEInvoice No.Invoice DateSub-TotalPLEASE 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_no=first_match([r"(?:运单号|快递单号|物流单号|Waybill\s*No\.?)[:\s]*([A-Z0-9]{8,30})",r"\b(\d{4}\s+\d{4}\s+\d{4})\b",],text)total_amount=first_match([r"(?:价税合计|合计金额|小写)[:\s¥¥]*([0-9]+(?:\.[0-9]{1,2})?)",r"(?:PLEASE\s+PAY\s+THIS\s+AMOUNT|Amount\s+Due)[:\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,可以直接对自己的图片运行实时 OCR:

pipinstall-rrequirements-paddleocr.txt python main.py--modepaddle--inputyour_images--outputoutputs

也可以使用自动模式:

python main.py--modeauto--inputyour_images--outputoutputs

auto模式会优先尝试 PaddleOCR,适合已经配置好 OCR 环境的机器;text模式适合课程设计、博客复现和资源包验证,因为它不依赖模型下载,也不会因为外部模型版本变化导致截图不一致。

七、扩展方向

当前项目已经完成命令行批处理、字段抽取、表格导出和结果可视化。后续可以继续扩展:

  1. 增加 Flask/FastAPI 上传页面,实现浏览器上传单据和下载 Excel。
  2. 增加 PySide6 桌面界面,让非技术用户选择图片目录后直接运行。
  3. 接入数据库,把每次抽取记录保存到 SQLite、MySQL 或 PostgreSQL。
  4. 增加人工复核页面,允许用户修正字段后再导出。
  5. 扩展更多文档类型,例如收据、采购单、合同首页、营业执照等。

对于课程设计或 CSDN 项目实战,这个版本已经覆盖了 OCR 项目的完整闭环:真实图片输入、OCR 文本解析、结构化字段输出、Excel 复核和结果图展示。对于企业内部工具,则可以在此基础上继续补充权限、审计和人工确认流程。

八、总结

本文实现了一个基于 PaddleOCR 思路的快递面单与发票信息抽取项目。它不是简单的 OCR API 调用,而是把 OCR 输出继续加工为业务可用的 Excel、CSV、JSON 和标注图。项目通过统一 OCR 行结构解耦识别后端,通过 YAML 配置和规则抽取保持可维护性,通过 RawText 和字段置信度保留复核依据。

真实业务中,OCR 抽取结果建议保留人工复核,尤其是物流结算、财务报销和客户资料入库等场景。程序负责减少重复录入,人工负责确认关键字段,这样才能兼顾效率和准确性。

参考资料

  • PaddleOCR GitHub:https://github.com/PaddlePaddle/PaddleOCR
  • PaddleOCR Quick Start:https://paddlepaddle.github.io/PaddleOCR/main/en/quick_start.html
  • PaddleOCR General OCR Pipeline:https://paddlepaddle.github.io/PaddleOCR/main/en/version3.x/pipeline_usage/OCR.html
  • openpyxl 文档:https://openpyxl.readthedocs.io/
  • Pillow ImageDraw 文档:https://pillow.readthedocs.io/en/stable/reference/ImageDraw.html
  • ReceiptBank 发票公开样例:https://commons.wikimedia.org/wiki/File:Receiptbank_Invoice.png
  • FedEx 空运单说明:https://www.fedex.com/en-us/shipping/air-waybill.html
http://www.jsqmd.com/news/933470/

相关文章:

  • 大卷积核的‘文艺复兴’:从RepLKNet到UniRepLKNet,我们该如何设计下一个通用视觉主干网络?
  • MusicFree:插件化架构驱动的开源音乐播放器技术解析
  • 从导师任务到代码实现:我用Delaunay三角网生长算法提取离散点轮廓的完整踩坑记录
  • STM32 HAL库开发效率翻倍:巧用CubeMX配置STM32F103C8T6工程与一键编译下载技巧
  • 2026年评价高的强力磁铁/包胶磁铁主流厂家对比评测 - 行业平台推荐
  • 别再死记硬背ImageNet了!用CLIP的‘一句话魔法’,5分钟搞定零样本图像分类
  • 2026年6月质量好的草原网供货商哪家好,牛栏网/围栏网/草原网/草原防护网/建筑钢筋网片,草原网定制厂家找哪家 - 品牌推荐师
  • RoundedTB终极指南:5步解决Windows任务栏美化难题
  • 大模型应用护城河已变:告别Prompt玄学,上下文工程才是王道!
  • 【CGLIB】如何利用 CGLIB 实现一个简易的 ORM 框架中的实体代理?
  • FastAPI 参数详解:路径参数、查询参数与请求体 —— 从入门到实战
  • 2026年银川劳动纠纷律师推荐:5位实战经验丰富的专业选择 - 本地品牌推荐
  • 从“休眠”到“唤醒”:深入解读LIN总线网络管理与AUTOSAR LinSM状态机实战
  • 为什么选择T3Q-ko-solar-dpo-v3.0-openmind?韩国AI开发者必知的7大核心优势 [特殊字符]
  • 别再傻傻用GPIO模拟了!STM32F407硬件IIC实战:驱动OLED屏幕完整流程(附代码)
  • 从CT原始DICOM到4K手术教学动画:Sora 2端到端工作流仅需22分钟——华西医院介入科实测全链路拆解
  • Python 闭包与装饰器从入门到精通(一)
  • 2026年质量好的挂钩磁铁/耐高温磁铁/包胶磁铁优质供应商推荐 - 品牌宣传支持者
  • 手把手教你用带参数的FC写一个‘万能’星三角启动程序(附TIA Portal V18程序截图)
  • 拆解Geant4模拟内核:Run、Event、Step、Track到底怎么工作?给初学者的可视化解读
  • 如何快速拯救B站缓存视频:m4s转MP4的完整指南
  • UE5 C++新手必看:别再蓝图拖拽了,手把手教你用代码搞定GameMode核心配置
  • 3步实现京东秒杀成功率翻倍:智能抢购工具实战指南
  • 从SAM到FastSAM:揭秘那个让分割模型变‘快’的1.1B数据集的秘密
  • 别再傻傻焊板子了!用嘉立创EDA标准版免费仿真,5分钟验证电路可行性
  • 2026年质量好的无锡激光清洗机/无锡清洗机/清洗机高口碑品牌推荐 - 行业平台推荐
  • 告别手忙脚乱!用Seqtk v1.4轻松搞定FASTQ/FASTA格式转换与序列提取
  • 别再傻傻焊板子了!用嘉立创EDA标准版免费仿真,帮你省下90%的硬件调试时间
  • OpenAI加持的Figure 01机器人,真能像人一样干活了?我用实测视频告诉你答案
  • PTA编程题解:C语言实现一个‘无优先级’的简单计算器(附完整代码与测试用例)