一个基于 FastAPI 和 React 的 PDF 发票处理系统,支持电子发票的金额汇总、重复检测、合并和打印格式生成,同时提供费用报销相关的表单功能。
- python 3.12
- node v20
- docker v18 +
- docker-compose v2.40 +
- 金额汇总:自动从 PDF 发票中提取金额并计算总和(支持电子发票、铁路票等)
- 重复检测:检测文件夹中的重复发票号码
- PDF 合并:将多个 PDF 发票文件合并为一个文件
- 打印格式:生成适合打印的 2x2 布局格式(N-up)
- 差旅费报销单:差旅费用报销表单
- 出差补助申请表:出差补助申请表单
- 费用报销单:通用费用报销表单
- 票证粘贴单:票证粘贴表单
- 框架:FastAPI
- Python 版本:3.10+
- PDF 处理库:
pypdf(6.1.1)PyPDF2(3.0.1)pdfminer.six(20250506)
- Web 服务器:Uvicorn
- 框架:React 18 + TypeScript
- UI 组件库:Ant Design 5
- 构建工具:Rsbuild
- 路由:React Router 7
- HTTP 客户端:Axios
pdf-invoices/
├── server/ # 后端服务
│ ├── main.py # FastAPI 主应用
│ ├── summer.py # 金额汇总模块
│ ├── number.py # 发票重复检测模块
│ ├── margin.py # PDF 合并模块
│ ├── print.py # 打印格式生成模块
│ ├── pdfs/ # PDF 文件存储目录
│ ├── static/ # 静态文件目录
│ └── requirements.txt # Python 依赖
├── web/ # 前端应用
│ ├── src/
│ │ ├── pages/ # 页面组件
│ │ ├── components/ # 通用组件
│ │ ├── api/ # API 接口
│ │ └── utils/ # 工具函数
│ └── package.json # 前端依赖
├── scripts/ # 部署脚本
│ ├── Dockerfile # Docker 镜像构建文件
│ └── docker-compose.yaml # Docker Compose 配置
└── images/ # 图片资源
- Python 3.10+
- uv 0.9 +
- Node.js 18+ (推荐使用 pnpm)
- 安装 Python 依赖:
cd server
uv sync- 启动后端服务:
uv run main.py后端服务将在 http://localhost:8000 启动。
- 安装前端依赖:
cd web
pnpm install- 启动开发服务器:
pnpm dev前端应用将在 http://localhost:3000 启动。
- 构建生产版本:
pnpm build构建完成后,将 web/dist 目录中的文件复制到 server/static 目录。
GET /api/info
返回 PDF 文件夹路径信息。
GET /api/summer
返回所有 PDF 发票的总金额。
GET /api/check
返回重复的发票号码列表。
GET /api/margin
将 pdfs/ 目录中的所有 PDF 文件合并为 all_invoices.pdf。
GET /api/print
将 all_invoices.pdf 转换为 2x2 布局的打印格式,输出为 print_output.pdf。
cd scripts
docker build -t invoices-server-image -f Dockerfile ..cd scripts
docker-compose up -d服务将在 http://localhost:8000 启动。
-
准备 PDF 文件:将需要处理的 PDF 发票文件放置在
server/pdfs/目录中。 -
金额汇总:
- 通过 Web 界面点击"金额汇总"按钮
- 或直接调用 API:
GET /api/summer
-
重复检测:
- 通过 Web 界面点击"重复检测"按钮
- 或直接调用 API:
GET /api/check
-
合并 PDF:
- 通过 Web 界面点击"合并 PDF"按钮
- 或直接调用 API:
GET /api/margin - 合并后的文件将保存为
server/all_invoices.pdf
-
生成打印格式:
- 通过 Web 界面点击"生成打印格式"按钮
- 或直接调用 API:
GET /api/print - 打印格式文件将保存为
server/print_output.pdf
- 访问首页,选择相应的表单类型
- 填写表单信息
- 点击"打印"按钮进行打印或保存为 PDF
- PDF 文件路径:确保 PDF 文件放置在正确的目录中(默认:
server/pdfs/) - 文件格式:支持标准 PDF 格式的电子发票和铁路票
- 金额提取:系统会自动识别发票中的金额,如果识别失败,会在控制台显示错误信息
- 发票号码:系统支持提取 16-20 位的发票号码进行重复检测
- 后端代码位于
server/目录 - 主要 API 接口定义在
server/main.py - 各个功能模块位于独立的 Python 文件中
- 前端代码位于
web/目录 - 使用 Rsbuild 作为构建工具
- 页面组件位于
web/src/pages/ - API 调用封装在
web/src/api/
欢迎提交 Issue 和 Pull Request!