# 财务报销自动化 自动从 PDF 发票提取信息,OCR 识别支付记录截图,生成发票汇总表与易耗品出库单,并可选在财务系统中自动填报报销单。 ## 项目结构 ``` ├── run.py # CLI 入口(发票提取 → OCR → 浏览器填报) ├── config.json # 配置文件(登录凭据、默认值、存放地点等) ├── 易耗品、出库单.doc # 易耗品出库单 Word 模板(Web/CLI 填写用) ├── app/ │ ├── config.py # 配置加载 │ ├── extractor.py # PDF 发票信息提取 │ ├── ocr.py # OCR 刷卡信息识别 │ ├── bot.py # 浏览器自动填报 │ ├── pipeline.py # CLI 流程编排 │ └── fill_consumable_doc.py # 将 CSV 填入易耗品出库单(Word COM) ├── web/ │ ├── app.py # Web 服务入口 │ ├── templates/ │ │ ├── index.html # PC 端主页 │ │ └── mobile_upload.html # 移动端扫码上传 │ ├── static/ # 前端 CSS / JS │ └── uploads/ # 按会话隔离的上传与产物目录 ├── *.pdf # 发票 PDF(CLI 模式,放在项目根目录) ├── *.png / *.jpg # 与 PDF 配对的支付截图 ├── invoice_summary.csv # 发票汇总表(CLI 产物) └── images/ # 浏览器调试截图 ``` ## 数据流 ```mermaid flowchart TB PDF[PDF 发票] --> Extract[extractor 提取] Extract --> List[发票列表] Img[支付截图] --> OCR[OCR 识别] List --> OCR OCR --> CSV[(invoice_summary.csv)] CSV --> Fill[fill_consumable_doc] Fill --> Doc[易耗品、出库单.doc] CSV --> Bot[bot 浏览器自动化] Bot --> Submit[财务系统填报
可选] ``` ## 环境要求 - Python 3.10+ - Windows(易耗品出库单填写依赖 Microsoft Word + COM,仅 Windows 可用) - 主要依赖见下方安装步骤 ## 快速开始 ### 1. 安装依赖 > OCR 相关依赖建议在已有 PaddleOCR 的环境中安装(如 MinerU 虚拟环境)。 ```bash pip install pdfplumber==0.11.9 paddleocr==2.8.1 playwright==1.60.0 flask==3.0.3 pywin32 playwright install chromium ``` | 依赖 | 用途 | |------|------| | pdfplumber | PDF 发票文本提取 | | paddleocr | 支付截图 OCR | | playwright | 财务系统浏览器自动化 | | flask | Web 服务 | | pywin32 | 填写 Word 出库单(`fill_consumable_doc`) | ### 2. 准备数据(CLI 模式) 将发票 PDF 和对应的支付截图放在项目根目录下。脚本会自动匹配 PDF 与截图: 1. **优先文件名匹配** — PDF 与截图同名(如 `发票.pdf` ↔ `发票.png`) 2. **金额近邻匹配** — 文件名不同时,按价税合计与刷卡金额就近配对 截图支持格式:`.png`、`.jpg`、`.jpeg`、`.bmp`、`.webp`。 ### 3. 配置 编辑 `config.json`: ```json { "username": "你的工号", "password": "你的密码", "default_name": "默认报销人姓名", "default_card_no": "默认公务卡号", "default_person_id": "默认人员编号", "consumable_storage": "躬行楼 C205" } ``` | 字段 | 说明 | |------|------| | `username` / `password` | 信息门户登录凭据 | | `default_name` | 默认报销人姓名 | | `default_card_no` | 默认公务卡号 | | `default_person_id` | 默认人员编号(工号) | | `consumable_storage` | 出库单「存放地点」列默认值 | | `sso_login_url` 等 | 系统 URL,一般无需修改 | ### 4. 运行(CLI) ```bash # 全流程(发票提取 → OCR 识别 → 浏览器填报) python run.py # 仅执行某一步 python run.py --step invoice # 仅发票提取 python run.py --step ocr # 仅 OCR 识别 python run.py --step submit # 仅浏览器填报 # 覆盖配置中的登录凭据 python run.py -u 工号 -p 密码 ``` ### 5. 填写易耗品出库单(CLI) 需已生成 `invoice_summary.csv`,且本机已安装 **Microsoft Word**: ```bash python -m app.fill_consumable_doc python -m app.fill_consumable_doc --csv invoice_summary.csv --doc "易耗品、出库单.doc" python -m app.fill_consumable_doc --no-backup # 不生成 .doc.bak 备份 ``` 填写规则概要: - 表头「日期」使用**填写当天**的日期(非发票开票日期) - 从 `规格型号` 解析品名、规格、单位、数量、单价;`价税合计` 写入金额列 - 单价/金额保留两位小数;表格内统一为 **宋体五号(10.5 磅)** - 存放地点取自 `consumable_storage`;购货人/领用人签字、备注保持空白 ## 执行步骤说明 | 步骤 | 命令 | 说明 | |------|------|------| | 发票提取 | `--step invoice` | 扫描根目录 PDF,生成 `invoice_summary.csv` / `.md` | | OCR 识别 | `--step ocr` | 识别支付截图,回填刷卡日期、金额、持卡人等到 CSV | | 浏览器填报 | `--step submit` | 登录信息门户 → 报销系统 → 自动填单、上传附件 | > 分步执行时,上一步的 CSV 会自动成为下一步的输入。 ### CSV 字段说明 | 列名 | 说明 | |------|------| | 序号 | 行号 | | 发票号码 | 电子发票号码 | | 开票日期 | 开票日期 | | 项目名称 / 规格型号 | 货物或应税劳务信息 | | 价税合计 | 发票含税金额 | | 销售方名称 | 销方名称 | | 人员姓名 / 刷卡日期 / 公务卡号 / 刷卡金额 | OCR 自支付截图回填 | | 备注 / 工号 | 可手工或 Web 端编辑补充 | ## Web 服务 提供浏览器界面:上传文件 → 自动处理 → 在线编辑 → 下载产物 → 可选提交财务系统。 ```bash python web/app.py ``` 访问 `http://localhost:5000`。 ### 推荐使用流程 1. 上传 PDF + 支付截图(或上传已有 CSV) 2. 填写配置(账号、密码、姓名、公务卡号、存放地点等),可上传 `config.json` 一键填充 3. 点击 **开始处理** — 完成发票提取、OCR、生成 CSV,并自动填写 **易耗品、出库单.doc** 4. 在 **下载文件** 区域下载 CSV / Markdown / 出库单 Word 5. 在表格中核对、修改发票数据(提交财务系统前会自动保存) 6. 确认无误后点击 **提交到财务系统** ### 处理模式 | 模式 | 入口 | 说明 | |------|------|------| | **PDF 模式** | 上传 PDF + 截图 | 提取发票 → OCR → 生成 CSV + 出库单 | | **CSV 快捷模式** | 仅上传 CSV | 跳过提取与 OCR,直接生成出库单并进入编辑/提交 | ### 功能一览 | 功能 | 说明 | |------|------| | 发票提取 + OCR | 上传 PDF 后自动完成 | | 易耗品出库单 | 处理完成后自动生成 Word,可下载 | | 表格在线编辑 | 处理完成后可修改 CSV 各字段;保存后重新生成出库单 | | 财务系统填报 | 单独按钮触发,处理阶段不会自动提交 | | 实时日志 | SSE 推送处理进度 | | 配置上传 | 支持上传 `config.json` 填充表单 | | 手机扫码上传 | 二维码打开移动端页面,拍照上传支付截图,PC 端轮询同步 | > Web 端浏览器填报以无头模式运行。未上传 PDF 时,填报阶段会跳过附件上传。 > 出库单生成需要 **Windows + Word + pywin32**;若失败,页面会显示具体原因,CSV 等其它产物仍可正常使用。 接口说明见 [API.md](./API.md)。 ## 注意事项 - 浏览器填报时会打开或使用 Chromium,请勿手动干扰自动化流程 - 调试截图保存在 `images/` 目录 - OCR 不会覆盖 CSV 中已有非空字段 - 项目根目录需保留 `易耗品、出库单.doc` 模板;Web 每次从模板复制到会话目录再填写,不修改原模板 - `config.json` 含敏感信息,请勿提交到公开仓库