# PDF 内容提取工具对比：从纯文本到结构化解析


PDF 内容提取大概有两种方向。

一种是只要纯文本，越快越好。这里 `pdftotext` 很合适，但它不会完整保留图表、公式、图片说明这类信息。

另一类是希望输出给人看，最好还能保留标题、表格、图片说明、阅读顺序。以前我会优先看 Docling，最近用了 [MinerU](https://github.com/opendatalab/MinerU) 之后，感觉它在一些 PDF 上识别得更稳。这个只是个人使用感受，不是严谨测试指标。

## 工具概览

### pdftotext

`pdftotext` 是 Poppler 工具集里的命令行工具。它做的事很窄：把 PDF 里的文字抽出来，尽量快，不管格式。

特点很直接：

- 处理速度快
- 输出纯文本，后处理简单
- 安装和运行成本低
- 适合批量任务

### Docling

[Docling](https://github.com/docling-project/docling) 是 IBM 开源的文档解析工具，可以把 PDF、DOCX、PPTX、XLSX 等文档转换成 Markdown、JSON 等结构化格式。

它比 `pdftotext` 重很多，但输出也更完整：标题层级、表格、图片、公式、阅读顺序这些信息都能尽量保留下来。你要做文档预览、知识库展示，或者希望后面继续按结构处理内容，Docling 会比纯文本方案舒服。

Docling 的资源占用和启用的功能有关。如果只做基础解析，压力不算夸张；如果打开公式识别、图表识别这类能力，显存占用会明显上去。

### MinerU

[MinerU](https://github.com/opendatalab/MinerU) 是 OpenDataLab 开源的文档解析工具，目标也是把 PDF、图片、Office 文档和网页解析成 Markdown / JSON，方便后续给 LLM / RAG 这类流程使用。

官方提供了 [MinerU Web 版](https://mineru.net/)，可以免费上传文档体验；也可以用 [GitHub 仓库](https://github.com/opendatalab/MinerU) 自部署。官方文档里也有 Docker 部署方式。我自己为了避开 Python 和 pip 包版本兼容问题，直接用容器跑，并基于官方 Dockerfile 打了镜像：

```bash
podman pull docker.io/nite07/mineru:latest
```

仓库 https://git.nite07.com/nite/custom-containerfile

我最近更偏向 MinerU，主要有几个原因。

第一，识别正确率在我的文档上感觉比 Docling 好一些。

第二，它对“看起来像表格但没有边框”的内容处理得不错。很多 PDF 里的表格其实只是靠空白和对齐排出来的，普通解析器容易把它拆成散乱文本。MinerU 经常能把这类内容整理成 Markdown 里可读的表格，这点对后续阅读和整理都很有用。

第三，它会识别图片内容，并在输出里加说明。比如图像、流程图、示意图和截图这些内容，不只是保存成图片文件，还会有一个 summary。某些输出会接近这种形式：

````markdown
<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 低显存部署踩坑](/posts/mineru-low-vram/)，里面记录了 8GB 显存下 `hybrid-auto-engine` OOM、`vlm-auto-engine` 反而能跑的问题。如果你打算本地部署，建议先看那篇。

## 使用方式对比

### 纯文本提取：pdftotext

如果任务只要求抽出正文，`pdftotext` 很省事。

它的优势是快，谈不上“理解文档”。纯文本输出也更省 token，后面做清洗、切块和入库都简单。代价也很明确：图表、公式、图片说明、表格结构这些内容会丢掉或变形。

```bash
# 快速提取 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 用起来很顺手：

```python
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` 指定结果目录：

```bash
# 默认转换为 Markdown
docling report.pdf --output output

# 指定输出 JSON
docling report.pdf --to json --output output
```

如果要走 VLM pipeline，也可以在 CLI 里指定：

```bash
docling report.pdf --pipeline vlm --output output
```

MinerU 用 CLI 跑也很直接：

```bash
mineru -p input.pdf -o output
```

如果用容器镜像，可以这样运行 webui：

```bash
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 开启公式、图表识别时更好跑一些。

```bash
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 跑一遍，同一个工具在论文、扫描件、报表和课件上的表现可能差很多。

## 延伸阅读

- [MinerU 官网](https://mineru.net/)
- [MinerU GitHub 仓库](https://github.com/opendatalab/MinerU)
- [MinerU 官方 Dockerfile](https://raw.githubusercontent.com/opendatalab/MinerU/refs/heads/master/docker/global/Dockerfile)
- [MinerU 低显存部署踩坑](/posts/mineru-low-vram/)
- [Docling GitHub 仓库](https://github.com/docling-project/docling)
- [Docling CLI 参考](https://docling-project.github.io/docling/reference/cli/)
- [Docling 技术报告](https://arxiv.org/abs/2408.09869)
- [Poppler 官方文档](https://poppler.freedesktop.org/)


---

> 作者: Nite  
> URL: https://www.nite07.com/zh-cn/posts/pdf-extractor/  

