你真的需要 OCR 吗?#
打开 PDF,试着选中一句话。如果能选中,说明 PDF 有文本层,Docling 会直接读取——字符精确,不需要 OCR。此时 OCR 只会额外识别图片里的文字,而且代价很高:
| 我们的 9 页原生数字论文 | 每页耗时 | Markdown 字符数 |
|---|---|---|
| 默认(对位图区域 OCR) | 6.58 秒 | 34,063 |
--no-ocr | 1.83 秒 | 29,036 |
多出的约 5,000 个字符来自论文插图中的截图。如果这些文字重要就保留 OCR,否则就关掉。
选择引擎#
各个引擎#
--ocr-engine | 是什么 | 安装 | 平台 | 默认语言 |
|---|---|---|---|---|
auto(默认) | 选择第一个可用的引擎(见下文) | — | 全部 | 取决于引擎 |
rapidocr | 通过 RapidOCR 运行 PaddleOCR(PP-OCR)模型;后端可选 onnxruntime、openvino、paddle、torch | 已包含(torch 后端);onnxruntime 后端需 docling[rapidocr] | 全部 | ch(简体中文,也能识别英文) |
easyocr | EasyOCR,支持 80 多种语言,适合有 GPU 时使用 | docling[easyocr] | 全部 | en, es, fr, de |
tesseract | Tesseract 命令行程序 | 系统安装 Tesseract 及语言包 | 全部 | eng, spa, fra, deu |
tesserocr | 通过 C API 调用 Tesseract | 系统 Tesseract + docling[tesserocr] | Linux、macOS(Windows 上较难) | eng, spa, fra, deu |
ocrmac | Apple Vision 框架 | docling[ocrmac] | 仅 macOS | en-US, es-ES, fr-FR, de-DE |
nemotron-ocr | NVIDIA Nemotron OCR | docling-slim[feat-ocr-nemotron] | Linux x86_64、Python 3.12、CUDA | — |
kserve_v2_ocr | 部署在 KServe v2 / Triton 端点后的远程 OCR 模型 | gRPC 需 docling[remote-serving] | 任意(远程) | 原样传递 |
引擎列表和默认语言读取自 2.148.0 中 docling options ocr <engine> 的输出。引擎软件包的许可证:RapidOCR、EasyOCR 和 Nemotron OCR 为 Apache-2.0;tesserocr 和 ocrmac 为 MIT;Tesseract 本身为 Apache-2.0。
auto 如何选择
- macOS:如已安装,使用 ocrmac。
- 带 CUDA 的 Linux:如已安装,使用 Nemotron OCR。
- onnxruntime 后端的 RapidOCR,如已安装 onnxruntime。
- EasyOCR,如已安装。
- PyTorch 后端的 RapidOCR——普通
pip install docling最终使用的就是它。
无法支持所请求语言的引擎会被跳过。Tesseract 永远不会被自动选中——请用 --ocr-engine tesseract 指定。顺序读取自 2.148.0 的 auto_ocr_model.py;我们在 Linux 上的测试运行确认了最后一步。
语言#
--ocr-lang 接受引擎自己的代码,或带 iso: 前缀的 BCP-47 标签(Docling 会为所选引擎自动转换)。传空值(--ocr-lang '')则由引擎自行决定。
| 语言 | tesseract / tesserocr | easyocr | rapidocr | ocrmac | 任意引擎 |
|---|---|---|---|---|---|
| 英语 | eng | en | en · latin | en-US | iso:en |
| 德语 | deu | de | latin | de-DE | iso:de |
| 简体中文 | chi_sim | ch_sim | ch | zh-Hans | iso:zh-Hans |
| 繁体中文 | chi_tra | ch_tra | chinese_cht | zh-Hant | iso:zh-Hant |
| 日语 | jpn | ja | japan | ja-JP | iso:ja |
| 俄语 | rus | ru | cyrillic* | ru-RU | iso:ru |
- RapidOCR 每次只用一种语言,多余的语言会被忽略并给出警告。其 PyTorch 后端对很多语言只有按文字体系划分的模型——在默认安装下,我们用
iso:ru时遇到OcrLanguageNotSupportedError,改用cyrillic才行。 *eslav同样被拒绝;en、latin、ch、chinese_cht、japan和cyrillic在我们的测试中都能在 PyTorch 后端上运行。 - Tesseract 可以组合多种语言(按给出的顺序,如
chi_sim,eng),并需要安装对应的 traineddata;缺少时会在引擎启动时报错。 - EasyOCR 在语言属于同一文字体系时可以同时识别多种语言。
OCR 模式#
--ocr-mode | 对哪些内容做 OCR | 适用场景 |
|---|---|---|
default | 目前等同于 pdf_aware_layout_regions | 大多数文档 |
pdf_aware_layout_regions | 版面区域,但跳过完全由 PDF 文本单元组成的区域 | 带图片的数字 PDF、扫描件 |
layout_regions | 所有版面区域,忽略 PDF 文本层 | 文本层部分错误的 PDF |
full_page | 整页;替换已有文字 | 文本层损坏或乱码的扫描件(替代已弃用的 --force-ocr) |
定义取自 2.148.0 中的 OcrMode 枚举。
替换损坏的文本层(2.144.0 新增)#
有些 PDF 在屏幕上看起来完全正常,但复制出来的文字毫无意义——8VceZWZTReV 而不是 Certificate——因为字体把字形映射到了错误的字符。OCR 模式对此帮不上忙:默认模式信任 PDF 文本,而 full_page 会丢弃每一页的文本层。--replace-broken-text-layer 介于两者之间:Docling 逐页检查文本层,只对损坏的页面做整页 OCR。
docling convert contract.pdf --replace-broken-text-layer
docling convert contract.pdf --replace-broken-text-layer --ocr-engine rapidocr --ocr-option backend=torch --ocr-lang ch- 默认关闭,适用于所有引擎。在 Python 中是任意 OCR 选项类上的
replace_broken_text_layer=True,例如RapidOcrOptions(replace_broken_text_layer=True);命令行也可以写成--ocr-option replace_broken_text_layer=true。 - 怎样算损坏:页面上或多行中出现控制字符、
�或私用区字符(适用于所有文字);对拉丁字母文本,还会识别代替其他文字的带重音字母(俄文显示成Îò÷¸ò)以及元音过少的单词。一页中只有一个坏单元格不会触发替换。 - 检测不到的情况:字母表正确但字母错误或顺序错乱(
Cartifecita)。这类文件请用--ocr-mode full_page。 - 被替换的页面在置信度报告中保留较低的
parse_score,因为该分数描述的是 PDF 文本层。请选择能识别文档语言的引擎和--ocr-lang。
值得了解的引擎设置#
用 docling options ocr ENGINE 列出某个引擎的所有键,再用 --ocr-option KEY=VALUE(可重复)传入。
| 键 | 引擎 | 默认值 | 作用 |
|---|---|---|---|
scale | 全部 | 3.0 | 渲染倍数:72 DPI × scale = 216 DPI。扫描件本身分辨率较高时可调低。 |
backend | rapidocr | onnxruntime | onnxruntime、openvino、paddle 或 torch |
replace_broken_text_layer | 全部 | false | 只对 PDF 文本层损坏的页面做 OCR(见上文),等同于 --replace-broken-text-layer |
detect_orientation | rapidocr | false | 当某区域不到一半的文本行可信时,按 90°、180°、270° 重新识别——可修正横放或倒置扫描的页面(2.145.0 新增) |
model_size | rapidocr | small | tiny、small、medium(仅限 PP-OCRv6 语言;日语不支持 tiny) |
text_score / confidence_threshold | rapidocr / easyocr | 0.5 | 丢弃低置信度文字 |
psm | tesseract、tesserocr | Tesseract 默认 | 页面分割模式 0–13(替代 --psm) |
tesseract_cmd | tesseract | tesseract | 可执行文件完整路径(Windows 常用) |
recognition | ocrmac | accurate | fast 以精度换速度 |
use_gpu | easyocr | 自动 | 设为 false 强制使用 CPU |
docling convert scan.pdf --ocr-engine rapidocr --ocr-option backend=torch --ocr-lang ch --ocr-option scale=2
docling convert scan.pdf --ocr-engine tesseract --ocr-lang chi_sim,eng --ocr-option psm=6
docling convert scan.pdf --ocr-engine easyocr --ocr-lang iso:zh-Hans --ocr-option confidence_threshold=0.3
docling convert sideways.pdf --ocr-engine rapidocr --ocr-option backend=torch --ocr-option detect_orientation=truePython#
from docling.datamodel.base_models import InputFormat
from docling.datamodel.pipeline_options import OcrMode, PdfPipelineOptions, RapidOcrOptions
from docling.document_converter import DocumentConverter, PdfFormatOption
opts = PdfPipelineOptions()
opts.do_ocr = True
opts.ocr_options = RapidOcrOptions(lang=["ch"], backend="torch", mode=OcrMode.FULL_PAGE)
converter = DocumentConverter(format_options={InputFormat.PDF: PdfFormatOption(pipeline_options=opts)})
print(converter.convert("scan.pdf").document.export_to_markdown()[:500])选项类:OcrAutoOptions、RapidOcrOptions、EasyOcrOptions、TesseractCliOcrOptions(引擎 tesseract)、TesseractOcrOptions(tesserocr)、OcrMacOptions、NemotronOcrOptions、KserveV2OcrOptions。
扫描件上的引擎对比#
docling.org 实测,Docling 2.148.0,一台 4 vCPU、无 GPU 的云服务器。
查看数据表
| 还原比例 | |
|---|---|
| Tesseract 5 (CLI) | 96.1% |
| RapidOCR · onnxruntime | 93.3% |
| RapidOCR · PyTorch (default) | 93.3% |
| EasyOCR (default threshold 0.5) | 85.1% |
| EasyOCR (threshold 0.1) | 94.4% |
docling.org 实测,Docling 2.148.0,一台 4 vCPU、无 GPU 的云服务器。
查看数据表
| 秒/页 | |
|---|---|
| Tesseract 5 (CLI) | 5.5 秒 |
| RapidOCR · onnxruntime | 7.0 秒 |
| RapidOCR · PyTorch (default) | 15.4 秒 |
| EasyOCR (default threshold 0.5) | 28.9 秒 |
| EasyOCR (threshold 0.1) | 29.4 秒 |
同一份扫描文档(Docling 论文前四页,以 150 DPI 栅格化并加入轻微模糊和倾斜),同一条标准流水线,只更换 OCR 引擎。每个引擎在无 GPU 的 4 vCPU 机器上预热一次、计时三次,使用 Docling 2.148.0,测于 2026 年 11 月 6 日。
- 在这里 Tesseract 既最快又最准(每页 5.5 秒,还原 96.1% 的词语)——对清晰的英文排版页面很难被超越。它需要系统程序和语言包。
- onnxruntime 后端的 RapidOCR 比默认的 PyTorch 后端快约一倍(每页 7.0 秒对 15.4 秒),输出完全相同。安装
docling[rapidocr]是纯 Python 环境下最省事的提速方式——装好 onnxruntime 后auto会自动选用它。 - EasyOCR 在 CPU 上最慢(每页 29 秒)。在 Docling 默认置信度阈值(0.5)下保留了 85.1% 的词语;降到 0.1(
--ocr-option confidence_threshold=0.1)后提高到 94.4%。它的结果也很依赖图像:在 10 月 27 日那次测试所用的扫描件上,同样的默认阈值只保留了 12.3%。
常见问题
Docling 默认使用哪个 OCR 引擎?
auto 引擎。在 Docling 2.148.0 中,它依次尝试 macOS 上的 ocrmac(若已安装)、带 CUDA 的 Linux 上的 Nemotron OCR(若已安装)、onnxruntime 后端的 RapidOCR、EasyOCR,最后是 PyTorch 后端的 RapidOCR,从不自动选择 Tesseract。普通的 pip install docling 最终使用的是 PyTorch 后端的 RapidOCR。
PDF 复制出来的文字是乱码怎么办?
有些 PDF 在屏幕上显示正常,但字体把字形映射到了错误的字符,复制出来像 8VceZWZTReV。自 2.144.0 起,可用 docling convert --replace-broken-text-layer(或在任意 OCR 选项类上设置 replace_broken_text_layer=True),Docling 会检测这类页面,只把它们的文字替换为 OCR 结果。如需对每页都做 OCR,请用 --ocr-mode full_page。
如何在 Docling 中关闭 OCR?
命令行加 --no-ocr,或在 Python 中设置 pipeline_options.do_ocr = False。对已包含可选中文字的 PDF 应这样做。
Docling 如何识别中文扫描件?
推荐 RapidOCR:它使用 PP-OCR 模型,简体中文(ch)就是其默认语言。普通安装下请加 --ocr-option backend=torch,例如 docling convert scan.pdf --ocr-engine rapidocr --ocr-option backend=torch --ocr-lang ch。繁体中文用 chinese_cht,或使用 iso:zh-Hant。
Docling 中 tesseract 和 tesserocr 有什么区别?
tesseract 调用 Tesseract 命令行程序;tesserocr 通过 tesserocr Python 包调用 Tesseract 的 C API,需要针对系统中的 Tesseract 编译。两者使用相同的 traineddata 语言文件。
为什么 Docling 的 OCR 很慢?
OCR 默认以 216 DPI(scale 3.0)渲染区域,并运行神经网络进行文字检测和识别。在我们的 4 vCPU 机器上,一页扫描件约需 16 秒。可以使用 GPU、更快的引擎、更低的 --ocr-option scale,或对原生数字文件跳过 OCR。
资料来源
- Docling 源码:OCR 引擎(docling/models/stages/ocr)
- 取自 Docling 2.148.0:docling options ocr <engine> 的输出
- PyPI 上的 RapidOCR
- PyPI 上的 EasyOCR
- Tesseract OCR