Laravel收到账单PDF后,先确认提取字段,再写入业务表

账单PDF识别出金额后,不应立即写入正式业务表。先把候选字段和原文件放在一起确认,能避免将缺失日期、零折扣或错误金额静默带入系统。
本例用教学账单BILL-271,金额135.60元、折扣0.00、到期日未填写。
解析结果与候选字段分开
先用ComPDF全文解析接口取得实际输出。本次JSON包含正文和表格;应用再针对这个教学模板提取金额与折扣。不要把应用的正则映射说成接口已经直接返回了账单业务对象。
教学包包含输入、实际解析结果和 examples/laravel 完整示例,下载需要能访问Google Drive。解压后先在 examples/laravel 运行 composer install,再回到包的根目录执行:
php examples/laravel/review-check.php results/invoice-parsed/result_json.json samples/invoice.pdf
程序读取包中预先保存的解析JSON和原PDF,检查候选字段、确认写入和重复确认。它不会重新调用ComPDF API;测试使用本地SQLite,不连接实际财务系统。环境需有Laravel的正常依赖,包括mbstring与PDO SQLite。
确认后才进入事务
金额用带两位小数的字符串校验,本例存储也用字符串;生产表可以选择适当的定点类型。不要先转成浮点数再计算。
$validated = Validator::make($input, [
'amount' => ['required', 'regex:/^\d+\.\d{2}$/'],
'discount' => ['required', 'regex:/^\d+\.\d{2}$/'],
'due_date' => ['nullable', 'date_format:Y-m-d'],
])->validate();
0.00是明确的零值,未填写的到期日保持null。确认接口还应使用应用既有的登录、权限和CSRF保护;教学CLI没有替代这些入口控制。

图:教学账单解析后的候选金额、零折扣与空日期;字段确认流程示意
重复确认不要重复建记录
教学表对源文件哈希设置唯一约束,同一文件再次确认返回已有记录。正式应用还应加上租户范围和业务版本规则;文件内容相同并不总表示业务操作相同。
确认写入放在事务内,并记录原始解析结果与人工修改,不覆盖原件。示例只覆盖顺序重复确认,不用它证明并发请求已经处理完善。
验收读回的数据
本次PHP 8.4.27、Laravel 12.69.3检查通过:确认前没有记录、重复确认只有一条、折扣仍是0.00、日期仍为空、非法金额被拒绝。框架检查与ComPDF解析结果要分别保存,便于定位问题。
后续需要多模板、分类或更完整处理流程时,可评估DocSlight。本例没有测试DocSlight企业功能,也没有作财务合规或全自动入账承诺。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: