即将来临的一天,比过去的一年更为悠长。——福尔斯特

OpenDataLoader PDF

PDF Parser for AI-ready data. Automate PDF accessibility. Open-source.

如果 PDF 是一座城,OpenDataLoader PDF 就是一位很“较真”的城市规划师:
他不满足于“把字抄出来”,他要把街道(阅读顺序)、地标(标题层级)、商铺(表格)、招牌(图片/图表)、甚至每一块砖的位置(bounding boxes)都量好、画好、编号好,然后交给你一份可以直接喂给 AI 的地图。

仓库的自我介绍也很利落:

PDF Parser for AI-ready data. Automate PDF accessibility. Open-source.

他一边拿着放大镜做数据抽取,一边又披上无障碍斗篷,准备把旧世界里沉默的 PDF,变成能被屏幕阅读器真正理解的“会说话的文档”。


🔍 他擅长的第一件事:PDF parser for AI data extraction

OpenDataLoader PDF 的口头禅是:
“Extract Markdown, JSON (with bounding boxes), and HTML from any PDF.”

而且他不是随便说说——README 里直接把成绩单贴出来:

  • How accurate is it?:基准测试 #1
    • overall 0.90
    • table accuracy 0.93
    • 数据集覆盖 200 份真实 PDF(多栏、科学论文都在里头)
  • Deterministic local mode + AI hybrid mode:简单页走本地确定性流程,复杂页走 hybrid AI
  • Scanned PDFs and OCR?:支持,hybrid 模式内置 OCR(80+ languages),对 300 DPI+ 的“糊图”也能处理
  • Tables / formulas / images / charts?:复杂/无边框表格、LaTeX 公式、图表/图片描述都能在 hybrid 里搞定
  • How do I use this for RAG?pip install opendataloader-pdf,三行转换;Markdown 适合 chunking,JSON 的 bounding boxes 适合 citations,HTML 适合展示;还提供 LangChain 集成;Python / Node.js / Java SDK 都有

他像一位靠谱的“资料管理员”:
不怕你 PDF 乱,只怕你不让他上手。


♿ 他擅长的第二件事:PDF accessibility automation(无障碍自动化)

同一套布局分析引擎,还能驱动自动打标(auto-tagging):

  • First open-source tool to generate Tagged PDFs end-to-end(coming Q2 2026)

他关心的不是“能看”,而是“人人能用”。因为现实很硬:

  • 无障碍法规全球执行
  • 人工修复一份 PDF 可能要 $50–200,并且无法规模化

于是他给出“免费与企业”边界:

  • What’s free?:布局分析 + auto-tagging(Q2 2026,Apache 2.0)
    • 目标是:Untagged PDF in → Tagged PDF out
    • 不���赖专有 SDK
  • What about PDF/UA compliance?:Tagged PDF → PDF/UA-1 / PDF/UA-2 的导出是 enterprise add-on
  • Why trust this?:与 PDF Association、**Dual Lab(veraPDF 开发者)**协作,遵循 Well-Tagged PDF 规范,并用 veraPDF 自动化校验

他像在说:
“我不想让无障碍变成昂贵的手工艺,我要把它变成流水线。”


Get Started in 30 Seconds:30 秒让他开工

Requires:Java 11+ 与 Python 3.10+(Node.js / Java 也可)

开始前先确认:

run java -version. If not found, install JDK 11+ from Adoptium.

安装:

1
pip install -U opendataloader-pdf

三行把 PDF 变成 AI-ready 输出:

1
2
3
4
5
6
7
8
import opendataloader_pdf

# Batch all files in one call — each convert() spawns a JVM process, so repeated calls are slow
opendataloader_pdf.convert(
input_path=["file1.pdf", "file2.pdf", "folder/"],
output_dir="output/",
format="markdown,json"
)

他特别强调“批量一次性处理”,因为每次 convert() 都要起一个 JVM 进程,频繁调用会慢——这就是他作为“工程型角色”的细心:不光给你功能,还给你正确姿势。


What Problems Does This Solve?:他专治三类疼痛

