Docling 如何用 NativePdfPipeline 快速提取 PDF 原生文本而不跑布局模型?
当你手上的 PDF 自带文本层,而任务只是把里面的文字(和嵌入图片)抽出来装进 DoclingDocument 时,默认的 standard 管线会多余地跑布局检测、OCR 和表格结构模型,这些模型还需要下载和加载。Docling 的 NativePdfPipeline 专门解决这个问题:它只用 docling-parse 解析 PDF 原生内容——每个原生文本单元(text cell)变成一个文本项,每个嵌入位图变成一个图片项,不跑任何布局、OCR 或表格模型(docs/usage/advanced_options.md 中的 "Extract the native content of a PDF" 一节)。本文给出从安装到验证结果的完整路径,以及这条管线的明确限制。
NativePdfPipeline 能提取什么、不能提取什么
先确认你的目标是否在它的能力范围内(以下行为来自 native_pdf_pipeline.py 的实现说明):
- 能:PDF 后端报告的每个文本单元变成一个带 provenance 框(页码、bbox、charspan)的普通
TextItem;每个嵌入位图变成一个PictureItem;按需给每页附加渲染图。 - 不能:结果文档没有阅读顺序、没有标题层级、没有表格结构——条目按解析器报告的顺序出现。需要结构化输出时应使用带布局模型的默认管线。
- 不跑 OCR,文字只能来自 PDF 本身已编码的文本层;纯扫描页没有可提取的文本。
- 要求输入走 PDF 后端:
NativePdfFormatOption默认使用ThreadedDoclingParseDocumentBackend;CLI 中--pipeline native明确要求 docling-parse 类后端,传入其他 PDF 后端会直接报错Error: --pipeline native requires a docling-parse PDF backend并中止。
准备:安装 Docling
按 安装文档 从 Python 包管理器安装即可,支持 macOS、Linux、Windows 的 x86_64 与 arm64:
pip install docling
这条管线不加载任何模型,因此不需要做模型预下载(docling-tools models download 是给布局、表格等模型准备的,本文场景用不到)。
命令行路径:一条命令提取
最短路径在 docs/reference/cli.md 中定义:
docling --pipeline native --from pdf FILE
FILE 是待转换的本地 PDF 路径(源文档中的占位符,替换为你的文件)。命令中各参数:
--pipeline:可选legacy、standard、native、vlm、asr,默认是standard。只有native对应NativePdfPipeline,漏写就会退化为跑模型的默认管线。--from pdf:限定输入格式为 PDF。--parser-threads(可选):PDF 解析工作线程数。由于这条管线不跑模型,解析线程是它唯一的并行度,默认值为机器 CPU 线程数减一:
docling --pipeline native --from pdf --parser-threads 8 FILE
CLI 还会自动处理页面渲染:只有当导出格式需要携带图片时才渲染页面图(images_scale=2),否则跳过渲染只解析,避免为不用的产物付出光栅化开销。
Python 路径:配置并运行
from docling.datamodel.base_models import InputFormat
from docling.datamodel.pipeline_options import NativePdfPipelineOptions
from docling.document_converter import DocumentConverter, NativePdfFormatOption
pipeline_options = NativePdfPipelineOptions()
pipeline_options.generate_page_images = True
pipeline_options.images_scale = 2.0
doc_converter = DocumentConverter(
format_options={
InputFormat.PDF: NativePdfFormatOption(pipeline_options=pipeline_options)
}
)
result = doc_converter.convert("report.pdf") # 替换为你的本地 PDF 路径
doc = result.document
注意两点:DocumentConverter() 不传 format_options 时默认走 StandardPdfPipeline,所以必须显式传 NativePdfFormatOption;它接收 NativePdfPipelineOptions 时会自动配置底层 ThreadedDoclingParseBackendOptions(解析线程数、位图解码、页面渲染都与管线选项对齐)。
NativePdfPipelineOptions 中与本场景直接相关的选项:
| 选项 | 默认值 | 用途 |
|---|---|---|
generate_page_images |
True |
给每页附加按 images_scale 像素/点渲染的页面图。设为 False 则跳过渲染只解析,文档明确说明这样更快 |
images_scale |
由示例显式设为 2.0 |
页面渲染的像素/点比例,也决定输出页面图的 DPI(72 * images_scale) |
parser_threads |
机器 CPU 线程数减一(最小 1) | PDF 解析工作线程数;模型的 accelerator_options 在这条管线中不生效 |
text_cell_unit |
TextCellUnit.LINE |
文本项粒度:按行(默认)、按词或按字符;docling-parse 后端支持词和行 |
generate_picture_images |
True |
把嵌入位图附到图片项上。需要后端 include_bitmap_images=True,NativePdfFormatOption 会按此选项自动设置 |
只要文字、不需要页面图时,把 generate_page_images 设为 False 是最直接的提速手段。
验证提取结果
验证方式与 tests/test_native_pdf_pipeline.py 中的断言一致:
from docling.datamodel.base_models import ConversionStatus
print(result.status) # 期望 ConversionStatus.SUCCESS
# 文本项数量与非空
print(len(doc.texts) > 0)
# 每个文本项的 provenance:页号、bbox、字符区间
for text in doc.texts:
prov = text.prov[0]
assert prov.charspan == (0, len(text.text))
# 导出 Markdown 查看整体内容
print(doc.export_to_markdown())
逐项判断:
result.status为ConversionStatus.SUCCESS,说明全部页面解析成功。doc.texts非空,且每个文本项带一条 provenance:page_no为所在页、bbox 为左下原点且落在页面尺寸内、charspan覆盖整个文本。- 图片项在
doc.pictures中;默认(generate_picture_images=True)时每项带image,设为False时仍保留但image为None(只有位置框)。 generate_page_images=False时,doc.pages[1].image为None,但文本项照常产出——这是判断"跳过渲染是否生效"的直接依据。
限制与失败形态
- 单页解析失败不会终止整个文档:该页会记录一条
ErrorItem(含页码和错误信息),整体状态变为PARTIAL_SUCCESS,其余页面正常产出。 document_timeout超时时同样停止在当前页,标记PARTIAL_SUCCESS并写入 timeout 错误项。- 若后端渲染比例与管线要求的
images_scale不一致,每个页面会被光栅化两次(第二次串行执行),日志会给出 warning 并提示把后端render_scale设为与images_scale相同。 - 需要阅读顺序、标题、表格结构或扫描版 OCR 时,
NativePdfPipeline不适用,应换回默认的standard管线。
更多背景可查阅 docs/usage/advanced_options.md、docs/reference/cli.md 与管线实现 docling/pipeline/native_pdf_pipeline.py。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00