OpenDataLoader PDF:专为 RAG 设计的本地 PDF 解析器,CPU 每秒 100+ 页
搭建 RAG 处理 PDF 文档时,最头疼的是读取顺序错乱、表格结构丢失、没法定位原文引用位置。OpenDataLoader PDF 专为大语言模型设计,能准确提取文档结构并转换为 Markdown 和 JSON 格式,每个元素都带坐标信息方便引用溯源。
基于规则算法而非 AI 模型,完全本地运行不依赖 GPU,单核 CPU 每秒处理 100+ 页,相同输入必定产生相同输出——没有模型幻觉问题。核心的 XY-Cut++ 算法正确处理多栏布局的阅读顺序,表格检测结合边框分析和文本聚类保留行列结构,自动过滤页眉页脚。还内置 AI 安全过滤,自动剔除隐藏文本、水印等可能影响提示词的内容。
提供 Python、Node.js、Java 和 Docker 多种 SDK,有官方 LangChain 集成包无缝接入 RAG 流程。对于复杂表格场景,还支持 Hybrid 混合模式——简单页面本地处理,复杂页面路由到 AI 后端,表格准确率从 0.49 跳到 0.93。支持 Tagged PDF 语义结构提取和 LaTeX 公式识别。
项目背景
搭建 RAG 处理 PDF 文档时,最头疼的几个问题:读取顺序错乱(多栏布局从左到右跨栏读取)、表格结构丢失(行列关系消失)、没法定位原文引用位置(缺少坐标信息)、云端 API 的隐私顾虑。OpenDataLoader PDF 专为大语言模型设计,逐一解决这些痛点。
核心技术
XY-Cut++ 阅读顺序算法
多栏布局是 PDF 解析的经典难题。XY-Cut++ 是经典 XY-Cut 算法的增强版,能正确识别多栏文档的阅读顺序,不再出现跨栏乱序读取的问题。在 benchmark 中 Reading Order 得分达到 0.91(纯本地模式)/ 0.94(混合模式)。
表格检测与提取
结合两种策略:
- **边框分析**:检测表格线条还原行列结构
- **文本聚类**:对无边框表格通过文本位置聚类推断结构
- 支持合并单元格处理
- 纯本地模式表格准确率 0.49,开启 Hybrid 模式后跳到 0.93(+90%)
坐标信息(Bounding Box)
每个提取的元素(标题、段落、表格、列表、图片、标题)都包含 `[x1, y1, x2, y2]` 坐标,精确到 PDF 点。这对 RAG 引用溯源至关重要——用户问问题时可以精确指向原文位置。
AI 安全过滤
PDF 可以包含隐藏的 prompt injection 攻击内容。OpenDataLoader 默认自动过滤:
- 透明/零尺寸隐藏文本
- 页面外内容
- 可疑的不可见图层
- 水印
Tagged PDF 支持
随着欧洲无障碍法案(EAA)2025年6月生效,越来越多 PDF 带有语义结构标签。OpenDataLoader 是少数完全支持 Tagged PDF 的解析器,能直接提取作者标注的精确布局结构。
性能基准
| 引擎 | 综合 | 阅读顺序 | 表格 | 标题 | 速度(秒/页) |
|------|------|---------|------|------|-----------|
| **OpenDataLoader** | 0.72 | 0.91 | 0.49 | 0.76 | **0.05** |
| **OpenDataLoader [hybrid]** | **0.90** | **0.94** | **0.93** | 0.83 | 0.43 |
| docling | 0.86 | 0.90 | 0.89 | 0.80 | 0.73 |
| marker | 0.83 | 0.89 | 0.81 | 0.80 | 53.93 |
| mineru | 0.82 | 0.86 | 0.87 | 0.74 | 5.96 |
| pymupdf4llm | 0.57 | 0.89 | 0.40 | 0.41 | 0.09 |
纯本地模式速度碾压(0.05秒/页 vs marker 的 54秒/页),Hybrid 模式综合准确率最高。
输出格式
| 格式 | 用途 |
|------|------|
| JSON | 结构化数据,含坐标、语义类型、字体信息 |
| Markdown | 干净文本,适合 LLM 上下文和 RAG 分块 |
| HTML | 带样式的 Web 展示 |
| Annotated PDF | 可视化调试,查看检测到的结构 |
JSON 输出示例:每个元素包含 type(heading/paragraph/table/list/image/caption)、id、page number、bounding box、font 信息和 content。
多语言 SDK
Python
pip install -U opendataloader-pdf
import opendataloader_pdf
opendataloader_pdf.convert(input_path="doc.pdf", output_dir="output/", format="markdown,json")
Node.js
npm install @opendataloader/pdf
Java
Maven Central 上的 `org.opendataloader:opendataloader-pdf-core`
Docker
docker pull ghcr.io/opendataloader-project/opendataloader-pdf-cli
LangChain 集成
pip install -U langchain-opendataloader-pdf
from langchain_opendataloader_pdf import OpenDataLoaderPDFLoader
loader = OpenDataLoaderPDFLoader(file_path=["document.pdf"], format="text")
documents = loader.load()
官方 LangChain 文档有集成指南。
Hybrid 混合模式
对于复杂表格或 OCR 需求,开启混合模式:
- 简单页面继续本地快速处理
- 复杂页面路由到 AI 后端(如 docling-serve)
- 后端不可用时自动 fallback 到本地处理
- Docker 部署后端可保持 100% 本地化
还支持 LaTeX 公式提取和 AI 图片描述生成(使用 SmolVLM 256M 轻量视觉模型)。
适用场景
- 文档问答系统 / 知识库搭建
- 法律、医疗、金融等隐私敏感行业的文档处理
- 大规模 PDF 批量转换(千级文档高效处理)
- 需要引用溯源的 RAG 系统
协议:Mozilla Public License 2.0