Linuxで無料ツールを使ってPDFを簡単OCR化する完全手順:pdftkとTesseractで高精度文字起こしガイド

1. イントロダクション

紙に残された情報を手軽に検索したり、編集したりしたい、という願望は多くの Linux ユーザーに共通します。
しかし、PDF が「画像化」されている場合、文字が選択できず検索もできません。そこで必要なのが OCR(Optical Character Recognition) です。
Linux だけで完結できる、pdftktesseract を使った OCR の完全手順を紹介します。
本記事は、これから Linux で PDF を OCR 化したい人が「どのコマンドを、何の順序で実行すればよいか」を迷わないように、実際のコマンドライン例とスクリプトを添えてわかりやすく説明します。


2. 必要なパッケージを揃える

以下のツールをインストールします。ほとんどのディストリビューションで公式リポジトリに入っています。

ツール 役割 インストールコマンド (Ubuntu/Debian)
pdftk PDF の結合・分割・マージ sudo apt install pdftk
tesseract-ocr OCR エンジン sudo apt install tesseract-ocr
pdfimages (poppler) PDF から画像を抽出 sudo apt install poppler-utils
ghostscript PDF → PNG 変換 sudo apt install ghostscript
pdfjam PDF の再結合(オプション) sudo apt install pdfjam

Tip:日本語 OCR を行うには tesseract-ocr-jpn を追加でインストールしてください。
sudo apt install tesseract-ocr-jpn


3. 1ページずつに分割して画像化

OCR の前提は「1ページ ≠ 複数画像」。pdftk で PDF をページ単位に分割し、その後画像化します。

3‑1. PDF をページ単位に分割

# 例:sample.pdf を pages/ フォルダへ 1 ページごとに分割
mkdir -p pages
pdftk sample.pdf burst output pages/page_%02d.pdf

3‑2. PDF を PNG 画像に変換

ghostscript を使い、解像度を 300 DPI で変換します。300 DPI は OCR の品質を上げるとき標準です。

