Files
Auto-Finance/README.md
2026-05-25 12:00:06 +08:00

148 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 财务报销自动化
自动从 PDF 发票提取信息OCR 识别支付记录截图,然后在财务系统中自动填报报销单。
## 项目结构
```
├── run.py # CLI 入口
├── config.json # 配置文件(登录凭据、系统 URL 等)
├── app/
│ ├── config.py # 配置加载
│ ├── extractor.py # PDF 发票信息提取
│ ├── ocr.py # OCR 刷卡信息识别
│ ├── bot.py # 浏览器自动填报
│ └── pipeline.py # 流程编排(数据在内存中流转)
├── web/
│ ├── app.py # Web 服务入口
│ ├── templates/
│ │ ├── index.html # Web 前端页面
│ │ └── mobile_upload.html # 移动端扫码上传页面
│ └── uploads/ # 用户上传文件目录
├── *.pdf # 发票 PDF按需放置
├── *.png / *.jpg # 与 PDF 同名的支付截图
├── invoice_summary.csv # 中间产物 — 发票汇总表
└── images/ # 调试截图
```
## 数据流
```
PDF 文件 ──► extractor 提取 ──► 发票列表
支付截图 ──► OCR 识别 ────────────► 回填刷卡信息
invoice_summary.csv
bot 打开浏览器 ──► 自动填报
```
## 环境要求
- Python 3.10+
- 依赖见下方安装步骤
## 快速开始
### 1. 安装依赖
> 以下依赖需在 MinerU 虚拟环境中安装:
> ```bash
> conda activate MinerU
> ```
```bash
pip install pdfplumber==0.11.9 paddleocr==2.8.1 playwright==1.60.0 flask==3.0.3
playwright install chromium
```
### 2. 准备数据
将发票 PDF 和对应的支付截图放在项目根目录下。脚本会自动匹配 PDF 与截图:
1. **优先文件名匹配** — PDF 与截图同名(如 `发票.pdf``发票.png`
2. **金额近邻匹配** — 文件名不同时,自动提取 PDF 的价税合计和截图的刷卡金额进行配对
截图支持格式:`.png``.jpg``.jpeg``.bmp``.webp`
```
### 3. 配置
编辑 `config.json`,填写登录凭据和默认值:
```json
{
"username": "你的工号",
"password": "你的密码",
"default_name": "默认报销人姓名",
"default_card_no": "默认公务卡号",
"default_person_id": "默认人员编号"
}
```
未填写的字段将使用默认值URL 类配置一般无需修改。
### 4. 运行
```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 密码
```
## 执行步骤说明
| 步骤 | 命令 | 说明 |
|------|------|------|
| 发票提取 | `--step invoice` | 扫描根目录 PDF提取发票号码、金额、销售方等信息生成 `invoice_summary.csv``.md` |
| OCR 识别 | `--step ocr` | 对支付截图执行 OCR识别刷卡日期、刷卡金额、持卡人姓名回填到 CSV |
| 浏览器填报 | `--step submit` | 打开浏览器,登录信息门户 → 进入报销系统 → 自动填单、录入明细、上传附件 |
> 分步执行时,上一步的 CSV 产物会自动成为下一步的输入。
## Web 服务
提供浏览器界面,上传文件即可自动处理:
```bash
python web/app.py
```
访问 `http://localhost:5000`,上传文件并填写配置后点击「开始处理」。
### 两种处理模式
| 模式 | 入口 | 说明 |
|------|------|------|
| **PDF 模式** | 上传 PDF + 截图 | 自动提取发票信息 → OCR 识别刷卡记录 → 生成 CSV → 可选浏览器填报 |
| **CSV 快捷模式** | 上传已有 CSV 文件 | 跳过提取和 OCR直接使用 CSV 数据进行浏览器填报 |
### 功能说明
| 功能 | 说明 |
|------|------|
| 发票提取 + OCR | 上传 PDF 后自动完成,无需手动操作 |
| CSV 快捷上传 | 已有发票数据 CSV 可直接上传,跳过前面的步骤 |
| 浏览器填报 | 勾选「同时提交到财务系统」后自动运行 |
| 实时日志 | 处理进度通过 SSE 实时推送 |
| 下载 CSV | 处理后下载发票汇总表 |
| 配置上传 | 可上传 `config.json` 自动填充表单 |
| 手机扫码上传 | 支付截图区域显示二维码,手机端扫码后可拍照/选图上传PC 端实时同步接收 |
> Web 模式下浏览器以无头模式运行,不会弹出窗口。
> 若未上传 PDF 附件,浏览器填报阶段将自动跳过附件上传步骤。
## 注意事项
- 第三步会打开浏览器窗口,请勿关闭或切换标签页
- 首次运行可能需要手动处理 SSO 登录(如已保存会话则跳过)
- 调试截图保存在 `images/` 目录,出错时可查看
- `invoice_summary.csv` 中空白的字段会在 OCR 步骤自动回填,不会覆盖已有数据
- 提交按钮默认未启用,确认数据无误后可在 `app/bot.py` 中取消注释 `bot.submit()`