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 output

MinerU 用 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-enginepipeline。在我的机器上,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 跑一遍,同一个工具在论文、扫描件、报表和课件上的表现可能差很多。

延伸阅读