ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

发票查验批量自动化:验证码识别与OCR图像预处理

发票查验批量自动化:验证码识别与OCR图像预处理 1. 财务批量查验发票的真实痛点与选题由来做财务或者做过报销系统对接的人应该都有体会每个月月底那几天桌上堆着一摞增值税发票打开全国增值税发票查验平台一张一张地输入发票代码、发票号码、开票日期、校验码后6位或者不含税金额然后还要手动填一个随机的算术验证码点查询等结果弹出来再抄下查验一致或者查验不一致。这个动作重复几十上百遍眼睛盯着屏幕会发花肩膀会僵最要命的是中途输错一位数字整张票就得重头再来。我自己最早接触这件事是帮一家做企业报销SaaS的朋友做数据核对模块。他们客户每天上传的发票量在几百到几千张之间浮动人工查验根本扛不住所以想做一个半自动到全自动的辅助工具把人力从机械劳动里解放出来。标题里说的免验证码准确讲不是绕过平台的安全机制而是把需要人工肉眼识别、手工填写的验证码环节用图像识别技术自动化处理掉让整个查验流程不需要人一直守着点输入框。这一点必须先说清楚它决定了后面所有技术选型的边界。这里要区分两类读者一类是自己开公司、每月要处理几十张票的小微财务需要的是简单好上手的批处理脚本另一类是做财税系统的开发需要的是稳定、可维护、能接进现有业务流的工程方案。这篇文章我会两边都照顾到——原理讲透代码给能跑的片段参数给到能直接抄的程度坑也一并说清楚。整篇文章围绕的核心关键词就是验证码识别、发票查验、批量处理、图像预处理、OCR这几个读到后面你会发现它们是一条完整的链路缺一环整个流程就卡住。需要提前摆一个立场发票查验平台本身是税务部门提供的公共服务查的是企业自己取得或开具的发票目的是核验真伪、防范假票风险这是完全正当的业务场景。我们要做的是把这个公开服务的操作过程自动化而不是去伪造、篡改任何票据信息。理解了这个前提下面的内容才站得住脚。2. 整体方案怎么设计三条路线的取舍逻辑2.1 先想清楚自动到底要自动到哪一步很多人一上来就问能不能全自动,但真正做过的人知道全自动和半自动之间的取舍取决于两个变量发票量级和对准确率的容忍度。如果你的月票据量在50张以内我的建议是别折腾手动查加上复制粘贴的浏览器插件辅助就够了投入产出比最高。50到500张这个区间值得做一个半自动工具你准备一个包含发票信息的Excel表格脚本自动读取、自动识别验证码、自动提交、自动把结果写回表格你只需要在个别识别失败的地方人工补一下。500张以上才需要考虑并发、队列、失败重试这套工程化东西。我见过一些团队一上来就追求零人工干预,结果因为平台偶尔的风控策略变动、网络抖动、页面元素微调整个流程三天两头崩维护成本比人工还高。所以下面我给出的方案是一个从半自动起步、可以向全自动平滑演进的架构这样风险可控。2.2 识别引擎怎么挑为什么我最后选了轻量OCR方案验证码识别这块市面上的路线大致有这么几类我列个表对比一下都是我实际跑过或者评估过的方案类型典型工具优势劣势适合场景通用OCR大模型各类云端OCR API识别率高无需训练按量收费需联网有隐私顾虑票据量小、字段复杂的场景轻量专用OCR库ddddocr这类开源库免费、本地运行、针对验证码优化复杂干扰下需调参大多数算术类验证码模板匹配OpenCV模板匹配无依赖、极快验证码一变样式就失效固定不变的老式验证码打码平台人工/机器混合打码几乎能处理任何验证码成本高、依赖外部、时效差极难识别的兜底方案国税查验平台的验证码我实测下来是四则运算题型——给一个类似35?或者8×2?的算术式子让你填结果。这种题目的特点是字符集小、干扰线不重、背景相对干净属于OCR里最好啃的一类。所以我最终选了开源轻量OCR库来做字符识别识别出算式字符串之后再用一个安全的表达式求值逻辑算出答案。为什么不用大模型API因为这里每张票都要过一次量大之后按量计费的成本很可观而且把发票数据往外部服务传很多财务是有合规顾虑的。注意选型时一定优先考虑本地运行的方案。发票信息属于企业经营数据能不出本地就不出本地这既是合规要求也是降低长期成本的关键。2.3 为什么把验证码识别和发票字段提取分开做这是我在踩坑之后才悟出来的一点。一开始我想用一个大而全的OCR把整张查验页面截图丢进去让它同时读验证码和读结果。结果发现两者对图像的要求完全相反验证码需要放大、二值化、去噪才能让字符轮廓清晰而查验结果区域是结构化文本过度二值化反而会破坏文字导致识别出错。所以我后来改成两条独立流水线一条专门处理验证码小图做图像增强后交给专用识别库另一条处理查验结果用通用OCR读文本再用正则去提取发票状态查验次数这些字段。分开之后两边的识别率都明显上去了调试也各自独立出问题能快速定位是哪一段的锅。3. 核心环节拆解从一张票到一条结构化记录3.1 发票图片的预处理决定了后面一半的成功率很多人忽视预处理直接把原始截图丢给识别引擎然后抱怨识别率太差。其实验证码识别里预处理占的功劳至少有六成。我处理这类算术验证码的标准动作是这样的第一步是灰度化。彩色图里那些干扰色
返回列表