快、纯 Rust、面向 Agent 与 RAG 的多格式文档解析器。从 12+ 种格式抽取带位置的结构化内容——每个切块都带 page + bbox,可引用、可反查。
喜欢"快、零依赖"的基础设施?★ 一个 Star 能帮更多人发现它。
走"结构提取"快路径——解析 PDF 内容流拿坐标,而非把页面渲染成像素——所以输出逐字节确定,暖解析低于 10ms。
~29 MB,零运行时依赖,暖解析 <10 ms(~700 页/s)。放服务器、笔记本或 CI 都行——没有环境要配。
每个切块带 page + bbox + 标题面包屑。locate(x, y) 坐标反查,定位率 100%——答案能指回页面上的精确位置。
CLI · 库 · MCP(stdio) · REST——四个接口逐字节一致。直接接进 Agent。
--ocr 走 tract ONNX(默认 PP-OCRv6 tiny)。数字文本页原样通过;OCR 路由页优先使用嵌入像素,否则按需渲染最终页面外观。首次使用按需拉取 ~7 MB。
合并格表结构、公式 → LaTeX、整页转写(UniRec-0.1B),外加 PP-DocLayoutV2 / DocLayout-YOLO 版面。一概不进二进制。
隐藏文本过滤(标注可审计,绝不静默删除)、zip-bomb / 页数守卫、页级复杂度画像。确定性核心独立成立。
# 构建一次——没有工具链动物园,只要 cargo
$ cargo build --release
# 完整 IR:provenance + 坐标
$ docparse input.pdf -f json
# 干净 Markdown
$ docparse input.pdf -f markdown
# RAG 切块——page + bbox + 面包屑
$ docparse input.pdf -f chunks
# OCR 无机器可读文本的页面
$ docparse scan.pdf --ocr
# MCP 工具:parse_document / get_chunks / locate
$ claude mcp add docparse -- docparse mcp
# 本地 REST(绑 127.0.0.1)
$ docparse serve --port 8642
$ curl -F "file=@doc.pdf" \
"http://127.0.0.1:8642/parse?format=chunks"
# Python / LangChain——零依赖薄客户端
from docparse_client.langchain import DocparseLoader
docs = DocparseLoader("paper.pdf").load()
在 OmniDocBench(CVPR 2025)上用内嵌 UniRec 模型评测。文本与公式已接近论文级。
代理口径的"Overall" ≈ 75,落在管线工具档(Marker 78、Docling ~80–85)——而这一切都来自单个零依赖二进制。完整方法、边界与 leaderboard →
别人要靠 JVM、PDFium/Tesseract 的 C++ 依赖、或几个 GB 的 Python 环境才能做的事——这里是一个自包含的 Rust 二进制。
| docparse-rs | liteparse | Docling | MarkItDown | |
|---|---|---|---|---|
| 部署 | 纯 Rust ~29 MB,零依赖 | Rust + PDFium/Tesseract(C++) | Python + 模型(GB 级) | Python |
| PDF 引擎 | 自研内容流解释器 | 包 PDFium | 自研 | 委托 |
| 确定性 | 默认路径逐字节确定 | 确定 | 非严格 | 确定 |
| 引用 | page+bbox 双向,100% | 每文本元素带 bbox | 元素级 | 无 |
| 输出 | JSON / MD / text / RAG 切块 | JSON / text / PNG | Markdown / JSON | Markdown |
| 格式数 | 12,全部进程内 | PDF 原生;其余靠外部 | 15+ | 20+ |
| 速度(born-digital) | <10 ms / ~700 页/s | 快 | 秒级/页 | 快 |
坦诚说取舍:Docling 神经版面在最难版面上限更高;MarkItDown 长尾格式更多;非中英 OCR(RTL / 韩文)暂未覆盖。详细对比 →
Cargo workspace 17 个 crate。确定性核心独立成立;神经模型只在值得的地方外接。
Enhancer 边界按页外接。