PDF 转 Markdown 选 docling 还是 MinerU:三份文件实测

结论直接给:同一台 M4 16GB 上,docling 2.150 把 33 页英文手册转成 Markdown 用了 10.8 秒,MinerU 4.2.1 的 standard 档用了 28.9 秒。中文标点与编号反过来是 MinerU 更干净,扫描件里它把全角括号与「三、」这类序号都保住了。语料是纯 PDF 且以中文为主就选 MinerU,PDF 与 docx 混在一个目录、还要按结构切块进向量库就选 docling,装完占 1.6GB。

三份样本,六个数字

样本沿用上一轮测 MinerU 时造的三份文件,答案已知,可以逐字核对:一页数字版中文表(3 行 5 列表格 + 十个刻意设定的数字)、同一页打印后扫描成的图片 PDF、33 页英文技术手册。两套工具跑在同一台 M4 / 16GB 上,docling 每次单独起进程(含约 0.5 秒加载权重),MinerU 先把 mineru server start 的服务预热好再提交任务。

样本 页数 docling 2.150 MinerU standard docling 峰值内存 MinerU 常驻
数字版单页 1 2.86 秒 5.75 秒 2.06 GB 1.62 GB
扫描件单页 1 7.74 秒 16.78 秒 2.42 GB 1.62 GB
英文手册 33 10.81 秒 28.91 秒 2.21 GB 1.62 GB

耗时取两到三次运行里较快的一次,只算转换本身,模型下载另算。三个样本 docling 都快一倍以上,纯文本单页差距最大(2.7 倍),扫描件最小(2.2 倍)。内存方向相反,MinerU 的服务常驻 1.62GB 就能覆盖全部任务,docling 每跑一次都要把 torch 拉起来,峰值在 2.0 到 2.4GB 之间。16GB 的机器两个都跑得动,内存不构成选择理由。

装法:103 个包对 124 个包

docling 侧两条命令。uv venv .venv 建环境,uv pip install --python .venv/bin/python docling 装主体,清华源命中本地缓存时 11 秒结束,落 103 个包、1.1GB,带 torch 2.15.0 与 transformers 5.23.0。

MinerU 侧 uv pip install mineru,124 个包、1.2GB。包体积两边咬得很紧,差在模型:docling 要 538MB(版式 172MB、表格 358MB、图片分类 32MB),MinerU 要 2.0GB 落在 ~/.mineru。把模型算进去,docling 1.6GB,MinerU 3.2GB。

装完先别急着批量跑,用一页 PDF 试水。docling 的 docling convert --to md --output out x.pdf 会把缺的模型自动拉下来,这一步能不能过决定了后面要不要折腾镜像,细节见模型下载通道实测。

第一道坎:docling 卡在 0 字节

装完直接跑,第一次运行会去拉 docling-layout-heron。这台机器默认走 Xet 协议(hf-xet 1.8.0 + huggingface_hub 1.33.0),实测两次里两次卡在 0 字节,最长一次等了 3 分半也没开始下载。同样的 URL 用 curl 直接拉,26.9MB/s,六秒拿完 172MB。所以卡的是协议层,跟带宽无关。

判据只有一条,看缓存目录里那个临时文件。find $HF_HOME -name '*.incomplete' -ls,如果它一直是 0 字节,别等,直接改协议。

解法是关掉 Xet 再指镜像:export HF_HUB_DISABLE_XET=1 加上 export HF_ENDPOINT=https://hf-mirror.com。同一份权重立刻开始下,速度在 0.4 到 1.5MB/s 之间浮动,538MB 全部落地大约 15 分钟。要注意这个速度随时段变化很大,本轮早些时候同一条链路给过 26.9MB/s,重测时只剩几百 KB。

嫌慢就换 ModelScope 取权重,实测 26MB/s。代价是缓存目录得自己拼,docling 按 HuggingFace 的结构找文件,路径是 $HF_HOME/hub/models--docling-project--docling-layout-heron/snapshots/<commit>/,同级的 refs/main 里写那个 commit。表格模型是个例外,它认 tag v2.3.0 而不是 main,refs 下必须同时有 main 与 v2.3.0 两个文件,否则报 IncompleteSnapshotError,提示缺 tableformer 的 accurate 与 fast 两个 safetensors。拼完用 HF_HUB_OFFLINE=1 跑,能过就说明结构对了。

中文语料上的四处细节差距

速度和内存只是门槛,决定要不要换工具的是文字干不干净。三份样本逐字比完,差距集中在下面几处。

行内空格。docling 遇到 PDF 折行就在两段之间补一个空格,中文段落里于是留下「并发槽 位数」「显存差四 倍」这种断口,数字版 2 处、扫描件 4 处。MinerU 是 0 处,同类空格被吃掉。

句末标点。数字版五段正文里 MinerU 掉了 2 处句号,结尾分别是「便于逐项比对」与「KV 缓存占用越大」,都没有句号。docling 一处没掉。

