"""
PDFファイルからテキストを光学文字認識(OCR)で抽出するPythonスクリプトです。
このスクリプトは、PyMuPDFとPytesseractライブラリを使用してPDFの各ページを画像に変換し、
Tesseract OCRエンジンで画像からテキストを抽出します。
一時的な画像ファイルは処理後に自動的に削除されます。
使用前に以下のライブラリとTesseract OCR for Windowsをインストールしてください。
Tesseract OCR for Windowsのダウンロード: https://tesseract-ocr.github.io/tessdoc/Downloads.html
必要なPythonライブラリのインストールコマンド:
`pip install Pillow PyMuPDF pytesseract`
:doc:`OCR_pdf_usage`
"""
import os
import sys
import fitz # PyMuPDF
from PIL import Image
import pytesseract
pdf_file = "peak_fit.pdf"
[ドキュメント]
def ocr_from_pdf(pdf_path, lang='jpn', output_dir='pdf_images'):
"""
PDFファイルから光学文字認識(OCR)を実行し、抽出された全テキストを連結して返します。
PDFの各ページは一時的に高解像度画像として変換・保存され、
Tesseract OCRによってその画像からテキストが抽出されます。
OCR処理後、一時画像は削除されます。DPIを高く設定することで、
より鮮明な画像が生成され、OCR精度が向上する可能性があります。
エラー発生時も、可能な限り一時ディレクトリのクリーンアップを試みます。
:param pdf_path: (str) OCR処理を行うPDFファイルのパス。
:param lang: (str) Tesseractが認識する言語。例えば 'jpn' (日本語)、'eng' (英語)、
または 'jpn+eng' (日本語と英語の複合) など。
:param output_dir: (str) PDFから抽出した一時画像を保存するための一時ディレクトリのパス。
このディレクトリは処理後に削除されます。
:returns: (str) PDF全体から抽出された全てのテキストを連結したもの。
ファイルが見つからない場合や処理中にエラーが発生した場合は、
エラーメッセージを含む文字列を返します。
"""
full_text = []
if not os.path.exists(output_dir):
os.makedirs(output_dir)
try:
doc = fitz.open(pdf_path)
print(f"PDFファイル '{pdf_path}' のページ数: {len(doc)}")
for page_num in range(len(doc)):
page = doc.load_page(page_num)
# ページを画像としてレンダリング (高解像度で)
# dpiを高く設定することで、より鮮明な画像になりOCR精度が向上する可能性があります
pix = page.get_pixmap(matrix=fitz.Matrix(300/72, 300/72)) # 300 DPI
image_path = os.path.join(output_dir, f"page_{page_num+1}.png")
pix.save(image_path)
print(f" ページ {page_num+1} を '{image_path}' として保存しました。")
# 画像からOCRを実行
text = pytesseract.image_to_string(Image.open(image_path), lang=lang)
full_text.append(f"\n--- ページ {page_num+1} のOCR結果 ---\n{text}")
# 一時画像を削除
os.remove(image_path)
print(f" 一時画像 '{image_path}' を削除しました。")
doc.close()
return "\n".join(full_text)
except FileNotFoundError:
return f"エラー: ファイル '{pdf_path}' が見つかりません。"
except Exception as e:
return f"PDF OCR処理中にエラーが発生しました: {e}"
finally:
# 処理が中断されてもディレクトリが残らないように最終的にディレクトリを削除
if os.path.exists(output_dir) and not os.listdir(output_dir):
os.rmdir(output_dir)
if __name__ == "__main__":
# テスト用のダミーPDFファイルを作成 (実際には既存のPDFを使用してください)
if not os.path.exists(pdf_file):
try:
# PyMuPDFとPillowを使って簡単なダミーPDFを生成
doc = fitz.open() # 新しいPDFドキュメントを作成
page = doc.new_page() # 新しいページを追加
# テキストを追加
page.insert_text((50, 50), "これはテストPDFです。", fontsize=20, fontname="Helvetica")
page.insert_text((50, 80), "PDF OCRの例。", fontsize=15, fontname="Helvetica")
# 日本語テキストを追加する場合は、適切なフォントとエンコーディングが必要になる場合があります
# ここでは基本的な例としてASCII文字のみにしています。
# 日本語を含むPDFを生成するには、より複雑な処理が必要です。
doc.save(pdf_file)
doc.close()
print(f"ダミーPDF '{pdf_file}' を作成しました。")
except Exception as e:
print(f"ダミーPDFの作成に失敗しました: {e}")
print("既存のPDFファイルを使用するか、手動でPDFファイルを作成してください。")
print(f"\n--- PDFファイル '{pdf_file}' のOCR結果 ---")
extracted_text_pdf = ocr_from_pdf(pdf_file, lang='jpn+eng')
print(extracted_text_pdf)