mkdir -p images
for f in pages/*.pdf; do
    page=$(basename "$f" .pdf)
    gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha -r300 \
       -sOutputfile=images/${page}.png "$f"
done

備考pdfimages による画像抽出は、既にイメージ化されている PDF(スキャン済み)に有効ですが、テキストを含む PDF では効果が薄いです。ここでは ghostscript を選択しました。


4. 画像に対して OCR 実行

Tesseract は画像ファイルを受け取り、テキストファイルや PDF(検索可)を出力します。ここでは -l オプションで言語を指定。たとえば英語と日本語の両方を扱う場合は eng+jpn です。

mkdir -p ocr_text
mkdir -p ocr_pdf

for img in images/*.png; do
    base=$(basename "$img" .png)
    # テキスト出力
    tesseract "$img" "ocr_text/$base" -l eng+jpn
    # 検索可能な PDF 生成(文字レイヤー付き)
    tesseract "$img" "ocr_pdf/$base" -l eng+jpn pdf
done

ポイント

  • -l eng だけで完結したい場合は tesseract "$img" "ocr_text/$base" -l eng
  • OCR の精度は画像の解像度、コントラスト、フォントによって大きく変わります。
  • tesseract‑c preserve_interword_spaces=1 で空白をそのまま保持したい場合があります。

5. OCR したページを再結合して最終 PDF を作成

画像 1 ページごとに検索可能 PDF を作ったので、それらを結合します。pdfjam (pdfjoin) が手軽です。

mkdir -p final_pdf
pdfjam --nup 1x1 \
       --outfile final_pdf/searchable.pdf \
       $(ls ocr_pdf/*.pdf | tr '\n' ' ')

メモ

  • pdfjampdfmerge と同様の機能を持ちますが、より柔軟にレイアウト指定ができます。
  • オプション --outfile で出力ファイル名を決定し、$(ls …) で PDF を順にパイプします。

6. テキスト出力を文字列で処理したい場合

OCR したテキストをそのままテキストファイルとして扱う場合はステップ 4 の ocr_text ディレクトリ内の .txt を使います。たとえば全文をひとつにまとめるスクリプトは以下です。

cat ocr_text/*.txt > full_text.txt

文字コードの一致に注意してください。Tesseract は UTF‑8 を前提に出力しますが、元画像が文字コード非対応の場合は変換が必要です。


7. 実務での注意点とトラブルシューティング

シナリオ 原因 解決策
OCR が文字を認識できない 画像解像度不足 / コントラスト低い -r300 から -r600 へ上げる、レタリング補正 (-c preserve_interword_spaces) を試す
日本語 OCR が全角文字だけを取得 言語パックが正しく設置されていない sudo apt install tesseract-ocr-jpn を再確認
出力 PDF が白紙 tesseract … pdf で OCR テキストが空 テキストファイルを確認し、OCR が正しく稼働したかを確認
結合時に順序が乱れ ファイル名の並び順が不定 sort -V で数値を正しく並べる:
`$(ls ocr_pdf/*.pdf sort -V)`

8. スクリプトで自動化

頻繁に OCR が必要な場合は、上記手順を 1 つのシェルスクリプトにまとめると便利です。

#!/usr/bin/env bash
set -euo pipefail

SRC_PDF=${1:-sample.pdf}
LANG=${2:-eng+jpn}
DPI=${3:-300}

# 1. フォルダ作成
mkdir -p "$(dirname "$SRC_PDF")"/tmp/{pages,images,ocr_text,ocr_pdf,final_pdf}
tmp_dir=$(dirname "$SRC_PDF")/tmp

# 2. PDF を分割
pdftk "$SRC_PDF" burst output "$tmp_dir"/pages/page_%02d.pdf

# 3. 画像化
for f in "$tmp_dir"/pages/*.pdf; do
    page=$(basename "$f" .pdf)
    gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha -r"$DPI" \
       -sOutputfile="$tmp_dir"/images/${page}.png "$f"
done

# 4. OCR 実行
for img in "$tmp_dir"/images/*.png; do
    base=$(basename "$img" .png)
    tesseract "$img" "$tmp_dir"/ocr_text/$base -l "$LANG"
    tesseract "$img" "$tmp_dir"/ocr_pdf/$base -l "$LANG" pdf
done

# 5. PDF 再結合
pdfjam --nup 1x1 --outfile "$tmp_dir"/final_pdf/searchable.pdf \
       $(ls "$tmp_dir"/ocr_pdf/*.pdf | sort -V)

echo "✅  OCR 完了: $tmp_dir/final_pdf/searchable.pdf"

使い方

chmod +x ocr_pdf.sh
./ocr_pdf.sh MyDocument.pdf eng+jpn 300

9. さらに高度な設定

9‑1. 画像前処理で精度を上げる

  • convert(ImageMagick)でノイズ除去 → convert image.png -noise 0.3 image_clean.png
  • 明るさ・コントラスト調整 → convert image.png -level 10%/90% image_clean.png

9‑2. 複数 CPU コアを活用

tesseract はデフォルトで 1 スレッドしか使いません。-psm-oem の組合わせでマルチスレッドが有効になる場合があります。
また、GNU Parallel で画像を並列 OCR すると処理時間が大幅短縮:

parallel -j4 'tesseract {} -l eng+jpn pdf' ::: images/*.png

9‑3. PDF 結合時にページ番号やフッターを追加

pdfjam--suffix page などを使うとページ番号を自動で付与できます。
PDF のヘッダー/フッターを追加したい場合 pdfseparate + pdftk で空白ページを挿入し、画像化・OCR のフローを組み合わせて拡張できます。


10. まとめ

  • Step 1: pdftk で PDF をページ単位に分割。
  • Step 2: ghostscript でページを 300 DPI PNG へ変換。
  • Step 3: tesseract で文字認識し、テキストファイル・検索可能 PDF を作成。
  • Step 4: pdfjam で OCR 化したページを結合し、最終検索可能 PDF を完成。

この流れはすべて「無料のオープンソースツール」で完結でき、スクリプト化すれば毎回同じ作業を自動化できます。
実際に取り扱う PDF の種類(スキャン画像か、テキスト埋め込みか)や言語設定に応じて、画像解像度や処理パラメータを微調整するとさらに高い精度が得られます。

初心者でも「コマンド + パイプ」だけで PDF を OCR 化できる環境が整ったら、文字検索・全文検索だけでなく、大量紙媒体のデジタルアーカイブ化にも応用可能です。ぜひ一度、Linux のターミナルで試してみてください。

コメント