PDF2Markdown - 大型 PDF 文档智能文章提取工具 #
项目概述 #
PDF2Markdown 是一个专门用于处理大型扫描件 PDF 文件的智能内容提取工具。结合传统 OCR 技术与现代 AI 大模型,智能提取文档中的纯文章内容,自动过滤图片、表格等非文章元素。完美支持中英文混合文档处理。
✨ 核心特性 #
- 🚀 大文件支持: 专门优化处理 500M+大型 PDF 文件,采用流式处理避免内存溢出
- 🧠 AI 智能提取: 集成 Ollama 本地大模型,精准识别和提取纯文章内容
- 🌐 双语支持: 完美支持中英文混合文档,智能语言检测
- 🔄 断点续传: 支持中断恢复,避免重复处理,节省时间
- 💾 智能内存管理: 动态内存监控,自动调整处理参数适应不同硬件配置
- 🔧 多引擎 OCR: 集成 PaddleOCR 和 Tesseract,智能选择最优识别引擎
- 📊 质量保证: 多重验证机制,置信度评估,确保输出质量
- 🎯 灵活配置: 丰富的配置选项,支持不同处理策略
📦 快速安装 #
本项目使用 uv 统一管理 Python 版本与依赖,确保环境一致性。
系统要求 #
- Python 3.13+
- 内存: 8GB+ (推荐 16GB)
- 存储: 额外 5GB 用于临时文件
- GPU: 可选,支持 CUDA 加速
安装步骤 #
|
|
系统依赖 #
|
|
Ollama 模型安装 #
|
|
🚀 快速开始 #
基本使用 #
|
|
命令行参数详解 #
必需参数:
pdf或--input <path>- PDF 文件路径
配置管理:
--environment <env>- 配置环境 (development/production)--chunk-size <int>- 分块页数 (默认: 20)--ocr-engine <engine>- 指定 OCR 引擎 (可重复指定)--model <model_name>- Ollama 模型名称 (默认: qwen3:8b)
性能调优:
--workers <int>- 并发工作数 (默认: 4)--memory <float>- 最大内存限制(GB) (默认: 4.0)
输出控制:
--output <dir>- 输出目录 (默认: ./output)--formats <format>- 输出格式: markdown,json,text (默认: markdown,json)
调试选项:
--log-level <level>- 日志级别: DEBUG,INFO,WARNING,ERROR--log-file <path>- 日志文件路径--verbose- 详细日志模式--quiet- 静默模式
环境检查:
--skip-checks- 跳过环境自检--check-only- 仅运行环境检查--strict-check- 将警告视为错误
开发与测试 #
|
|
⚙️ 配置系统 #
本项目采用多层配置系统,支持灵活的配置覆盖策略:
配置文件层级 #
config/default.yaml- 默认基线配置config/{environment}.yaml- 环境特定配置覆盖- 命令行参数 - 运行时参数覆盖
默认配置详解 #
|
|
🏗️ 技术架构 #
核心处理流程 #
|
|
项目模块结构 #
|
|
数据模型架构 #
基于 Pydantic v2 的类型安全数据模型系统:
|
|
🔧 核心模块详解 #
1. 智能 PDF 处理模块 (smart_pdf_processor.py)
#
核心功能
- 智能文档分析: 自动识别文档类型、章节边界、语言分布
- 自适应分块: 根据文档结构和内容密度动态分块
- 流式处理: 避免大文件导致的内存溢出
- 质量评估: 预处理阶段评估扫描质量,优化处理参数
关键特性
- 支持最大 500M+ 的 PDF 文件处理
- 智能语言检测,支持中英文混合文档
- 内存优化策略,适应不同硬件配置
2. 多引擎 OCR 集成 (multi_ocr_processor.py)
#
支持的 OCR 引擎
- PaddleOCR: 中文识别优势,支持复杂版面布局
- Tesseract: 英文识别备用方案,处理特殊字体
- PassThroughEngine: 调试模式,直接传入预提取文本
智能特性
- 语言自适应: 自动识别中英文段落,采用对应 OCR 引擎
- 质量重试: 低质量页面自动增强和重试机制
- 结果融合: 多引擎结果智能融合,提高准确率
- 缓存机制: 避免重复处理相同内容
3. AI 内容过滤 (ollama_content_filter.py)
#
核心能力
- 智能提取: 基于大模型识别并提取纯文章内容
- 自动过滤: 过滤图片描述、表格内容、页眉页脚
- 结构保持: 保持原文的段落结构和层级关系
- 置信度评估: 对提取结果进行质量评估
技术特点
- 支持长文本分段处理
- 智能批处理优化
- 结果缓存机制
- JSON 结构化输出
4. 内存管理 (memory_manager.py)
#
动态优化策略
- 实时监控内存使用情况
- 根据可用内存动态调整批处理大小
- 自动垃圾回收机制
- 内存预警和限制执行
性能表现
- 10,000 次内存监控调用 < 0.2 秒
- 智能批次大小调整算法
- 多进程内存隔离
5. 断点续传 (checkpoint_manager.py)
#
状态管理
- JSON 格式检查点文件
- 支持处理进度保存与恢复
- 智能跳过已成功处理的页面
- 详细的错误状态记录
容错机制
- 单个分块失败不影响整体处理
- 自动错误恢复和重试
- 完整的处理历史追踪
6. 输出管理 (output_manager.py)
#
支持格式
- Markdown: 保持原文层级结构,支持后续编辑
- JSON: 结构化数据,便于程序处理
- Text: 简洁格式,便于阅读
质量保证
- 输出质量评估功能
- 详细的处理统计信息
- 错误报告和建议
- 元数据完整性检查
📊 性能指标 #
基准测试结果 #
| 指标 | 预期值 | 说明 |
|---|---|---|
| 处理速度 | 2-4 小时 | 500M 文件,取决于硬件配置和 OCR 引擎 |
| 内存占用 | 2-4GB | 峰值内存使用,动态调整优化 |
| 识别准确率 | 90%+ | 文章内容识别准确率 |
| 支持文件大小 | 1GB+ | 理论上支持更大文件,仅受内存限制 |
| 并发处理数 | 2-8 进程 | 根据内存自动调整 |
| 内存监控性能 | <0.2 秒 | 10,000 次调用基准测试 |
性能优化策略 #
- 智能分块: 根据内容密度动态调整分块大小
- 缓存机制: OCR 结果和 AI 过滤结果双重缓存
- 内存管理: 实时监控,动态调整批处理大小
- 并行处理: 多进程处理,智能资源调度
🧪 测试覆盖 #
项目包含 10 个测试文件,全面覆盖所有核心功能:
|
|
测试覆盖的功能模块 #
✅ 数据模型测试 - Pydantic v2 模型验证和类型检查 ✅ 配置管理测试 - 多层配置合并和参数覆盖 ✅ 内存管理测试 - 动态内存调整和性能基准 ✅ OCR 处理测试 - 多引擎优先级和缓存机制 ✅ 内容过滤测试 - Ollama 客户端重试和批处理 ✅ PDF 处理测试 - 智能分块和流式处理 ✅ CLI 接口测试 - 参数解析和环境检查 ✅ 断点续传测试 - 状态保存和恢复机制 ✅ 输出管理测试 - 多格式输出生成 ✅ 集成测试 - 端到端处理流程
🔍 环境检查工具 #
项目内置完整的环境检查功能:
|
|
检查项目 #
- ✅ Python 版本检查 - 确保使用 Python 3.13+
- ✅ 依赖包检查 - 验证所有必需包的安装状态
- ✅ OCR 引擎检查 - 检查 PaddleOCR 和 Tesseract 可用性
- ✅ Ollama 服务检查 - 验证 Ollama 服务运行状态
- ✅ 模型可用性检查 - 确认指定模型已下载
- ✅ 系统资源检查 - 评估可用内存和存储空间
🛠️ 高级配置示例 #
针对不同场景的优化配置 #
高质量处理配置 #
|
|
快速处理配置 #
|
|
低资源配置 #
|
|
命令行配置示例 #
|
|
🔧 开发指南 #
项目结构说明 #
|
|
代码质量工具 #
|
|
扩展开发 #
添加新的 OCR 引擎 #
|
|
自定义输出格式 #
|
|
❓ 常见问题与解决方案 #
Q: 处理大文件时内存不足怎么办? #
A: 可以通过以下方式优化内存使用:
- 使用
--memory参数限制内存使用 - 减小
--chunk-size参数值 - 减少并发工作数
--workers - 使用
low_resource配置环境
Q: OCR 识别质量不理想? #
A: 推荐以下优化策略:
- 检查原 PDF 分辨率(推荐 300DPI+)
- 尝试不同的 OCR 引擎组合
- 调整
confidence_threshold参数 - 使用高质量扫描件重新处理
Q: Ollama 模型调用失败? #
A: 检查以下项目:
- 确保 Ollama 服务正在运行:
ollama serve - 验证模型是否已下载:
ollama list - 检查模型名称是否正确:
qwen3:8b
Q: 处理速度太慢如何优化? #
A: 可以尝试以下优化:
- 增加并行工作数(内存允许时)
- 使用 GPU 加速(如果有 CUDA)
- 选择更小的 AI 模型
- 使用
fast_processing配置
📄 许可证 #
本项目采用 MIT 许可证。详见 LICENSE 文件。
🤝 贡献指南 #
我们欢迎所有形式的贡献!
贡献方式 #
- 🐛 报告 Bug: 通过 Issues 报告问题
- 💡 功能建议: 提出新功能想法
- 📝 文档改进: 完善文档和示例
- 🔧 代码贡献: 提交 Pull Request
开发流程 #
- Fork 本仓库
- 创建特性分支:
git checkout -b feature/amazing-feature - 提交更改:
git commit -m 'Add amazing feature' - 推送分支:
git push origin feature/amazing-feature - 提交 Pull Request
代码规范 #
- 遵循 PEP 8 代码风格
- 使用 ruff 进行代码格式化
- 通过 mypy 类型检查
- 编写相应的测试用例
📝 更新日志 #
v1.0.0 (当前版本) #
✨ 新功能 #
- ✅ 完整的 PDF 处理管道实现
- ✅ 多引擎 OCR 支持(PaddleOCR + Tesseract)
- ✅ Ollama AI 内容过滤集成
- ✅ 断点续传功能
- ✅ 多格式输出支持(Markdown, JSON, Text)
- ✅ 智能内存管理
- ✅ 环境自检工具
- ✅ 丰富的 CLI 参数支持
- ✅ 完整的测试覆盖
🏗️ 技术实现 #
- ✅ 基于 Pydantic v2 的类型安全数据模型
- ✅ 模块化架构设计
- ✅ 多层配置系统
- ✅ 错误处理和容错机制
- ✅ 性能优化和缓存机制
PDF2Markdown - 专注于大型 PDF 文档智能文章提取的现代化解决方案 🚀