Tesseract OCR メモ

PDFをTesseractでOCRするメモ

***

# Tesseract OCRのインストール手順

1.  **Tesseractのインストール**:

2.  **Tesseract OCRの最新版をダウンロード**:
    *   Tesseract OCRの[公式GitHubリリースページ](https://github.com/tesseract-ocr/tesseract/releases)から、最新版のWindows向けインストーラーをダウンロードします。

3.  **Tesseractのインストール**:
    *   ダウンロードしたインストーラーを実行し、「管理者として実行」を選択してください。インストールプロセスを進め、インストールが完了するまで待ちます。
    *   インストール時に、必要な言語データ（例えば、日本語を含む）を選択するオプションがある場合は、適切な言語データを選択してください。

4.  **環境変数PATHの確認**:
    *   インストール後、Tesseractの実行ファイルがインストールされたディレクトリ（通常は`C:\Program Files\Tesseract-OCR`）をシステムの環境変数`PATH`に追加する必要があります。これにより、コマンドプロンプトから`tesseract`コマンドを実行できるようになります。

5.  **インストールの確認**:
    *   コマンドプロンプトを開き、`tesseract --version`コマンドを実行して、Tesseractが正しくインストールされ、バージョン情報が表示されることを確認します。

# PIP

Tesseract OCRを使用してPDFファイルから直接テキストを抽出するには、まずPDFを画像ファイル（例：JPEGやPNG）に変換する必要があります。Tesseract自体はPDFの直接解析には対応していませんが、画像ファイルへの変換を経由することでテキスト抽出が可能になります。このプロセスを行うには、PDFを画像に変換するためのツール（例：`pdf2image`ライブラリなど）と、その画像からテキストを抽出するためのTesseract OCRを組み合わせます。

### pdf2image : PDFを画像に変換

Pythonで`pdf2image`ライブラリを使用してPDFを画像に変換する。まず、必要なライブラリをインストールしてください。

```bash
pip install pdf2image
```

### pytesseractのインストール

コマンドプロンプトまたはターミナルを開き、以下のコマンドを実行してください。

```bash
pip install pytesseract
```

# Popplerのインストール方法 (Windows)

`pdf2image`は内部で`poppler`の`pdfinfo`コマンドを使用してPDFファイルの情報を取得するため、`poppler`がインストールされていないとPDFを画像に変換する処理を行うことができません。

1.  **Popplerのダウンロード**: PopplerのWindows版は公式サイトから直接ダウンロードできませんが、[このリンク](https://github.com/oschwartz10612/poppler-windows/releases/)から最新のバージョンをダウンロードできます。

2.  **解凍**: ダウンロードしたzipファイルを解凍し、アクセスしやすい場所にフォルダを配置します。例えば、`C:\poppler-xx\`のようにします。

3.  **PATHの設定**: `poppler`の`bin`ディレクトリ（例: `C:\poppler-xx\bin`）をシステムの環境変数`PATH`に追加します。
    *   「コントロールパネル」→「システムとセキュリティ」→「システム」→「システムの詳細設定」→「環境変数」で`PATH`環境変数を見つけ、「編集」をクリックします。
    *   「新規」を選択し、`poppler`の`bin`ディレクトリのパスを追加します。
    *   すべてのウィンドウで「OK」を選択して閉じ、変更を保存します。

***

# OCR 例

PDFから特定の部分（例えば、右下の部分）のテキストのみを読み取り、そのテキストを使用してファイル名を生成するためには、いくつかのステップを経る必要があります。これには、PDFを画像に変換した後、画像の特定の領域からテキストを抽出し、最後にそのテキストをファイル名として使用するプロセスが含まれます。

以下は、このプロセスを実現するためのPythonスクリプトの例です。このスクリプトでは、`pytesseract`の`image_to_string`関数に`box`パラメータを使用して、画像の特定の領域からテキストを抽出します。抽出したテキストをファイル名として使用する前に、ファイル名として無効な文字を除去または置換する処理を行います。

## ステップバイステップのガイド

1.  **必要なライブラリのインポートと設定**:

```python
from pdf2image import convert_from_path
import pytesseract
from PIL import Image
import os
import re

# Tesseractのパスを設定
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
```

2.  **PDFを画像に変換**:

```python
pdf_path = r"C:\Users\*****\Desktop\test\your_pdf_file.pdf"
images = convert_from_path(pdf_path)
```

3.  **特定の画像領域からテキストを抽出し、ファイル名として使用**:

```python
for i, image in enumerate(images):
    # 画像のサイズを取得
    width, height = image.size
    
    # 右下の領域を定義（例：画像の右下25%の領域）
    area = (width * 0.75, height * 0.75, width, height)
    cropped_image = image.crop(area)
    
    # 特定の領域からテキストを抽出
    text = pytesseract.image_to_string(cropped_image, lang='eng')
    
    # ファイル名として使用できない文字を除去または置換
    filename = re.sub(r'[\\/*?:"<>|]', "", text.splitlines()[0])[:15]  # 最初の行を使用し、15文字に制限
    
    # ファイル名を確認
    print(f"Extracted filename: {filename}")
    
    # ここで、必要に応じて抽出されたテキストを使用してファイルを保存するなどの処理を行います
```

***

### 1つにまとめ

あなたが提供したコードは、PDFファイルから画像を生成し、それぞれの画像の特定領域（この場合は右下）からテキストを抽出し、そのテキストを基にしてファイル名を生成し、テキストファイルとして保存する処理を行うスクリプトです。以下は、このプロセスを説明するコメントを追加した改善版のコードです。

```python
from pdf2image import convert_from_path
import pytesseract
from PIL import Image
import os
import re

# Tesseract OCRの実行ファイルへのパスを設定します。
# これにより、pytesseractがTesseractを正しく呼び出せるようになります。
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# 処理するPDFファイルと出力ディレクトリのパスを指定します。
pdf_path = r"C:\Users\*****\Desktop\test\your_pdf_file.pdf"
output_dir = r"C:\Users\*****\Desktop\test\output"

# pdf2imageを使用して、PDFファイルを画像に変換します。
# これにより、Tesseractでテキスト抽出を行えるようになります。
images = convert_from_path(pdf_path)

# 変換された画像を順番に処理します。
for i, image in enumerate(images):
    # 画像の幅と高さを取得します。
    width, height = image.size
    
    # 画像の右下の領域を定義します。
    # この例では、画像の幅の82%から100%、高さの93%から100%の範囲を指定しています。
    area = (width * 0.82, height * 0.93, width, height)
    cropped_image = image.crop(area)
    
    # pytesseractを使用して、定義した領域からテキストを抽出します。
    text = pytesseract.image_to_string(cropped_image, lang='eng').strip()
    
    # 抽出したテキストが空でないかチェックします。
    if text:
        # ファイル名として使用できない文字を除去します。
        filename = re.sub(r'[\\/*?:"<>|]', "", text.splitlines()[0])[:15]
    else:
        # テキストが空の場合は、デフォルトのファイル名を使用します。
        filename = f"page_{i + 1}_no_text"
    
    # テキストファイルを保存するパスを生成します。
    file_path = os.path.join(output_dir, f"{filename}.txt")
    
    # 抽出したテキストをファイルに保存します。
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(text)
    
    # 保存したファイルのパスを出力します。
    print(f"Saved {file_path}")
```

このコードは、PDFファイル内の各ページを個別の画像として処理し、各画像の指定された領域からテキストを抽出して、そのテキストをファイル名として使用しています。テキストが空の場合は、`page_{i + 1}_no_text.txt`という形式のデフォルトファイル名を使用します。