Releases: jianRY/invoice-ocr-tool
Releases · jianRY/invoice-ocr-tool
Release list
发票识别汇总工具 v1.2.0
v1.2.0(2026-09-16)
新增:PDF 自动转图片(识别前置步骤)
- 目标文件夹里有 PDF 时,先逐页渲染成 JPG 再识别,命名
原文件名_页码.jpg(如票据.pdf→票据_1.jpg) - 三种情形各走各的路:
- 全是图片 → 完全跳过,行为与旧版一模一样
- 纯 PDF / PDF 与图片混装 → 在目标文件夹内新建「处理后」文件夹,PDF 转出的页图与原有图片
一起复制进去,之后的 OCR、Excel、「未识别」归档全部以该文件夹为工作目录
- 原 PDF 保留在原文件夹,不删除、不移动
- 幂等:同名产物已存在即跳过,重复运行不会产生
_2、_3副本 - 加密 / 损坏的 PDF 单独挑出来复制到「处理后/未识别」,并在完成提示里列出原因
- 界面上有「自动把 PDF 转成图片」开关(默认开启),需要临时跳过时可取消勾选
关键坑:PDF 渲染尺寸必须受控(输出宽 ≤ 1700px)
- 解析器里的列匹配容差(175px)、行聚类阈值(22px)都是按手机拍摄 / 扫描件那类
「宽度 1200~1900px、文字高约 29px」的图调出来的固定像素值 - 起初按 200 DPI 直接渲染,出来的图宽是原图的 2 倍,导致列配错、相邻行被合并,
明细全丢——但发票号码和价税合计仍然认得出来,症状极有迷惑性(显示"未识别",看不出原因) - 改法:按页面宽度算倍率,把输出宽卡在 1700px 以内。图片型 PDF 的字高与页面宽度成正比,
宽度固定后字高自然落回 25~28px 的甜点区;A4 矢量发票在 200 DPI 下字高约 28px,同样合适 - 附带好处:A3、高清扫描件这类大尺寸 PDF 也不会再踩这个坑
发版链路
- 打包显式收集 PyMuPDF 运行库(
--collect-all pymupdf),体积约 +30MB - 新增打包产物自检:发版时用刚打好的 exe 跑
InvoiceOcrTool.exe --selftest <目录>,
确认包内 PDF 转换真的可用才继续发版,防「本地跑得好、用户装完报错」
(应急可加--skip-exe-check跳过)
实测
- 转换逻辑 6 类场景 36 项断言全通过:纯图片零副作用、纯 PDF、混装、加密 PDF、损坏 PDF、
12 页分页命名、幂等、输出尺寸约束、A4 扫描件 - 端到端:混合目录 5 张图(2 张原始图片 + 3 张 PDF 转出)全部识别成功,Excel 正常导出
- 回归:70 张真实票据图,
parser.py未改动,识别结果与 v1.1.2 逐张比对完全一致
发票识别汇总工具 v1.1.2
v1.1.2(2026-09-16)
发版链路加固:把「宝塔脚本能自动更新到新版网页」变成机器保证
- 新增
verify_assets():发版后硬校验 Release 上的两个资产名与本地字节数一致,
缺一个或大小不符直接中止发版(以前只判"上传接口返回成功") - 新增
check_page_names():校验线上展示页里出现的下载文件名与本版资产名完全一致- 背景:服务器上的
deploy/update_site.sh是按页面里的InvoiceOcrTool_v<版本>拼出
Release 文件名去镜像 exe 的,名字对不上就是 404;而脚本对 404 的处理是"保留 GitHub 原链接",
也就是镜像静默失效、不报错,很容易一直没人发现
- 背景:服务器上的
release.py顶部固化了三步发版约定:①网页同步 ②双 exe 且自签名 ③发版推送
发票识别汇总工具 v1.1.1
v1.1.1(2026-09-16)
重写:站点更新脚本改为纯 bash 单文件(不再依赖 Python)
deploy/update_site.sh自包含,宝塔「计划任务 → Shell 脚本」里整段粘贴即可运行,服务器上不需要 Python- 顶部集中配置:
WEB_DIR(网站根目录)、MIRROR_EXE(默认 1,镜像双 exe)、PROXY、KEEP_BAK、KEEP_EXE - 页面三源容灾(GitHub Pages → raw.githubusercontent → jsDelivr)+ 内容校验(>3KB 且含 4 项特征标记),校验不过拒绝覆盖
- exe 四源容灾(直连 GitHub → ghfast.top → ghproxy.net → gh-proxy.com),下完校验「远端大小相符 + >5MB + 开头 MZ」,残包或错误页直接丢弃换源
- 只改写下载成功的那个链接:某个 exe 失败时它在页面里保持 GitHub 原地址,不会产生死链
- 原子替换(
.tmp+mv)+ 自动备份 5 份到_webbak/+ 旧版 exe 自动清理(默认保留 2 个版本) - 幂等:同版本 exe 已存在且校验通过即跳过下载,定时任务反复跑无副作用(实测二次运行 6 秒完成)
文档
deploy/README.md重写为 bash 版部署说明(一步粘贴、变量表、安全属性、常见问题)- 展示页 FAQ 同步更新为 bash 脚本说明
- 发版脚本
release.py现在会把deploy/一并同步到交付目录,避免手工漏拷
发票识别汇总工具 v1.1.0
v1.1.0(2026-09-16)
新增:站点自动更新脚本(宝塔面板 / 任意 Linux 服务器)
deploy/update_site.py—— 纯 Python 3 标准库,无需安装任何第三方包- 多源回退拉取最新展示页:GitHub Pages → raw.githubusercontent → jsDelivr CDN → 自定义源
- 内容校验(必须含版本标记等特征),拉到错误页/拦截页时拒绝覆盖站点
- 原子写入 + 自动备份(保留最近 5 份
index.html) - 幂等:内容哈希不变即跳过写入,定时任务反复跑无副作用
--mirror-exe:把单文件版 / 安装版镜像到站点downloads/,并把页面里的下载链接
自动改写为本站相对路径,国内用户直接从自己的服务器下载- 输出
version.json(当前版本、发布时间、已镜像资产),供前端或监控读取
deploy/update_site.sh—— 宝塔「计划任务」包装脚本deploy/README.md—— 部署步骤、参数表与常见问题
改进:发版链路加固
- 展示页更新改为硬校验:替换后若页面仍残留旧版本号,立即中止发版(此前是静默通过)
- 发版推送后自动校验线上 GitHub Pages 版本号是否已生效,默认最多等 180 秒,失败仅告警
展示页
- 新增 FAQ:从 GitHub 下载太慢怎么办(自建镜像站点说明)
发票识别汇总工具 v1.0.0
v1.0.0(2026-09-16)
首个正式发布版本。
核心功能
- 选定文件夹后批量识别其中全部票据图片(jpg / jpeg / png / bmp / webp / tif / tiff)
- 本地离线 OCR(RapidOCR + ONNX Runtime),图片不上传、不联网
- 识别失败的图片自动复制到票据文件夹下的「未识别」子文件夹(自动新建),原图保留
- 导出
发票识别汇总.xlsx,含「票据汇总」与「明细」双表,含项目金额合计与价税合计
票据覆盖
- 增值税电子普通发票(数电票)
- 全国通用电子统一票据(医院电子票据)
- 财政医疗收费票据明细页
- 药房小票、陪护费等常见票种
交付形态
- 单文件绿色版 exe,双击即用
- Inno Setup 安装版 exe,带快捷方式与卸载项
- 两个 exe 均使用 SHA256 代码签名证书签名
识别效果(62 张真实票据实测)
- 58 张识别成功,4 张失败(住院费用清单附件页,预期行为)
- 成功票据价税合计 50 / 50 与人工核对一致
已知限制
- 多页票据按单张图片识别,住院费用清单附件页会被归入「未识别」
- 单文件版首次启动需自解压,约 5~10 秒