🎯 专业的PDF文档智能录入解决方案
基于AI技术的结构化数据提取工具,专为房贷申请表、保险单据等复杂文档设计
OcDataEntry是一个现代化的PDF数据录入自动化系统,它将传统的人工数据录入工作转变为智能化流程。通过结合OpenAI的先进语言模型和专业的PDF解析技术,系统能够:
- 📄 自动识别:智能解析PDF文档中的文本信息
- � AI理解:使用GPT-5-mini深度理解文档内容和结构
- 📋 结构化输出:按照预定义的JSON Schema生成标准化数据
- � 人工核验:提供专业的核验工作台确保数据准确性
- 📊 批量处理:支持并发处理大量文档,提高工作效率
- 先进模型: 基于OpenAI GPT-5-mini,理解复杂文档结构
- 智能压缩: 自动清理空值字段,输出精简JSON(减少60-80%冗余)
- 容错处理: 智能处理文档格式差异和数据缺失情况
- 并发架构: 支持20+文件的并发API调用(5并发限制防止速率超限)
- 进度监控: 实时显示处理进度和每个文件的状态
- 文件对应: 每个PDF文件生成独立的JSON结果,精确对应
- 统一界面: 三栏布局(文件列表 | PDF预览 | JSON编辑)
- 连续操作: 一次进入,连续核验所有文件,无需频繁跳转
- 实时验证: JSON格式实时检查和优化统计显示
- 进度追踪: 已核验X/Y文件的清晰进度显示
- 标准化输出: 严格遵循JSON Schema,确保数据一致性
- 灵活配置: 支持自定义Schema,适应不同文档类型
- 类型安全: 自动数据类型转换和验证
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Web界面层 │ │ 业务逻辑层 │ │ 数据服务层 │
│ (Streamlit) │◄──►│ (streamlit_app) │◄──►│ (extract.py) │
│ │ │ │ │ (pdf_text.py) │
│ • 文件上传 │ │ • 并发处理 │ │ • OpenAI API │
│ • 进度显示 │ │ • 状态管理 │ │ • PDF解析 │
│ • 核验工作台 │ │ • 核验流程 │ │ • JSON处理 │
│ • 结果导出 │ │ • 错误处理 │ │ • 配置管理 │
└─────────────────┘ └──────────────────┘ └─────────────────┘
graph TD
A[上传PDF文件] --> B{选择处理模式}
B -->|批量模式| C[并发文本提取]
B -->|单独模式| D[逐个文本提取]
C --> E[并发AI数据提取]
D --> F[逐个AI数据提取]
E --> G[显示批量结果]
F --> H[显示单独结果]
G --> I[进入核验工作台]
H --> I
I --> J[PDF预览 + JSON编辑]
J --> K[保存并标记已核验]
K --> L{还有未核验文件?}
L -->|是| M[切换到下一个文件]
L -->|否| N[完成并导出]
M --> J
## 🚀 快速开始
### 系统要求
- **Python 3.9.6+** (推荐使用系统自带Python)
- **OpenAI API密钥** (支持GPT-5-mini模型)
- **稳定网络连接** (用于API调用)
- **现代浏览器** (Chrome、Firefox、Safari、Edge等)
### 1️⃣ 获取项目
```bash
git clone https://github.com/henrywen98/OcDataEntry.git
cd OcDataEntry
# 方式1: 使用 requirements.txt (推荐)
pip3 install -r requirements.txt
# 方式2: 手动安装核心依赖
pip3 install streamlit pdfplumber httpx pydantic pydantic-settings python-dotenv# 复制环境变量模板
cp .env.example .env
# 编辑配置文件
nano .env # 或使用你喜欢的编辑器在 .env 文件中设置你的OpenAI API密钥:
OPENAI_API_KEY=sk-proj-your_actual_openai_api_key_here
OPENAI_MODEL=gpt-5-mini🎯 推荐方式:使用一键启动脚本
python3 run_streamlit.py🔧 替代方式:直接运行Streamlit
streamlit run streamlit_app.py --server.port=8503启动成功后,浏览器会自动打开:
- 本地地址: http://localhost:8503
- 网络地址: http://你的IP地址:8503
- 📁 拖拽上传:直接拖拽PDF文件到上传区域
- 📂 点击选择:点击"Browse files"按钮选择文件
- 📊 支持格式:仅支持包含文本层的PDF文件
⚠️ 注意事项:不支持扫描件OCR(需要可选择文本)
🔄 单独处理模式
- 📝 适用场景:不同类型的表单、混合文档
- ⚡ 处理方式:每个PDF文件独立AI分析
- 🎯 特点:精确对应,每个文件生成独立JSON
📦 批量处理模式 (推荐)
- 📈 适用场景:相同类型表单的大批量处理
- 🚀 处理方式:并发AI调用(5并发控制)
- 💡 特点:高效处理20+文件,智能JSON压缩
- 🧠 智能提取:GPT-5-mini深度理解文档内容
- 🗜️ 自动压缩:移除空值字段,减少60-80%冗余
- 📊 实时统计:显示有效字段数、优化率等指标
- ⏱️ 进度监控:实时显示处理进度和文件状态
📊 批量处理完成
↓
🎯 [进入核验工作台 (N个文件)] ← 一键进入
↓
📋 核验工作台界面
┌──────────────┬────────────────┬────────────────┐
│ 文件列表 │ PDF预览 │ JSON编辑 │
│ │ │ │
│ 👉 ✅ file1 │ ┌────────────┐ │ ┌────────────┐ │
│ ⏳ file2 │ │ PDF │ │ │ JSON │ │
│ ⏳ file3 │ │ iframe │ │ │ Editor │ │
│ ... │ │ 显示 │ │ │ 实时验证 │ │
│ │ └────────────┘ │ └────────────┘ │
│ ╔══════════╗ │ │ ┌────────────┐ │
│ ║ 进度: 1/N ║ │ 上一个 | 下一个 │ │ 💾保存 ✅核验│ │
│ ╚══════════╝ │ │ └────────────┘ │
└──────────────┴────────────────┴────────────────┘
-
� 文件导航
- 左侧列表显示所有待核验文件
- 实时状态:✅已核验 / ⏳待核验 / 👉当前文件
- 点击任意文件名快速跳转
-
� PDF预览
- iframe原生PDF显示(保持原始格式)
- 降级文本显示(PDF预览失败时)
- 高度优化的预览窗口(500px高度)
-
📝 JSON编辑
- 实时语法检查和格式验证
- 优化统计显示(字段数、压缩率等)
- 一键保存并自动标记已核验
-
⚡ 批量操作
- 连续核验:保存后自动准备下一个文件
- 进度追踪:实时显示"已核验 X/Y 个文件"
- 一键退出:完成后统一导出所有结果
| 处理方式 | 20个文件处理时间 | 特点 |
|---|---|---|
| 串行处理 | ~10分钟 | 逐个调用API |
| 并发处理 | ~2分钟 | 5个文件同时处理 |
| 指标 | 优化前 | 优化后 | 改善 |
|---|---|---|---|
| 字段数 | 100-150个 | 20-40个 | ↓60-80% |
| 文件大小 | 数万字符 | 数千字符 | ↓70-85% |
| 可读性 | 充满空值 | 紧凑清晰 | 显著提升 |
- 🌐 前端界面: Streamlit (响应式Web界面)
- 📄 PDF解析: pdfplumber (高性能文本提取)
- 🤖 AI引擎: OpenAI GPT-5-mini (智能理解模型)
- ⚡ 异步处理: httpx + asyncio (并发网络调用)
- 📋 数据验证: JSON Schema + Pydantic (类型安全)
- 🔧 配置管理: python-dotenv (环境变量管理)
┌─────────────────────────────────────────────────────────────┐
│ 🌐 Streamlit Web界面 │
├─────────────────┬─────────────────┬─────────────────────────┤
│ 📁 文件上传 │ 🎮 核验工作台 │ 📊 结果展示 │
│ ⚙️ 模式选择 │ 🔍 PDF预览 │ 📈 统计分析 │
│ ⏱️ 进度监控 │ 📝 JSON编辑 │ 💾 数据导出 │
└─────────────────┴─────────────────┴─────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ 🧠 业务逻辑层 (streamlit_app.py) │
├─────────────────┬─────────────────┬─────────────────────────┤
│ 🔄 并发管理 │ 📋 状态管理 │ 🎯 核验流程 │
│ ⚡ 异步处理 │ 🔍 错误处理 │ 📊 优化统计 │
│ 📈 进度追踪 │ 💾 持久化 │ 🎮 用户交互 │
└─────────────────┴─────────────────┴─────────────────────────┘
│
┌─────────────────────────────────────────────────────────────┐
│ 📡 服务层 │
├─────────────────┬─────────────────┬─────────────────────────┤
│ 📄 PDF服务 │ 🤖 AI提取服务 │ ⚙️ 配置服务 │
│ (pdf_text.py) │ (extract.py) │ (config.py) │
│ │ │ │
│ • pdfplumber │ • OpenAI API │ • 环境变量管理 │
│ • 文本提取 │ • 异步调用 │ • JSON Schema │
│ • 错误处理 │ • 结果清理 │ • 类型验证 │
└─────────────────┴─────────────────┴─────────────────────────┘
- ✅ 包含文本层的PDF文件
- ✅ 由文字处理软件生成的PDF
- ❌ 扫描件PDF (需要OCR处理)
- ❌ 纯图片格式的PDF
- ❌ 加密或受保护的PDF
- 需要有效的OpenAI API密钥
- GPT-5-mini模型调用费用按OpenAI定价
- 大文件处理可能消耗更多token
- 建议在稳定网络环境下使用
- 单个PDF文件建议不超过50页
- 批量处理建议不超过20个文件
- 复杂表格可能需要更长处理时间
- 网络延迟会影响整体速度
✅ 支持的格式
- PDF文件包含可选择文本层
- 常见的表单类型:房贷申请表、保险单据、合同文档等
- 多语言支持(主要针对中英文优化)
❌ 不支持的格式
- 扫描件PDF(纯图片)
- 需要OCR处理的文档
- 加密或受保护的PDF文件
- 非标准编码的PDF文档
使用OpenAI GPT-5-mini模型的大概成本:
- 单个文档: $0.001 - $0.01 USD(取决于文档大小)
- 批量处理: 20个文档约 $0.05 - $0.20 USD
- 月度使用: 1000个文档约 $5 - $20 USD
注:实际成本取决于文档复杂度和文本长度
- 数据处理: 所有PDF文本会发送到OpenAI进行处理
- 隐私保护: 不存储任何上传的文件或处理结果
- 会话管理: 数据仅在浏览器会话中保持,关闭浏览器即清空
- API安全: 支持自定义API密钥,用户完全控制
❓ "JSON序列化错误"
# 检查datetime处理问题
python3 -c "from datetime import datetime; print(datetime.now().isoformat())"
# 确保所有时间戳都转换为ISO格式❓ "AI数据提取未启用"
# 验证API密钥设置
cat .env | grep OPENAI_API_KEY
# 确保格式:OPENAI_API_KEY=sk-proj-...❓ "并发处理失败"
# 检查网络稳定性和API限制
curl -s https://api.openai.com/v1/models \
-H "Authorization: Bearer $OPENAI_API_KEY"❓ "核验工作台加载错误"
- 确保已完成文件处理
- 检查session state是否保持
- 尝试刷新页面重新处理
❓ "PDF预览无法显示"
# 检查浏览器兼容性
# Chrome/Firefox/Safari 推荐
# 确保PDF文件大小合理(<10MB)📈 提高处理速度
- 使用批量处理模式(并发优势)
- 控制单次上传文件数量(建议≤20个)
- 确保网络稳定性(避免API重试)
💾 减少内存使用
- 处理完成后及时清空结果
- 避免同时处理过大的PDF文件
- 定期重启应用清理缓存
🔧 系统调优
# 调整并发数量(在streamlit_app.py中)
max_concurrent = 3 # 降低并发数减少API压力
# 调整超时时间
timeout = 180.0 # 3分钟超时适合小文件启用详细日志监控系统性能:
export STREAMLIT_LOGGER_LEVEL=debug
export OPENAI_LOG_LEVEL=debug
python3 run_streamlit.py监控关键指标:
- API调用成功率
- 平均处理时间
- 内存使用情况
- 并发处理效率
v2.0 - 核验工作台重构
- 🎯 统一核验界面,减少90%页面跳转
- 🚀 并发处理支持,提升5倍批量处理速度
- 🗜️ 智能JSON压缩,减少60-80%输出冗余
- 📊 实时优化统计,透明的处理过程
v1.5 - 性能优化
- ⚡ 异步API调用架构
- 🔒 DateTime序列化修复
- 📱 响应式界面设计
从旧版本升级:
git pull origin main
pip3 install -r requirements.txt --upgrade本项目采用MIT开源许可证,详情请查看 LICENSE 文件。
使用条款
- ✅ 商业使用
- ✅ 修改分发
- ✅ 私人使用
⚠️ 保留版权声明⚠️ 遵守OpenAI API使用条款
我们欢迎各种形式的贡献!
🐛 报告问题
- 使用 GitHub Issues 报告bug
- 提供详细的错误信息和复现步骤
- 包含系统环境和配置信息
💡 功能建议
- 通过 Issues 提交功能请求
- 描述使用场景和预期效果
- 讨论技术可行性
🔧 代码贡献
- Fork 项目仓库
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送分支 (
git push origin feature/AmazingFeature) - 创建 Pull Request
详细的开发和贡献指南请参考 CONTRIBUTING.md
- 技术讨论: 使用 GitHub Discussions
- 即时沟通: 欢迎通过Issues交流
- 文档改进: 帮助完善README和注释
- 项目主页: https://github.com/henrywen98/OcDataEntry
- 问题反馈: https://github.com/henrywen98/OcDataEntry/issues
- 功能建议: https://github.com/henrywen98/OcDataEntry/discussions
⭐ 如果这个项目对你有帮助,请给个Star支持一下! ⭐
Made with ❤️ by henrywen98
💡 提示: 如果你经常处理相同类型的表单,建议使用批量处理模式以提高效率和一致性。
├── config.py # 应用配置
├── run_streamlit.py # 启动脚本
├── data_entry.schema.json # JSON Schema定义
├── .env.example # 环境变量示例
└── README.md # 项目说明
## 安装和运行
### 系统要求
- Python 3.9.6+ (使用系统Python)
- 需要安装以下包:
```bash
pip3 install streamlit pdfplumber httpx pydantic pydantic-settings python-dotenv
-
设置OpenAI API密钥:
cp .env.example .env # 编辑.env文件,添加你的OpenAI API密钥 -
配置.env文件:
OPENAI_API_KEY=your_actual_openai_api_key_here
方法1: 使用启动脚本
python3 run_streamlit.py方法2: 直接运行Streamlit
python3 -m streamlit run streamlit_app.py --server.port=8503 --server.address=0.0.0.0- 本地访问: http://localhost:8503
- 网络访问: http://你的IP地址:8503
- 上传PDF文件: 支持多文件选择,仅支持包含文本层的PDF
- 选择处理模式:
- 单独处理: 逐个处理每个文件
- 批量处理: 合并所有PDF文本后一次性处理
- 开始处理: 系统会自动提取PDF文本并调用AI进行结构化
- 下载结果: 以JSON格式导出结构化数据
- 前端: Streamlit Web界面
- PDF处理: pdfplumber (仅文本层,无OCR)
- AI模型: OpenAI GPT-5-mini
- 数据格式: JSON Schema驱动的结构化输出
- 网络: httpx异步HTTP客户端
- 配置: Pydantic Settings环境变量管理
- 仅支持包含文本层的PDF文件
- 不支持扫描件或图片格式的PDF
- 需要有效的OpenAI API密钥
- 处理大文件可能需要较长时间
- 确保网络连接稳定
❓ "AI数据提取未启用"
# 检查API密钥是否正确设置
cat .env
# 确保OPENAI_API_KEY格式正确:sk-proj-...❓ 模块导入错误
# 检查是否安装了所有依赖
python3 -c "import streamlit, pdfplumber, httpx, pydantic; print('所有依赖已安装')"❓ PDF解析失败
- 确认PDF包含可选择的文本(不是扫描件)
- 尝试在PDF阅读器中选择文字来验证
- 某些PDF可能有特殊编码,可尝试重新生成
❓ API调用超时
- 检查网络连接稳定性
- 尝试处理更小的文件
- 确认OpenAI服务状态正常
欢迎贡献代码!请查看 CONTRIBUTING.md 了解详细的贡献指南。
- Fork 这个仓库
- 创建你的功能分支 (
git checkout -b feature/AmazingFeature) - 提交你的更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 创建一个 Pull Request
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
- Streamlit - 出色的Python Web应用框架
- pdfplumber - 强大的PDF文本提取库
- OpenAI - 先进的AI模型服务
如有问题或建议,请:
- 创建 GitHub Issue
- 查看现有的 Discussions
⭐ 如果这个项目对你有帮助,请给它一个星标!