そもそも OCR は必要?#
PDF を開いて文章を選択してみてください。選択できればテキスト層があり、Docling はそれを直接読みます。文字は正確で、OCR は要りません。この場合 OCR が足すのは画像内の文字だけで、しかもコストは大きいです:
| 9 ページのデジタル生成論文 | 1 ページあたり | 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 | どのエンジンでも |
|---|---|---|---|---|---|
| 日本語 | jpn | ja | japan | ja-JP | iso:ja |
| 英語 | 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 |
| ロシア語 | rus | ru | cyrillic* | ru-RU | iso:ru |
- RapidOCR は一度に 1 言語だけを使い、余分な言語は警告付きで無視されます。PyTorch バックエンドは多くの言語で文字体系単位のモデルしか持たず、既定のインストールでは
iso:ruがOcrLanguageNotSupportedErrorになり、cyrillicなら動きました。 *eslavも同様に拒否されました。en・latin・ch・chinese_cht・japan・cyrillicはテストで PyTorch バックエンドで動作しました。 - Tesseract は複数言語を組み合わせられます(指定順、例:
jpn,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 で追加)#
画面上は完璧に見えるのに、コピーすると Certificate が 8VceZWZTReV になるような PDF があります。フォントがグリフを誤った文字に対応付けているためです。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 iso:ja- 既定はオフで、すべてのエンジンで使えます。Python では任意の OCR オプションクラスの
replace_broken_text_layer=True(例:RapidOcrOptions(replace_broken_text_layer=True))、CLI では--ocr-option replace_broken_text_layer=trueでも指定できます。 - 「壊れている」の判定:ページ内や多くの行に制御文字・
�・私用領域の文字があること(すべての文字体系)。ラテン文字では、別の文字体系の代わりに使われたアクセント付き文字(ロシア語がÎò÷¸òになる例)や母音の少なすぎる単語も検出します。ページ内の 1 セルだけ壊れていても置き換えません。 - 検出できないもの:文字体系は正しいのに文字が違う・順序が乱れているテキスト(
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 iso:ja --ocr-option scale=2
docling convert scan.pdf --ocr-engine tesseract --ocr-lang jpn,eng --ocr-option psm=6
docling convert scan.pdf --ocr-engine easyocr --ocr-lang ja,en --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=["japan"], 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、GPU なしの 4 vCPU クラウドマシン。
データ表を表示
| 復元率 | |
|---|---|
| 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、GPU なしの 4 vCPU クラウドマシン。
データ表を表示
| 秒/ページ | |
|---|---|
| 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 論文の最初の 4 ページを 150 DPI でラスタライズし、わずかなぼかしと傾きを加えたもの)、同じ標準パイプラインで、OCR エンジンだけを変えました。各エンジンは GPU なしの 4 vCPU マシンでウォームアップ 1 回、計測 3 回です(Docling 2.148.0、2026 年 11 月 6 日)。
- ここでは Tesseract が最速かつ最も正確でした(5.5 秒/ページ、単語の 96.1%)。きれいな英文の組版ページでは勝つのが難しいエンジンです。システムのバイナリと言語パックが必要です。
- onnxruntime 版の RapidOCR は既定の PyTorch 版の約 2 倍速(7.0 対 15.4 秒/ページ)で、出力は同一でした。純 Python 環境で最も手軽な高速化は
docling[rapidocr]のインストールで、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 では ocrmac(macOS で導入済みの場合)、Nemotron OCR(CUDA のある Linux で導入済みの場合)、onnxruntime バックエンドの RapidOCR、EasyOCR、最後に PyTorch バックエンドの RapidOCR の順に試し、Tesseract は自動では選びません。通常の pip install docling では PyTorch バックエンドの RapidOCR が使われます。
PDF からコピーした文字が文字化けするときは?
画面上は正しく見えても、フォントがグリフを誤った文字に対応付けているため 8VceZWZTReV のように読める PDF があります。2.144.0 以降は docling convert --replace-broken-text-layer(または任意の OCR オプションクラスで replace_broken_text_layer=True)を使うと、こうしたページを検出してそのページのテキストだけを OCR に置き換えます。全ページを OCR するなら --ocr-mode full_page です。
Docling で OCR を無効にするには?
CLI では --no-ocr、Python では pipeline_options.do_ocr = False を設定します。選択可能なテキストを含む PDF ではこれが正解です。
Docling で日本語のスキャン文書を読むには?
通常のインストールのままなら RapidOCR を PyTorch バックエンドで使います:docling convert scan.pdf --ocr-engine rapidocr --ocr-option backend=torch --ocr-lang iso:ja。Tesseract を使う場合は jpn の言語データを入れて --ocr-engine tesseract --ocr-lang jpn,eng とします。
Docling の tesseract と tesserocr の違いは?
tesseract は Tesseract のコマンドラインプログラムを呼び出し、tesserocr は tesserocr Python パッケージ経由で Tesseract の C API を使います(システムの Tesseract に対してビルドが必要)。どちらも同じ traineddata 言語ファイルを使います。
Docling の OCR が遅いのはなぜ?
OCR は既定で領域を 216 DPI(scale 3.0)でレンダリングし、文字検出と認識のニューラルネットを実行します。当サイトの 4 vCPU 環境ではスキャン 1 ページあたり約 15 秒でした。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