财务报销表单实现发票批量上传与校验,核心是前端多文件选择与基础校验(accept限制类型、filereader验证文件头、生成预览)、后端按格式解析(pdf/ofd文本提取、jpg/png ocr识别、xml/json结构化解析)、统一映射为标准字段,并调用税务平台验真、校验码算法、防重号及金额偏差检查,最终按细分错误码逐项反馈并支持单独重传。

财务报销表单中实现发票批量上传与校验,核心是前端支持多文件选择 + 后端解析验证 + 前端即时反馈。不依赖复杂框架也能落地,关键是分清职责:浏览器负责选文件和初步格式/大小检查,服务端负责真实发票结构校验(如PDF/A、OFD解析、OCR识别或对接税务平台验真)。
前端支持多文件上传与基础校验
使用原生 即可触发多文件选择。关键点在于限制类型和大小,并实时展示上传状态:
- 通过 accept="application/pdf,.ofd,.jpg,.jpeg,.png" 约束常见发票格式
- 遍历 FileList 检查单个文件大小(例如 ≤10MB),跳过超限项并提示用户
- 用 FileReader 预读 PDF/JPG/PNG 的前几百字节,简单判断是否为有效文件头(如 PDF 的
%PDF-),避免上传明显损坏文件 - 上传前生成每张发票的临时预览缩略图(图片类)或文件名+大小+图标,提升交互体验
后端接收并解析发票内容
服务端需区分发票类型处理:
- 电子发票(PDF/OFD):调用 PDF.js 或 Apache PDFBox 解析文本层;OFD 需专用库(如 ofd-parser)提取发票代码、号码、金额、开票日期等关键字段
- 扫描件/照片(JPG/PNG):集成轻量 OCR 服务(如 PaddleOCR 本地部署或阿里云OCR API),定位并识别发票四要素(发票代码、号码、金额、校验码)
- 结构化数据(XML/JSON):直接解析,校验签名与税务平台返回格式一致性
- 所有解析结果统一映射为标准字段,用于后续比对与验真
发票真实性与逻辑校验
校验不能只靠“能读出数字”,必须结合业务规则:
- 调用国家税务总局“发票查验平台”API(需企业税号+发票信息)验证发票真伪与状态(是否作废、红冲)
- 检查发票代码长度、校验码算法(如15位代码第15位为模11校验)、金额小数位数(通常2位)
- 同一报销单内禁止重复发票代码+号码组合(防重复报销)
- 金额合计与报销申请金额偏差超过±0.01元时标为异常,需人工复核
上传结果反馈与错误归因
用户需要明确知道哪张票出了什么问题,而不是笼统提示“上传失败”:
- 响应 JSON 中为每个文件返回独立状态:success / format_error / size_exceed / ocr_fail / tax_check_reject 等细分码
- 前端按状态渲染不同图标与文字(如红色叹号+“校验码不匹配,请核对发票原件”)
- 允许用户单独删除某张失败发票,重新上传,不中断其余成功项
- 提供“一键下载错误明细表(Excel)”功能,含文件名、错误类型、建议操作,便于财务复核
整个流程不需要一步到位,可先做前端多选+大小校验+后端存文件,再逐步接入 OCR 和税务验真。关键是把校验环节拆解清楚,每步有明确输入输出,避免把所有逻辑堆在前端或全压给后端。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











