PDF の Tesseract OCR
と検索可能 PDF。
Tesseract で PDF を OCR する完全で検証済みのガイドです。ページのラスタライズ、検索可能 PDF の作成、OCRmyPDF と pdfsandwich の利用、Python での一連の実行、よくあるエラーの解決を網羅します。
要点(1 コマンド)
実際の複数ページ PDF には OCRmyPDF が最短です。
pip install ocrmypdf # または: apt install ocrmypdf
ocrmypdf input.pdf output.pdfOCRmyPDF がない場合は、ラスタライズして Tesseract CLI を直接使います(下記参照)。
PDF をラスタライズする必要がある理由
Tesseract は PDF コンテナではなく画像を認識します。
PDF はコンテナであり、ベクタテキスト、埋め込みフォント、スキャンしたページ画像を含みます。Tesseract は ラスタ画像(TIFF、PNG、JPEG、WebP など)を読み取るため、ページを先に画像へ変換する必要があります。インストール状況に応じてラスタライザを選びます。
| ツール | インストール | 備考 |
|---|---|---|
pdftoppm(poppler) | apt install poppler-utils | 高速でスクリプト化しやすい定番 |
pdftocairo(poppler) | poppler-utils | pdftoppm と同様、Cairo 出力 |
| ImageMagick | apt install imagemagick | convert -density 300 in.pdf out.tif |
| PyMuPDF | pip install pymupdf | 外部バイナリ不要の純 Python |
| pdf2image | pip install pdf2image | poppler をラップする Python ライブラリ |
# PDF -> ページごとに 300 DPI の PNG
pdftoppm -png -r 300 input.pdf pageDPI が最も重要です: 300 DPI が標準的なバランス。小さなフォントやアーカイブには 600 DPI。200 DPI 未満は避けてください。
Tesseract CLI で検索可能 PDF を作成
出力設定 pdf を使うと、1 枚の画像が検索可能 PDF ページになります。
# 画像 -> 検索可能 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 コマンドで処理します。
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
テキスト層を追加し、傾き補正などの前処理を行う軽量なラッパーです。
pdfsandwich scan.pdf # scan_ocr.pdf を生成
pdfsandwich -lang eng+jpn scan.pdf方法 D — Python で最初から最後まで
pdf2image でラスタライズし、pytesseract で検索可能 PDF を構築し、pypdf で結合します。
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 + poppler | 1 コマンドで可 |
| pdfsandwich | 前処理付きの手軽なテキスト層 | poppler + ImageMagick | 可 |
| Tesseract CLI | 画像または画像リスト | Tesseract のみ | 画像リスト経由 |
| Python(pdf2image) | パイプラインとカスタム処理 | poppler + pytesseract | ループして結合 |
レイアウトの忠実性とテキスト重ね合わせ
検索可能 PDF がずれて見える理由と、座標を保つ方法。
- 不可視テキスト層は OCR の単語ボックスで配置されるため、DPI が誤っているとずれることがあります。
- 強調表示やアーカイブに正確な座標が必要な場合は
hOCRまたはALTO出力を使います。 pdftoppm -r 300と元のページサイズを合わせると重ね合わせが揃います。- 複雑なレイアウトでは、元画像を保ちテキスト層をその場に追加する OCRmyPDF を優先します。
品質とパフォーマンス
- DPI: 300 が標準、600 は小さなフォントやアーカイブ向け。
- ページ範囲: 必要な分だけ処理します(OCRmyPDF の
--pages)。 - 並列処理: ページを並列で OCR し、後で結合します。
- サイズ:
--optimize/ JPEG 圧縮、または OCR 後に DPI を下げます。 - 前処理: OCR 前に傾き補正とノイズ除去を行います。
トラブルシューティング
| 症状 | 原因 | 解決策 |
|---|---|---|
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 を優先します。