关于 receipt-compiler
Receipt Compiler 将手机拍摄的收据照片整理为 A4 报销 PDF,支持图像校正、OCR、排版和可选封面。适用于汇总报销收据;生成 PDF 前必须审核并确认数据,确认后会校验数据是否被修改。
主要功能
- 01校正收据照片并生成扫描效果
- 02通过 OCR 提取费用数据
- 03审核并确认提取的数据
- 04在 A4 页面排列收据并可编号
- 05生成可选的汇总封面
适用场景
- 01将收据照片整理成报销文件
- 02核对 OCR 提取的日期、商户和金额
- 03制作分页的 A4 收据材料
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ moonlight-lupin/ agent-skills --skill receipt-compiler安装后在 Claude Code 中输入/receipt-compiler确认已加载。
附带文件scripts/receipt_compiler.pytests/receipt_compiler_selftest.py
详细介绍
Receipt Compiler
概述
Receipt Compiler 可将一个文件夹中的手机拍摄收据照片转换为一份 A4 PDF,效果类似复印的报销材料:每张收据都会校正(透视变换、倾斜校正),转换为黑白“扫描件”效果,以统一的视觉比例排布在 A4 页面上并编号,还可选择在封面页汇总信息。
包含四个子命令,并强制执行确认关卡:
scan— 校正每张照片、转换为扫描件效果并进行 OCR →manifest.jsonreview— 打印提取出的费用表格confirm— 标记用户已批准,并绑定已审核的数据(摘要)pack— 生成 A4 PDF(运行前必须先执行confirm)
适用场景
- “把我的收据整理成一份报销用 PDF”
- “用这些收据照片制作一份报销材料”
- “校正这些收据并转成黑白,然后排在 A4 页面上”
- 不适用于:使用平板扫描仪扫描,或处理发票 PDF(请使用
pdf技能)。
前置条件
pip install opencv-python-headless pillow pillow-heif pytesseract reportlab numpy
# PyMuPDF is needed only to run the self-test (tests/), not the script itself
还需确保系统已安装 tesseract-ocr,且位于 PATH 中。使用 tesseract --version 检查。
工作流(Agent 必须遵守确认关卡)
步骤 1 — scan
python3 ~/.hermes/skills/productivity/receipt-compiler/scripts/receipt_compiler.py \
scan <photos_dir> -o <workdir> [--mode bw|photo]
默认的 --mode bw 会生成用户要求的复印件效果。使用 --mode photo
可转换为灰度图。完成标准:清单文件已生成,且每张照片对应一个条目;
已设置 ocr_confidence 和 needs_review 标记。
步骤 2 — review + confirm(必须执行,用户参与)
python3 .../receipt_compiler.py review <workdir>
# ... apply any corrections to manifest.json, THEN re-run review so the user
# ... sees the corrected table ...
python3 .../receipt_compiler.py review <workdir>
# ... after the user approves the corrected table ...
python3 .../receipt_compiler.py confirm <workdir>
在聊天中向用户展示打印出的表格。询问:
- 提取出的日期、商家和金额是否正确?请修正
manifest.json中的字段。 - 可选要求——每次都要询问,不要自行假设:
- 是否需要封面页(包含报销人、报销期间和备注)
- 是否需要为每张收据添加编号徽标
- 是否需要为每张收据添加说明文字(日期 · 商家 · 金额)
- 合计金额是否需要显示货币符号
- 排除项——是否需要移除任何收据(
"include": false)? - 封面上的用途/备注文本。
只有在用户批准后,才能运行 confirm <workdir>。该命令会设置
confirmed: true,并绑定批准时所审核字段的 review_digest。
在运行 confirm 后进行任何编辑(日期、金额、货币、是否纳入)都会导致 pack 拒绝运行,直到重新运行 confirm——这意味着要再次向用户展示修改后的表格。没有绕过标记。运行 confirm 之前,先将用户的修正应用到 manifest.json。
步骤 3 — pack
python3 .../receipt_compiler.py pack <workdir> -o claim.pdf \
[--cover --number --captions] \
--title "Expense Claim — <purpose>" --claimant "MH" --period "..." --notes "..."
完成标准:PDF 已生成,并在 JSON 输出中报告页数。 然后通过当前活动渠道将 PDF 作为文档/文件发送给用户。
排版规则(收据的排列方式)
- A4 纵向,边距 15 mm,间距 5 mm。
- 特别长的收据(宽高比 ≥ 2.2)每行排 3 张并占满行高; 普通收据每行排 2 张,高度上限为内容区高度的 52%(约占整页的 47%)。 按单元格进行缩放 (每张收据填满其单元格);收据较少的行会使用更宽的单元格。
- 每张图片都会按比例缩放——不变形、不裁切。
- 收据会依次排到后续页面;30 张以上也能正常排版。
- 长收据先于普通收据打印;如有需要,可通过清单调整顺序。
常见问题
- 跳过确认关卡 — 如果
confirmed: false、确认值不是布尔值,或确认后又进行了编辑(摘要校验),pack会直接失败。 没有绕过标志;必须先向用户展示表格。 - 照片昏暗或有阴影 — 2/98 百分位拉伸可以处理大多数情况;如果 OCR 置信度低于 55,或未提取到金额,该条目会被标记为
needs_review;请将这些条目展示给用户。 - 透视校正失败 — 光面或起皱的收据可能无法生成干净的四边形;脚本会退回到对整个画面进行小角度倾斜校正。检查清单中的
method;如果收据明显需要裁剪,但方法为deskew,请使用 PIL 手动修正裁剪,或接受当前取景。 - HEIC 照片 — iPhone 照片格式为 .heic;如果已安装
pillow-heif,它可以处理这些照片。如果未安装,请向用户索要 JPG 文件,或安装pillow-heif。 - 多种货币 — 总额按货币分组(审核输出和封面页会为每种货币单独打印一行,不会计算合计)。为使报销申请更清晰,每个包只使用一种货币;切勿将有效金额归零或编辑有效金额来强行合并计算总额。
- 封面表格中的长描述 — 描述会在 70 个字符处截断;请保持封面备注简短,或将详细信息放入
notes。
验证清单
-
scan已生成 manifest.json,且每张照片对应一个条目 - 已向用户展示
review表格;已将更正应用到清单 - 每次都询问可选要求(封面/编号/说明文字)
- 仅在用户批准后运行
confirm(绝不手动编辑confirmed) - PDF 输出文件已生成,页数符合预期
- 已将 PDF 发送给用户,并附上正确的输出路径