146 lines
5.0 KiB
Markdown
146 lines
5.0 KiB
Markdown
# 财务报销自动化
|
||
|
||
自动从 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 前端页面
|
||
│ └── 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` 自动填充表单 |
|
||
|
||
> Web 模式下浏览器以无头模式运行,不会弹出窗口。
|
||
> 若未上传 PDF 附件,浏览器填报阶段将自动跳过附件上传步骤。
|
||
|
||
## 注意事项
|
||
|
||
- 第三步会打开浏览器窗口,请勿关闭或切换标签页
|
||
- 首次运行可能需要手动处理 SSO 登录(如已保存会话则跳过)
|
||
- 调试截图保存在 `images/` 目录,出错时可查看
|
||
- `invoice_summary.csv` 中空白的字段会在 OCR 步骤自动回填,不会覆盖已有数据
|
||
- 提交按钮默认未启用,确认数据无误后可在 `app/bot.py` 中取消注释 `bot.submit()` |