メインコンテンツへスキップ
開発者ガイド

PDF の Tesseract OCR
と検索可能 PDF。

Tesseract で PDF を OCR する完全で検証済みのガイドです。ページのラスタライズ、検索可能 PDF の作成、OCRmyPDF と pdfsandwich の利用、Python での一連の実行、よくあるエラーの解決を網羅します。

要点(1 コマンド)

実際の複数ページ PDF には OCRmyPDF が最短です。

bash
pip install ocrmypdf      # または: apt install ocrmypdf
ocrmypdf input.pdf output.pdf

OCRmyPDF がない場合は、ラスタライズして Tesseract CLI を直接使います(下記参照)。

PDF をラスタライズする必要がある理由

Tesseract は PDF コンテナではなく画像を認識します。

PDF はコンテナであり、ベクタテキスト、埋め込みフォント、スキャンしたページ画像を含みます。Tesseract は ラスタ画像(TIFF、PNG、JPEG、WebP など)を読み取るため、ページを先に画像へ変換する必要があります。インストール状況に応じてラスタライザを選びます。

ツールインストール備考
pdftoppm(poppler)apt install poppler-utils高速でスクリプト化しやすい定番
pdftocairo(poppler)poppler-utilspdftoppm と同様、Cairo 出力
ImageMagickapt install imagemagickconvert -density 300 in.pdf out.tif
PyMuPDFpip install pymupdf外部バイナリ不要の純 Python
pdf2imagepip install pdf2imagepoppler をラップする Python ライブラリ
bash
# PDF -> ページごとに 300 DPI の PNG
pdftoppm -png -r 300 input.pdf page

DPI が最も重要です: 300 DPI が標準的なバランス。小さなフォントやアーカイブには 600 DPI。200 DPI 未満は避けてください。

Tesseract CLI で検索可能 PDF を作成

出力設定 pdf を使うと、1 枚の画像が検索可能 PDF ページになります。

bash
# 画像 -> 検索可能 PDF
tesseract page-1.png output pdf

# テキスト層のみ(画像を表示しない)
tesseract scan.png output textonly_pdf

# 複数ページを 1 つの PDF に: 画像リストを渡す
tesseract imagelist.txt output pdf

複数ページ PDF では、各画像パスを imagelist.txt の 1 行ずつに記述します。完全な出力形式リファレンス: ドキュメント。

方法 B — OCRmyPDF(実 PDF に推奨)

OCRmyPDF はラスタライズ、OCR、傾き補正、回転、不可視テキスト層を 1 コマンドで処理します。

bash
ocrmypdf input.pdf output.pdf                    # 基本
ocrmypdf -l eng+jpn input.pdf output.pdf         # 言語
ocrmypdf --deskew --rotate-pages input.pdf output.pdf
ocrmypdf --optimize 2 input.pdf output.pdf       # ファイル縮小
ocrmypdf --skip-text input.pdf output.pdf        # テキストのあるページを保持

OCRmyPDF は Tesseract を内部で使い、Ghostscript と poppler ツールが必要です。便利なフラグ: --force-ocr、--redo-ocr、--pages 1-10。

方法 C — pdfsandwich

テキスト層を追加し、傾き補正などの前処理を行う軽量なラッパーです。

bash
pdfsandwich scan.pdf          # scan_ocr.pdf を生成
pdfsandwich -lang eng+jpn scan.pdf

方法 D — Python で最初から最後まで

pdf2image でラスタライズし、pytesseract で検索可能 PDF を構築し、pypdf で結合します。

pdf.py
import io, pytesseract
from pdf2image import convert_from_path
from pypdf import PdfWriter, PdfReader

pages = convert_from_path("input.pdf", dpi=300)   # poppler が必要
writer = PdfWriter()
for page in pages:
    pdf_bytes = pytesseract.image_to_pdf_or_hocr(page, extension="pdf", lang="jpn")
    writer.add_page(PdfReader(io.BytesIO(pdf_bytes)).pages[0])
with open("output.pdf", "wb") as f:
    writer.write(f)

Windows では poppler の bin フォルダを poppler_path= で渡します。詳細は pytesseract ガイドをご覧ください。

どの方法を使うべきか

方法最適な用途セットアップ複数ページ
OCRmyPDF実 PDF、自動化Ghostscript + poppler1 コマンドで可
pdfsandwich前処理付きの手軽なテキスト層poppler + ImageMagick可
Tesseract CLI画像または画像リストTesseract のみ画像リスト経由
Python(pdf2image)パイプラインとカスタム処理poppler + pytesseractループして結合

レイアウトの忠実性とテキスト重ね合わせ

検索可能 PDF がずれて見える理由と、座標を保つ方法。

品質とパフォーマンス

トラブルシューティング

症状原因解決策
Unable to get page count. Is poppler installed?pdf2image が poppler を見つけられないpoppler-utils をインストールするか、Windows では poppler_path を設定します。
出力 PDF に検索可能テキストがないOCR 未実行または言語の誤り成功を確認し、-l/--language を文書の言語に設定します。
テキストの重ね合わせがずれているDPI またはページサイズの誤り元のサイズで 300 DPI にラスタライズします。
出力ファイルが巨大600 DPI の可逆画像--optimize / JPEG を使うか DPI を下げます。
パスワード保護 PDF が失敗暗号化された入力先に復号するか、ツールが対応していればパスワードを渡します。

PDF のよくある質問

PDF を検索可能にするには?

ocrmypdf input.pdf output.pdf を使うか、ページをラスタライズして tesseract page.tif output pdf を実行します。

Tesseract が PDF を直接読めないのはなぜ?

Tesseract はラスタ画像を認識するため、PDF のページを先に画像へ変換する必要があります。

どの DPI を使うべき?

ほとんどの文書は 300 DPI、小さなフォントやアーカイブは 600 DPI です。

Python で PDF を OCR できますか?

はい。pdf2image と poppler、pytesseract.image_to_pdf_or_hocr を使い、pypdf でページを結合します。

レイアウトを正確に保つには?

元のページサイズと DPI を合わせ、元画像を保ってテキスト層を重ねる OCRmyPDF を優先します。