feat: Web 表格编辑、易耗品出库单自动生成与文档完善

- 新增 fill_consumable_doc,根据 CSV 填写 Word 出库单(宋体五号)
- Web 处理完成后自动生成出库单并提供下载
- 前端拆分为 static 资源,支持在线编辑 CSV 与分步提交财务系统
- 补充 API.md、README(含 Mermaid 数据流)及 config.example.json

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
wandering
2026-05-26 14:17:26 +08:00
parent 70f61be3aa
commit a72c4ffaab
12 changed files with 1674 additions and 442 deletions

182
README.md
View File

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