今回は、PythonでOCR技術を使い、PDFファイルのテキストを抽出する方法についてご紹介します。
OCRとは何か
OCRとは、光学文字認識の略称です。
画像やスキャンデータに含まれる文字をデジタルテキストとして読み取る技術で、PDFファイルに直接テキスト情報が埋め込まれていない場合でもテキストを抽出できるようになります。
OCRを用いたPDFテキスト抽出の手順
PythonでPDFからテキストを抽出する場合、以下の手順を踏むことが一般的です。
- 必要なライブラリやツールのインストール
- PDFファイルを画像に変換
- 画像に対してOCR処理を実行
- 複数ページを処理し、結果を統合
この流れを順に解説します。
ライブラリのインストール
PDFを画像に変換するためにpdf2image、OCRを実行するためにpytesseractとTesseract OCRが必要です。
以下のコマンドでPythonライブラリをインストールしてください。
1 |
pip install pytesseract pdf2image pillow |
また、Tesseract OCR自体はシステムにインストールする必要があります。OSやインストール環境に合わせて公式ドキュメントを参照してください。
PDFファイルを画像に変換する
次に、pdf2imageを使ってPDFの各ページを画像ファイルに変換します。
1 2 3 4 5 6 7 8 9 10 11 |
from pdf2image import convert_from_path pdf_path = 'sample.pdf' # 300dpi程度に設定することで、認識精度をある程度確保しつつ処理負荷を抑えます pages = convert_from_path(pdf_path, dpi=300) for i, page in enumerate(pages): image_filename = f'page_{i + 1}.png' page.save(image_filename, 'PNG') print(f'{image_filename} を保存しました') |
このコードを実行すると、PDFの各ページがPNG形式の画像ファイルとして保存されます。
画像に対してOCRを実行する
次は、画像ファイルに対してpytesseractを利用してOCRを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from PIL import Image import pytesseract # Tesseractのインストール先パスを指定(環境に合わせて変更) pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' image_filename = 'page_1.png' image = Image.open(image_filename) # 日本語を認識する場合は lang='jpn' を指定し、Tesseractに日本語の学習データを導入してください extracted_text = pytesseract.image_to_string(image, lang='jpn') print("抽出されたテキスト:") print(extracted_text) |
実行結果は以下のようになります。
抽出されたテキスト:
(ここにOCRで認識されたテキストが表示される)
複数ページのPDFを一度に処理する例
PDFが複数ページある場合、各ページを画像化してからOCRをかけ、テキストをまとめて保存することで管理しやすくなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
import os from pdf2image import convert_from_path from PIL import Image import pytesseract # 設定 pdf_path = 'sample.pdf' output_text_file = 'output_text.txt' pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' dpi_setting = 300 # PDFを画像に変換 pages = convert_from_path(pdf_path, dpi=dpi_setting) all_text = [] for i, page in enumerate(pages): temp_image = f'page_{i + 1}.png' page.save(temp_image, 'PNG') # OCR処理を実行 text = pytesseract.image_to_string(Image.open(temp_image), lang='jpn') all_text.append(text) # 不要なら画像を削除 os.remove(temp_image) # テキストを結合してファイルに出力 full_text = "\n\n".join(all_text) with open(output_text_file, "w", encoding="utf-8") as f: f.write(full_text) print(f"全ページのOCR結果が {output_text_file} に保存されました") |
これで、PDFの全ページから抽出したテキストを一つのファイルにまとめることができます。
よくあるエラーと対処法
PDFからOCRを行う際には、以下のようなエラーや問題が発生することがあります。
- Tesseractのパスが正しく通っていない:
環境変数やtesseract_cmdの設定を見直してください。 - 日本語データがない:
日本語を認識する場合は、jpn.traineddataが正しくインストールされているか確認してください。 - 解像度が低い/画像がノイズだらけ:
OCRの認識精度が落ちるため、前処理(リサイズ、ノイズ除去、コントラスト調整など)を検討してください。 - レイアウトが複雑:
複数カラムや表などがあるPDFでは、抽出結果の順序が乱れる可能性があります。必要に応じて画像の分割や後処理を行ってください。
まとめ
PythonとOCRを組み合わせることで、テキスト情報が存在しないPDFでも文字情報を抽出できます。
pdf2imageでPDFを画像に変換し、pytesseractでOCR処理を実行する流れが基本的な実装手順です。
解像度設定や前処理、Tesseractのパラメータ調整などを適宜行うことで、認識精度をより高められます。