多格式PDF电费发票特定字段提取导出Excel方案咨询
多格式PDF电费发票定向字段提取落地方案
第一步:提前做PDF类型分流,砍掉无效OCR开销
别上来就把所有文件扔OCR,先做一层判断:
- 用
pdfplumber或PyPDF2探测PDF是否带可编辑文本层,原生电子发票直接读文本层走规则匹配,准确率能稳在99%,处理速度是OCR的10倍以上 - 只有扫描件、图片导出的无文本层PDF,才走OCR识别流程,能省大量算力,还能避免OCR带来的不必要识别误差
第二步:分场景精准定位目标字段
不用一开始就堆大模型,规则+轻量模型的方案成本低、好调试,准确率完全能满足生产要求:
原生文本类PDF提取逻辑
所有目标字段都有明确标识,靠「固定锚点+邻近匹配+格式校验」就能覆盖绝大多数标准化发票:
- CUPS字段:本身是固定格式的20位左右编码,前缀为ES,直接用正则
ES\d{18}[A-Z0-9]{0,2}做格式匹配;为了避免匹配到其他相似字符串,先定位文本中"CUPS"关键词的位置,只取关键词右侧、上下坐标差不超过2个行高范围内的符合格式的内容,基本不会错 - 账单总金额:先定位对应语言的锚点关键词,比如西语版的"Total a pagar""Importe total",找到锚点后,只匹配锚点周边带货币标识、保留2位小数的数值,不要全页搜金额,很容易把分项费用、税费抓成总金额
- P1-P6各时段用电量:先定位时段计费表格的锚点——这类表格表头一定会连续出现P1到P6的标识,同时带"Consumo(用电量)""kWh"相关字样,锁定表格的坐标范围后,按行/列匹配每个时段对应用电量列的数值即可,注意和同表格里的电价字段做区分,只抓单位为kWh的数字
实操技巧:用
pdfplumber提取文本时一定要拿带页面坐标的文本块,所有匹配都基于锚点的坐标算距离,取最近的符合格式的结果,不要靠纯文本的字符串相对位置匹配,能适配绝大多数不同排版的发票,不用给每个供电公司的发票单独写死坐标
扫描件PDF的OCR提取优化
走OCR流程的时候别只拿纯文本识别结果,要让OCR返回每个识别块的 bounding box 坐标,后续的定位逻辑和原生PDF完全一致,不用单独写两套逻辑:
- OCR引擎优先选PaddleOCR或者Textract,印刷体识别、表格识别的准确率比老旧的Tesseract高很多,低清晰度的老扫描件也能稳住识别效果
- 如果遇到个别排版特别特殊、锚点位置偏移大的发票,不用硬写规则适配,标个几十张样本训个轻量的LayoutLM实体识别模型,只识别这三个目标字段就行,几十张样本的准确率就能到95%以上,比硬抠规则省时间
第三步:结构化导出与兜底校验
- 提取完成的字段直接用
pandas整理成结构化表,一行代码就能导出为Excel文件 - 导出前一定要加自动校验规则,把异常项标红留人工复核,不用追求100%全自动,留1%-5%的异常复核口子,整体落地成本能降一大半:
- CUPS编码不符合固定格式规则的标记异常
- P1-P6用电量加总和发票上的总用电量偏差超过1kWh的标记异常
- 总金额和各时段费用、税费加总偏差超过0.1的标记异常
常见避坑点
- 别信零代码OCR工具吹的全格式适配,这类工具基本都是靠固定模板匹配,换个供电公司的排版直接抓瞎,核心锚点匹配逻辑自己写,后续适配新格式只要加几个对应关键词就行,5分钟就能搞定
- 别一开始就上通用大模型做端到端提取,大模型容易出幻觉编数值,批量跑的成本也比规则方案高几十倍,最多拿来做最后一层结果校验就行,别当核心提取逻辑
内容的提问来源于stack exchange,提问作者johannes orssich
相关产品推荐
相关产品推荐