Problem Solution Status
PDF structure lost during parsing(顺序错、表格裂、坐标没了) 本地确定性 PDF → Markdown/JSON(带 bounding boxes),XY-Cut++ reading order Shipped
复杂表格/扫描件/公式/图表需要 AI 级理解 Hybrid mode 把复杂页路由给 AI backend(benchmark #1) Shipped
PDF accessibility compliance(EAA/ADA/Section 508…) Auto-tagging:layout analysis → Tagged PDF(Q2 2026 免费),PDF/UA 导出(企业) Auto-tag: Q2 2026

Capability Matrix:他到底能做什么(以及在哪个档位)

Data extraction(免费为主,hybrid 更强)

  • 读取顺序正确的文本:Yes(Free)
  • 每个元素都有 bounding boxes:Yes(Free)
  • 表格(简单边框):Yes(Free)
  • 表格(复杂/无边框):Yes(Free / Hybrid)
  • 标题层级:Yes(Free)
  • 列表(含嵌套):Yes(Free)
  • 图片抽取与坐标:Yes(Free)
  • AI 图表/图片描述:Yes(Free / Hybrid)
  • 扫描件 OCR:Yes(Free / Hybrid)
  • 公式抽取(LaTeX):Yes(Free / Hybrid)
  • Tagged PDF 结构抽取:Yes(Free)
  • AI safety(prompt injection filtering):Yes(Free)
  • 页眉/页脚/水印过滤:Yes(Free)

Accessibility(无障碍)

  • Auto-tagging → Tagged PDF:Coming Q2 2026(Free / Apache 2.0)
  • PDF/UA-1、PDF/UA-2 export:💼 Available(Enterprise)
  • Accessibility studio:💼 Available(Enterprise)

限制也写得很直:

  • Word/Excel/PPT:No
  • GPU:不需要

Extraction Benchmarks:他把成绩写在额头上

README 直接给出对比表,结论是:

opendataloader-pdf [hybrid] ranks #1 overall (0.90)

并且还同时照顾“准确”和“速度”两个维度:

  • 本地模式可以做到 0.05s/page
  • hybrid 模式在准确更高的情况下大约 0.43s/page

他像个既跑百米、又考语文的选手:
“我不想只快,也不想只准;我想在你最需要的时候,既准又不至于慢到离谱。”


Which Mode Should I Use?:他会根据你的 PDF 性格给你安排岗位

Your Document Mode Install Server Command Client Command
Standard digital PDF Fast (default) pip install opendataloader-pdf None needed opendataloader-pdf file1.pdf file2.pdf folder/
Complex or nested tables Hybrid pip install "opendataloader-pdf[hybrid]" opendataloader-pdf-hybrid --port 5002 opendataloader-pdf --hybrid docling-fast file1.pdf file2.pdf folder/
Scanned / image-based PDF Hybrid + OCR pip install "opendataloader-pdf[hybrid]" opendataloader-pdf-hybrid --port 5002 --force-ocr opendataloader-pdf --hybrid docling-fast file1.pdf file2.pdf folder/
Non-English scanned PDF Hybrid + OCR pip install "opendataloader-pdf[hybrid]" opendataloader-pdf-hybrid --port 5002 --force-ocr --ocr-lang "ko,en" opendataloader-pdf --hybrid docling-fast file1.pdf file2.pdf folder/
Mathematical formulas Hybrid + formula pip install "opendataloader-pdf[hybrid]" opendataloader-pdf-hybrid --enrich-formula opendataloader-pdf --hybrid docling-fast --hybrid-mode full file1.pdf file2.pdf folder/
Charts needing description Hybrid + picture pip install "opendataloader-pdf[hybrid]" opendataloader-pdf-hybrid --enrich-picture-description opendataloader-pdf --hybrid docling-fast --hybrid-mode full file1.pdf file2.pdf folder/
Untagged PDFs needing accessibility Auto-tagging → Tagged PDF Coming Q2 2026

Quick Start:三种语言,三种性格,三种入口

Python

1
pip install -U opendataloader-pdf
1
2
3
4
5
6
7
8
import opendataloader_pdf

# Batch all files in one call — each convert() spawns a JVM process, so repeated calls are slow
opendataloader_pdf.convert(
input_path=["file1.pdf", "file2.pdf", "folder/"],
output_dir="output/",
format="markdown,json"
)

Node.js

1
npm install @opendataloader/pdf
1
2
3
4
5
6
import { convert } from '@opendataloader/pdf';

await convert(['file1.pdf', 'file2.pdf', 'folder/'], {
outputDir: 'output/',
format: 'markdown,json'
});

Java

1
2
3
4
<dependency>
<groupId>org.opendataloader</groupId>
<artifactId>opendataloader-pdf-core</artifactId>
</dependency>

Hybrid Mode:复杂 PDF 的“精英小队”,也是 #1 Accuracy 的秘密

Hybrid 的描述很像“分级处理”:

  • 简单页:本地 Java 快速处理(0.05s/page)
  • 复杂页:路由到 AI backend(表格准确率 +90%)

安装:

1
pip install -U "opendataloader-pdf[hybrid]"

Terminal 1:启动后端

1
opendataloader-pdf-hybrid --port 5002

Terminal 2:开始处理(批量一次性更快)

1
2
# Batch all files in one call — each invocation spawns a JVM process, so repeated calls are slow
opendataloader-pdf --hybrid docling-fast file1.pdf file2.pdf folder/

Python 也能走 hybrid:

1
2
3
4
5
6
# Batch all files in one call — each convert() spawns a JVM process, so repeated calls are slow
opendataloader_pdf.convert(
input_path=["file1.pdf", "file2.pdf", "folder/"],
output_dir="output/",
hybrid="docling-fast"
)

OCR for Scanned PDFs:让“图片型 PDF”开口说话

强制 OCR:

1
opendataloader-pdf-hybrid --port 5002 --force-ocr

非英语文档指定语言:

1
opendataloader-pdf-hybrid --port 5002 --force-ocr --ocr-lang "ko,en"

语言列表里提到:en, ko, ja, ch_sim, ch_tra, de, fr, ar, and more。


Formula Extraction (LaTeX):把公式也“结构化”

服务端开启公式增强:

1
opendataloader-pdf-hybrid --enrich-formula

客户端要带上 --hybrid-mode full

1
2
# Batch all files in one call — each invocation spawns a JVM process, so repeated calls are slow
opendataloader-pdf --hybrid docling-fast --hybrid-mode full file1.pdf file2.pdf folder/

JSON 输出里公式长这样:

1
2
3
4
5
6
{
"type": "formula",
"page number": 1,
"bounding box": [226.2, 144.7, 377.1, 168.7],
"content": "\\frac{f(x+h) - f(x)}{h}"
}

Chart & Image Description:给图表一段“可检索的语言”

服务端开启图片/图表描述增强:

1
opendataloader-pdf-hybrid --enrich-picture-description

客户端同样用 --hybrid-mode full

1
2
# Batch all files in one call — each invocation spawns a JVM process, so repeated calls are slow
opendataloader-pdf --hybrid docling-fast --hybrid-mode full file1.pdf file2.pdf folder/

JSON 输出例子:

1
2
3
4
5
6
{
"type": "picture",
"page number": 1,
"bounding box": [72.0, 400.0, 540.0, 650.0],
"description": "A bar chart showing waste generation by region from 2016 to 2030..."
}

README 里还说它用的是 SmolVLM (256M),并支持自定义 prompt:--picture-description-prompt


Output Formats:他给你的不是“纯文本”,而是一整套可用的产物

Format Use Case
JSON 带 bounding boxes、语义类型的结构化数据
Markdown 干净文本,适合 LLM context / RAG chunks
HTML 网页展示与样式
Annotated PDF 可视化调试,直接看识别结构
Text 纯文本

格式可以组合:

format="json,markdown"

JSON Output Example

1
2
3
4
5
6
7
8
9
10
11
12
{
"type": "heading",
"id": 42,
"level": "Title",
"page number": 1,
"bounding box": [72.0, 700.0, 540.0, 730.0],
"heading level": 1,
"font": "Helvetica-Bold",
"font size": 24.0,
"text color": "[0.0]",
"content": "Introduction"
}

字段解释也给得很清楚:
type / id / page number / bounding box / heading level / content……
他像一个把“可追溯性”当成信仰的系统:让每段内容都能回到原 PDF 的具体位置。


Advanced Features:他不止会抽,还会“懂”和“防”

Tagged PDF Support:如果 PDF 自己有结构标签,他就更开心

当 PDF 自带结构 tags 时,他会提取作者意图的“原生布局”:

1
2
3
4
5
6
# Batch all files in one call — each convert() spawns a JVM process, so repeated calls are slow
opendataloader_pdf.convert(
input_path=["file1.pdf", "file2.pdf", "folder/"],
output_dir="output/",
use_struct_tree=True # Use native PDF structure tags
)

AI Safety:Prompt Injection Protection(他会防“夹带私货”)

他会自动过滤:

  • hidden text(透明/0 字号)
  • off-page content(页面外内容)
  • suspicious invisible layers(可疑隐形层)

如果要脱敏(emails/URLs/phone numbers → placeholders),CLI 这样开:

1
2
# Batch all files in one call — each invocation spawns a JVM process, so repeated calls are slow
opendataloader-pdf file1.pdf file2.pdf folder/ --sanitize

LangChain Integration:他也愿意当 LangChain 的好队友

安装:

1
pip install -U langchain-opendataloader-pdf

使用:

1
2
3
4
5
6
7
from langchain_opendataloader_pdf import OpenDataLoaderPDFLoader

loader = OpenDataLoaderPDFLoader(
file_path=["file1.pdf", "file2.pdf", "folder/"],
format="text"
)
documents = loader.load()

Advanced Options:更细的输出控制

1
2
3
4
5
6
7
8
9
# Batch all files in one call — each convert() spawns a JVM process, so repeated calls are slow
opendataloader_pdf.convert(
input_path=["file1.pdf", "file2.pdf", "folder/"],
output_dir="output/",
format="json,markdown,pdf",
image_output="embedded", # "off", "embedded" (Base64), or "external" (default)
image_format="jpeg", # "png" or "jpeg"
use_struct_tree=True, # Use native PDF structure
)

PDF Accessibility & PDF/UA Conversion:法规的倒计时,他记得很清楚

README 里列了几个关键点:

  • Problem:海量 PDF 没有结构 tags,违反 EAA / ADA & Section 508 / 韩国 Digital Inclusion Act
  • Approach:与 PDF Association、Dual Lab(veraPDF 开发者)合作
    • 遵循 Well-Tagged PDF
    • 用 veraPDF 做自动化校验
    • 并强调:现有开源工具通常在“写 tags”环节依赖专有 SDK,而他要把端到端打通并保持 Apache 2.0

法规表也写得很明确(日期也点名了):

  • European Accessibility Act (EAA)June 28, 2025
  • ADA & Section 508:In effect
  • Digital Inclusion Act:In effect

Accessibility Pipeline:四步走,像一条生产线

  1. Audit(已上线,Free)
  2. Auto-tag → Tagged PDF(Q2 2026,Free / Apache 2.0)
  3. Export PDF/UA(Enterprise)
  4. Visual editing(Enterprise)

Auto-Tagging Preview(Q2 2026)

1
2
3
4
5
6
# API shape preview — available Q2 2026
opendataloader_pdf.convert(
input_path=["file1.pdf", "file2.pdf", "folder/"],
output_dir="output/",
auto_tag=True # Generate structure tags for untagged PDFs
)

Roadmap:他把未来写在路线图上

  • Auto-tagging → Tagged PDF:Q2 2026(Free)
  • Hancom Data Loader:Q2–Q3 2026(Free)
  • Structure validation:Q2 2026(Planned)

Frequently Asked Questions:他喜欢把问题讲透

README 的 FAQ 里,他不断重复几个核心价值观:

  • RAG 需要:结构、阅读顺序、坐标(用于 citations)
  • 他主打:deterministic extraction、bounding boxes、XY-Cut++、AI safety、Tagged PDF support、hybrid AI mode
  • 他强调:100% 本地运行,无云端 API 调用,hybrid backend 也在本机跑
  • 速度:本地 0.05s/page,hybrid 0.43s/page,无 GPU 也能跑

他像个不爱吹牛、爱贴数据的人:
“你问我好在哪?我把表格、分数、速度全给你看。”


Documentation:他把门都开着

  • Quick Start (Python / Node.js / Java)
  • JSON Schema Reference
  • CLI Options
  • Hybrid Mode Guide
  • Tagged PDF Support
  • AI Safety Features
  • PDF Accessibility

Contributing

We welcome contributions! See CONTRIBUTING.md for guidelines.


License

Apache License 2.0