括号与序号。扫描件上 docling 把全角括号转成半角,写成 (2026 年第四季度版),还把「三、常见配置片段」的序号挪到行尾,变成「常见配置片段 三」。MinerU 这两处都对。

目录与代码块。33 页手册的目录页,docling 认成表格,六行条目连页码一起对齐成 pipe 表;MinerU 输出成无序列表。代码围栏数量差得更明显,docling 给出 15 个,MinerU 只有 3 个。两套对 YAML frontmatter 都不太行,docling 会吐出四个反引号套三个反引号的畸形块,接下游要单独清洗。

表格还原这一项打平。数字版那 3 行 5 列、扫描件同一张表,两套工具都把 9 个数字与 5 个表头读对了,没有错行也没有并列。中文表格识别这条线上,两家的工程成熟度相当,想再提高就得换专用视觉模型,可参考Qwen3-VL 读表格的实测。

MinerU 会默认只转前 10 页

这个坑比上面任何一条都费时间。同一份 33 页手册,不加参数跑 mineru parse doc_c.pdf --tier standard,11.5 秒就结束,输出 11844 字节;加上 --pages all 变成 39683 字节、28.9 秒。默认只解析前 10 页,不报错也不警告。

判据是输出里的页标记。文件开头写着 <!-- page 1 of 33 -->,末尾停在第 10 页,一眼能看出来。mineru parse --help 里 --pages 的默认值就是前 10 页,长文档必须手动写 all。

另一个前置条件是服务。4.x 的 mineru parse 只是客户端,服务没起会直接报 Local parse-server is not ready;刚 mineru server start 完的二十来秒里同样报这句,因为它在后台预加载 1.2B 的解析模型。等进程内存涨到 1.6GB 再提交,成功率最高。

顺带说格式支持。MinerU 的 standard 档只吃 PDF 与图片,喂 docx 会报 Tier 'standard' is only supported for PDF and image files,改用 --tier flash 才过,1.09 秒出结果。docling 这边 docx 走轻量管道,不加载任何模型,0.01 秒出 Markdown,html 输入同样 0.01 秒。目录里混着 Office 文件时,这个差别很实在。

输出体积:docling 会往里塞图

33 页手册 docling 默认输出 379244 字节,去掉 16 张 base64 内联图之后正文只有 38172 字节。加 --image-export-mode placeholder 之后整份文件 38496 字节,图片位置只剩一个标记。MinerU 的 mineru parse 输出 39683 字节,不带图。往向量库灌之前先定图片策略,否则切块尺寸会被 base64 撑爆,这一点在知识库配嵌入那篇里踩过。

结构化输出 docling 更完整。--to json 给的是 DoclingDocument 1.11.0,单页就 300720 字节,带每个元素的类型与坐标;--to 还支持 html、text、yaml、doctags。MinerU 侧 --format 只有 markdown 一个值,要结构就得回原始 JSON。要按标题层级切块做 RAG,docling 省一层转换。

怎么选

你的情况 选谁 原因
纯 PDF,中文公文、合同、财报 MinerU 全角标点、序号、行内空格都保得住
目录里 PDF 与 docx 混排 docling 一条命令吃多种格式,Office 走轻量管道不加载模型
只有 CPU,要批量转几十份 docling 单页 2.9 秒对 5.8 秒,33 页差 18 秒
8GB 内存的机器 MinerU 常驻 1.62GB,docling 每次起 torch 要 2GB 以上
要带坐标与元素类型的 JSON docling 原生 DoclingDocument,免二次解析
扫描件占多数,要求标点规范 MinerU 扫描件输出更接近原排版

两套都装也不浪费。按文件名分流,PDF 走 MinerU 的 standard 档,docx、pptx、html 走 docling 的轻量管道,一套脚本能覆盖整个目录。上一轮那篇MinerU 三档速度实测里的档位判断依然有效,flash 适合先看结构,standard 才是交付档。

常见问题

docling 装完第一件事做什么? 先把 HF_ENDPOINT 与 HF_HUB_DISABLE_XET 两个变量设好,再拿一页 PDF 跑一次让模型落盘。半分钟就能看出下载通道通不通,比等到批量任务跑到一半才发现缺模型省事得多。

两个工具能装在同一个虚拟环境里吗? 能装,但没必要。两边都依赖 torch 与 transformers,版本约束不同,混装后常在 import torch 这一步报符号找不到。分开建环境,各自 1GB 出头,用磁盘换稳定。

转出来的 Markdown 能直接入库吗? 表格类内容基本可以直接用,三份样本里 9 个数字、5 个表头两套工具全对。中文正文建议加一道替换,把汉字之间的单个空格删掉,docling 的产出在几万字文档里会有几十处这种断口。转完先抽查页标记与实际页数是否一致,防止默认页数截断。

全部文章归档与模型专题