Skip to content

Releases: jianRY/invoice-ocr-tool

发票识别汇总工具 v1.2.0

Choose a tag to compare

@jianRY jianRY released this 16 Sep 12:43

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

Choose a tag to compare

@jianRY jianRY released this 16 Sep 12:03

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

Choose a tag to compare

@jianRY jianRY released this 16 Sep 11:53

v1.1.1(2026-09-16)

重写:站点更新脚本改为纯 bash 单文件(不再依赖 Python)

  • deploy/update_site.sh 自包含,宝塔「计划任务 → Shell 脚本」里整段粘贴即可运行,服务器上不需要 Python
  • 顶部集中配置:WEB_DIR(网站根目录)、MIRROR_EXE(默认 1,镜像双 exe)、PROXYKEEP_BAKKEEP_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

Choose a tag to compare

@jianRY jianRY released this 16 Sep 11:37

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

Choose a tag to compare

@jianRY jianRY released this 16 Sep 11:15

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 秒