PDF 内容提取工具对比:从纯文本到结构化解析
PDF 内容提取大概有两种方向。
一种是只要纯文本,越快越好。这里 pdftotext 很合适,但它不会完整保留图表、公式、图片说明这类信息。
另一类是希望输出给人看,最好还能保留标题、表格、图片说明、阅读顺序。以前我会优先看 Docling,最近用了 MinerU 之后,感觉它在一些 PDF 上识别得更稳。这个只是个人使用感受,不是严谨测试指标。
工具概览
pdftotext
pdftotext 是 Poppler 工具集里的命令行工具。它做的事很窄:把 PDF 里的文字抽出来,尽量快,不管格式。
特点很直接:
- 处理速度快
- 输出纯文本,后处理简单
- 安装和运行成本低
- 适合批量任务
Docling
Docling 是 IBM 开源的文档解析工具,可以把 PDF、DOCX、PPTX、XLSX 等文档转换成 Markdown、JSON 等结构化格式。
它比 pdftotext 重很多,但输出也更完整:标题层级、表格、图片、公式、阅读顺序这些信息都能尽量保留下来。你要做文档预览、知识库展示,或者希望后面继续按结构处理内容,Docling 会比纯文本方案舒服。
Docling 的资源占用和启用的功能有关。如果只做基础解析,压力不算夸张;如果打开公式识别、图表识别这类能力,显存占用会明显上去。
MinerU
MinerU 是 OpenDataLab 开源的文档解析工具,目标也是把 PDF、图片、Office 文档和网页解析成 Markdown / JSON,方便后续给 LLM / RAG 这类流程使用。
官方提供了 MinerU Web 版,可以免费上传文档体验;也可以用 GitHub 仓库 自部署。官方文档里也有 Docker 部署方式。我自己为了避开 Python 和 pip 包版本兼容问题,直接用容器跑,并基于官方 Dockerfile 打了镜像:
podman pull docker.io/nite07/mineru:latest仓库 https://git.nite07.com/nite/custom-containerfile
我最近更偏向 MinerU,主要有几个原因。
第一,识别正确率在我的文档上感觉比 Docling 好一些。
第二,它对“看起来像表格但没有边框”的内容处理得不错。很多 PDF 里的表格其实只是靠空白和对齐排出来的,普通解析器容易把它拆成散乱文本。MinerU 经常能把这类内容整理成 Markdown 里可读的表格,这点对后续阅读和整理都很有用。
第三,它会识别图片内容,并在输出里加说明。比如图像、流程图、示意图和截图这些内容,不只是保存成图片文件,还会有一个 summary。某些输出会接近这种形式:
<details>
<summary>流程图</summary>
```mermaid
graph LR
A["原始图像 X"] --> B["编码器"]
B --> C["解码器"]
C --> D["解压缩(或重建)图像 Ŷ"]
style B fill:#ff0000,stroke:#333
style C fill:#ff0000,stroke:#333
note1["压缩比特流 Y"] --> B
note2["x̂ = x, x̂ ≠ x"] --> C
```
</details>这类输出对 Markdown 很友好。尤其是图表内容本来就不是普通文本,能先给出一个可读摘要,后面再人工修一下就行。
我还单独写过一篇 MinerU 低显存部署踩坑,里面记录了 8GB 显存下 hybrid-auto-engine OOM、vlm-auto-engine 反而能跑的问题。如果你打算本地部署,建议先看那篇。
使用方式对比
纯文本提取:pdftotext
如果任务只要求抽出正文,pdftotext 很省事。
它的优势不是“理解文档”,而是快。纯文本输出也更省 token,后面做清洗、切块和入库都简单。代价也很明确:图表、公式、图片说明、表格结构这些内容会丢掉或变形。
# 快速提取 PDF 文本
pdftotext document.pdf - | head -n 50
# 批量处理文档库
for file in documents/*.pdf; do
pdftotext "$file" "text_output/$(basename "$file" .pdf).txt"
done适合这些任务:
- 快速预览 PDF 文字
- 批量抽取正文
- 做全文搜索的粗索引
- 给后续解析流程做预检查
如果要做严肃的 RAG,尤其是技术文档、论文、财报这类 PDF,纯文本提取通常不够。图表、公式和表格本身就是材料的一部分,不应该默认丢掉。
结构化解析:Docling 和 MinerU
如果输出要给人看,或者你需要保留结构,Docling 和 MinerU 更接近这类需求。
Docling 的 Python API 用起来很顺手:
from docling.document_converter import DocumentConverter
converter = DocumentConverter()
result = converter.convert("report.pdf")
markdown_content = result.document.export_to_markdown()
with open("report.md", "w", encoding="utf-8") as f:
f.write(markdown_content)它也可以直接用 CLI 跑。默认输出 Markdown,也可以用 --to 指定 JSON、HTML 等格式,用 --output 指定结果目录:
# 默认转换为 Markdown
docling report.pdf --output output
# 指定输出 JSON
docling report.pdf --to json --output output如果要走 VLM pipeline,也可以在 CLI 里指定:
docling report.pdf --pipeline vlm --output outputMinerU 用 CLI 跑也很直接:
mineru -p input.pdf -o output如果用容器镜像,可以这样运行 webui:
podman run --rm \
--device nvidia.com/gpu=all \
-p 7860:7860 \
-it mineru:latest \
mineru-gradio --server-name 0.0.0.0 --server-port 7860如果显存不够,可以参考前面提到的低显存部署文章,把后端切到 vlm-auto-engine 或 pipeline。在我的机器上,MinerU 的纯 vlm-auto-engine 模式反而比 Docling 开启公式、图表识别时更好跑一些。
mineru -p input.pdf -o output -b vlm-auto-engine对比表
| 维度 | pdftotext | Docling | MinerU |
|---|---|---|---|
| 处理速度 | 很快 | 较慢 | 较慢 |
| 资源占用 | 低 | 取决于功能,开启公式、图表识别会变高 | 取决于后端 |
| 输出格式 | 纯文本 | Markdown / JSON 等 | Markdown / JSON 等 |
| 结构保留 | 基本没有 | 好 | 好 |
| 表格处理 | 弱 | 好 | 好,对无边框类表格体验不错 |
| 图片处理 | 不支持 | 支持提取,扩展能力取决于配置 | 支持提取和内容说明 |
| OCR | 不支持 | 支持 | 支持 |
| 部署方式 | 系统包或命令行工具 | pip / uv / 源码等 | pip / uv / 源码 / Docker 等 |
| 在线体验 | 无 | 主要本地使用 | 官方提供 Web 版 |
这几类工具不是替代关系。pdftotext 适合快速拿到纯文本;Docling 和 MinerU 更适合处理文档结构。最终效果还是要拿自己的 PDF 跑一遍,同一个工具在论文、扫描件、报表和课件上的表现可能差很多。