为公司成本组开发的模块化PDF解析工具,支持采购订单、发票、对账单等业务PDF文档的自动解析。
- 🚀 模块化架构:可轻松扩展新的单据类型
- 🔍 独立印章提取:基于OpenCV+PP-OCR的印章识别模块
- 📄 PP-StructureV2:版面分析和表格识别
- 💻 纯CPU运行:优化的i3笔记本性能
- 📦 一行调用:简单易用的API接口
CostingPDFParser/
├── pyproject.toml # 项目配置
├── requirements.txt # Python依赖
├── README.md # 项目说明
├── src/
│ └── costing_pdf_parser/ # 核心包
│ ├── __init__.py
│ ├── config.py # 全局配置
│ ├── parser.py # 统一调度入口
│ ├── core/ # 核心模块
│ │ ├── ocr_processor.py # OCR封装类
│ │ └── seal_extractor.py # 独立印章提取类
│ ├── parsers/ # 单据解析模块
│ │ ├── base_parser.py # 解析基类
│ │ ├── po_parser.py # 采购订单解析
│ │ ├── invoice_parser.py # 发票解析
│ │ └── statement_parser.py # 对账单解析
│ └── utils/ # 工具模块
│ ├── pdf_utils.py
│ └── image_utils.py
└── test/ # 测试文件(gitignore)
在开始之前,请确保你的电脑上已经安装了:
-
Anaconda(推荐,包含 Python)
- 下载地址:https://www.anaconda.com/download
- 安装完成后,必须运行
conda init初始化(Windows 安装后会自动提示) - 重启终端后生效
- 验证安装:打开终端,输入
conda --version和python --version
如果不想用 Anaconda,也可以使用官方 Python:
- 下载地址:https://www.python.org/downloads/
- 安装时请勾选 "Add Python to PATH"
-
Git
- 下载地址:https://git-scm.com/downloads
- 验证安装:打开终端,输入
git --version
打开终端,输入以下命令:
git clone https://github.com/caishzh/CostingPDFParser.git
cd CostingPDFParser说明:
git clone会把代码下载到你的电脑上cd CostingPDFParser会进入项目文件夹
虚拟环境可以避免依赖冲突,建议新手使用:
方法一:使用 Anaconda 创建虚拟环境(推荐)
conda create -n costing-parser python=3.9
conda activate costing-parser说明:
-n costing-parser表示虚拟环境名称叫 "costing-parser"python=3.9指定 Python 版本为 3.9- 成功激活后,终端前面会显示
(costing-parser)字样
方法二:使用官方 Python venv(备选)
Windows 用户:
python -m venv venv
venv\Scripts\activatemacOS/Linux 用户:
python3 -m venv venv
source venv/bin/activate成功激活后,终端前面会显示
(venv)字样
pip install -e .说明:
-e表示可编辑模式,修改代码后不需要重新安装.表示当前目录(即 pyproject.toml 所在目录)- 安装过程中会自动下载所有需要的库(包括 PaddleOCR)
如果上面的方法失败,使用备选方法:
pip install -r requirements.txt在终端中输入:
python -c "from costing_pdf_parser import Parser; print('安装成功!')"如果看到 "安装成功!",说明安装没问题。
在项目根目录下创建一个名为 test_my_pdf.py 的文件,内容如下:
from costing_pdf_parser import Parser
def main():
print("开始解析 PDF...")
parser = Parser()
pdf_path = "你的PDF文件路径.pdf"
doc_type = "po"
result = parser.parse(pdf_path, doc_type=doc_type)
print("\n解析结果:")
print(result)
if __name__ == "__main__":
main()然后运行:
python test_my_pdf.pyQ: 提示 "conda 不是内部或外部命令" 怎么办? A: 说明 Anaconda 没有正确初始化,请尝试:
- 重新打开 Anaconda Prompt(Windows)或终端
- 手动运行
conda init,然后重启终端
Q: 提示 "python 不是内部或外部命令" 怎么办? A: 如果你用的是 Anaconda,请确保已激活虚拟环境;如果用的是官方 Python,请重新安装并勾选 "Add Python to PATH"。
Q: 安装 PaddleOCR 很慢怎么办? A: 使用国内镜像源加速:
pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simpleQ: 提示 "ModuleNotFoundError"?
A: 确保虚拟环境已激活(终端前有 (costing-parser) 或 (venv)),然后重新运行安装命令。
Q: Windows 下激活虚拟环境报错? A: 如果使用的是官方 Python venv,打开 PowerShell(管理员),输入:
Set-ExecutionPolicy RemoteSigned然后重新尝试激活。如果使用 Anaconda,建议使用 Anaconda Prompt。
| 类型 | doc_type | 说明 |
|---|---|---|
| 采购订单 | po | Purchase Order |
| 发票 | invoice | 增值税发票等 |
| 对账单 | statement | 往来对账单 |
只需三步即可添加新的单据解析器:
- 在
src/costing_pdf_parser/parsers/目录下创建新文件,继承BaseParser - 实现
doc_type属性和_extract_fields方法 - 注册到
Parser类
from costing_pdf_parser.parsers.base_parser import BaseParser
class ContractParser(BaseParser):
@property
def doc_type(self):
return "contract"
def _extract_fields(self, ocr_results):
return {"field1": "value1"}
# 注册新解析器
from costing_pdf_parser import Parser
Parser.register_parser("contract", ContractParser)编辑 src/costing_pdf_parser/config.py 调整参数:
# OCR配置
OCR_USE_GPU = False # 强制CPU
OCR_LANG = "ch"
# 印章提取配置
SEAL_HSV_LOWER1 = (0, 70, 70)
SEAL_HSV_UPPER1 = (10, 255, 255)
# ... 更多配置{
'pdf2img_status': True,
'seal_crop_img': <numpy.ndarray>,
'seal_text': 'XX有限公司公章',
'confidence': 0.95,
'detail': {
'circular_text': 'XX有限公司',
'center_text': '公章',
'number': '123456',
'confidences': [0.98, 0.92, 0.95]
}
}- 纯CPU i3笔记本流畅运行
- 单页全流程 ≤8秒
- 无GPU依赖
- Windows / Linux / macOS
- Python 3.8+
- i3或以上CPU
- 4GB+ RAM
MIT License