Search

2025/12/12

【2025年12月版】Windows で EasyOCR と Poppler を利用して PDF を OCR する手順


【2025年12月版】Windows で EasyOCR と Poppler を利用して PDF を OCR する手順

画像だけのPDFファイルの画像を日本語のOCRにする方法をまとめてみました。
過去のPDFだとテキストでなく、画像形式のものも多い。
PDF>PNG化>OCR>テキスト化>読み上げソフト
で、読み上げでPDFファイルを聞きたいとき用です。
テスト的なのでどのくらい使えるかわからないです。
(お試しなので、メモとして記録)

スマホの読み上げでもいいし、こういうので車でも聞けるのが便利






以下では、Windows 環境で EasyOCR を動作させ、PDF ファイルをテキスト化するまでの流れを、順序立てて説明します。
Python 仮想環境の構築、Poppler のインストール、PDF の画像化、OCR スクリプトの作成と実行までを一通り解説します。


1. 作業ディレクトリへ移動する

まず、PowerShell を起動し、作業用のディレクトリへ移動します。

cd C:\Users\ユーザー名\Documents

※「ユーザー名」の部分は、ご自身の Windows のユーザー名に置き換えてください。


2. 仮想環境(venv)を作成し、有効化する

EasyOCR 用に独立した Python 環境(仮想環境)を作成します。これにより、他の Python プロジェクトやシステム全体の環境を汚さずにライブラリを管理できます。

python -m venv easyocr-env
.\easyocr-env\Scripts\activate

プロンプトに (easyocr-env) が表示されれば、有効化されています。


3. PyTorch(CPU版)のインストール

EasyOCR が内部で使用する機械学習ライブラリである PyTorch をインストールします。GPU を使用しない場合は、CPU 版で問題ありません。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu

4. EasyOCR のインストール

続いて、OCR エンジン本体である EasyOCR をインストールします。

pip install easyocr

5. Poppler をインストールし、PATH を設定する

Python のライブラリ pdf2image を用いて PDF を画像に変換する際には、Poppler に含まれる pdfinfo.exe および pdftoppm.exe が必要となります。

5-1. Poppler のダウンロード

以下の URL から、Poppler for Windows の最新版 ZIP ファイルをダウンロードします。

https://github.com/oschwartz10612/poppler-windows/releases/

例:

poppler-24.02.0-0-x86_64.zip

5-2. Poppler の展開

ダウンロードした ZIP ファイルを、以下のように展開します。

C:\poppler

展開後、次のファイルが存在することを確認してください。

C:\poppler\bin\pdfinfo.exe
C:\poppler\bin\pdftoppm.exe

5-3. PATH へ Poppler の bin を追加する(PowerShell)

Poppler の bin フォルダへのパスを、ユーザー環境変数 PATH に追加します。PowerShell で以下を実行します。

$popplerPath = "C:\poppler\bin"
$currentPath = [System.Environment]::GetEnvironmentVariable("Path", "User")

if ($currentPath -notlike "*$popplerPath*") {
    $newPath = "$currentPath;$popplerPath"
    [System.Environment]::SetEnvironmentVariable("Path", $newPath, "User")
    Write-Host "Poppler path added to USER PATH."
} else {
    Write-Host "Poppler path is already in PATH."
}

その後、PowerShell を一度終了し、再度起動してください。
※Windowsの検索窓>環境変数を検索してクリック>ユーザーかシステムの「Path」選択で編集>「C:\poppler\bin」を追加が簡単なときもあります。

5-4. Poppler が動作しているか確認する

PowerShell 上で、次のいずれかのコマンドを実行します。

pdfinfo -v

または

pdftoppm -h

いずれかが実行され、バージョン情報やヘルプが表示されれば、Poppler のインストールと PATH 設定は正常に完了しています。


6. pdf2image と Pillow のインストール

PDF を画像へ変換するために、pdf2imagePillow をインストールします。

pip install pdf2image pillow

7. OCR 作業用のフォルダを作成する

OCR 対象の PDF ファイルやスクリプトを配置するためのフォルダを作成します。

C:\Users\ユーザー名\Documents\ocr-work

このディレクトリに、OCR 対象の PDF ファイル(例:sample.pdf)を保存します。


8. PDF から画像へ変換し、OCR を実行するスクリプトを作成する

先ほど作成した ocr-work フォルダ内に、pdf_ocr.py という名前のファイルを作成し、以下の内容で保存します。

from pdf2image import convert_from_path
from easyocr import Reader

# PDF のパス
pdf_path = r"C:\Users\ユーザー名\Documents\ocr-work\sample.pdf"

# OCR エンジンの準備
reader = Reader(['ja', 'en'], gpu=False)

# PDF を画像へ変換
pages = convert_from_path(pdf_path, dpi=300)

all_text = []

for i, page in enumerate(pages):
    img_path = f"page_{i+1}.png"
    page.save(img_path, "PNG")

    results = reader.readtext(img_path, detail=0)
    all_text.append("\n".join(results))

# テキストとして保存
with open("output.txt", "w", encoding="utf-8") as f:
    f.write("\n\n==== page break ====\n\n".join(all_text))

print("OCR 完了しました。output.txt を確認してください。")

上記の pdf_path 内のパスは、ご自身のユーザー名および PDF ファイル名に合わせて変更してください。


9. スクリプトの実行

PowerShell で以下のコマンドを実行します。

cd C:\Users\ユーザー名\Documents\ocr-work
..\easyocr-env\Scripts\activate
python pdf_ocr.py

同じフォルダ内に output.txt が生成され、OCR 結果のテキストが保存されます。


まとめ

本記事では、Windows 環境において EasyOCR を用いて PDF を OCR するために必要な設定と、スクリプト作成手順を解説しました。主な流れは以下の通りです。

  1. Python 仮想環境の構築
  2. PyTorch および EasyOCR のインストール
  3. Poppler の導入と PATH 設定
  4. pdf2image による PDF の画像化
  5. Python スクリプトによる OCR 実行とテキスト保存

これらの手順を順に実施することで、Python を用いた OCR 処理環境が完成します。必要に応じて、大量の PDF を一括処理するバッチスクリプトや、OCR 精度を向上させるための前処理スクリプトを追加で作成することも可能です。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
===========================================
PDF OCR スクリプト(EasyOCR 版)
===========================================

【使い方】
    python ocr_pdf_easyocr.py input.pdf output_dir [start_page] [end_page]

【例 1】PDF 全ページを OCR する
    python ocr_pdf_easyocr.py C:\work\input.pdf C:\work\ocr_out

【例 2】PDF の 1〜300 ページだけ OCR する
    python ocr_pdf_easyocr.py C:\work\input.pdf C:\work\ocr_out 1 300

【出力】
    ・page_0001.txt のような各ページの OCR 結果
    ・all_pages_combined.txt(全ページ結合)

事前準備(必要なライブラリ)
    pip install easyocr pdf2image pillow

※ Poppler をインストール済みで PATH が通っていること
※ Windows の場合 poppler の bin フォルダを PATH に追加
-------------------------------------------
"""


# ==========================
# ======= 設定(定数) ======
# ==========================

POPPLER_PATH = None            # Poppler の bin フォルダ。PATH が通っていれば None のまま
LANG_LIST = ['ja', 'en']       # OCR 言語リスト
DPI = 300                      # PDF → 画像変換の解像度(高いほど精度↑)
PAGE_START = 1                 # デフォルト開始ページ(引数があれば上書き)
PAGE_END = None                # デフォルト終了ページ(None = 最後まで)


# ==========================
# ========= import ==========
# ==========================

import os
import sys
from pathlib import Path
import numpy as np
from pdf2image import convert_from_path
import easyocr


# ==========================
# ======= メイン処理 =======
# ==========================

def ocr_pdf(pdf_path: Path, output_dir: Path,
            first_page: int, last_page: int | None):

    output_dir.mkdir(parents=True, exist_ok=True)

    print(f"[INFO] EasyOCR Reader 初期化中 (LANG={LANG_LIST})...")
    reader = easyocr.Reader(LANG_LIST)

    if last_page is None:
        last_page = 9999  # 最大値(最後のページまで試す)

    combined_text_lines: list[str] = []

    page_num = first_page
    while page_num <= last_page:
        print(f"[INFO] ページ {page_num} を画像化…")

        try:
            images = convert_from_path(
                pdf_path,
                dpi=DPI,
                first_page=page_num,
                last_page=page_num,
                poppler_path=POPPLER_PATH
            )
        except Exception as e:
            print(f"[INFO] ページ {page_num} は最終ページの可能性: {e}")
            break

        if not images:
            print(f"[INFO] ページ {page_num} の画像取得なし → 終了")
            break

        image = images[0]

        print(f"[INFO] ページ {page_num} を OCR 中…")
        result = reader.readtext(np.array(image), detail=0)
        page_text = "\n".join(result)

        # ページごとに保存
        page_txt_path = output_dir / f"page_{page_num:04d}.txt"
        page_txt_path.write_text(page_text, encoding="utf-8")
        print(f"[INFO] → {page_txt_path} に保存")

        # 結合用
        combined_text_lines.append(f"===== Page {page_num} =====")
        combined_text_lines.append(page_text)
        combined_text_lines.append("")

        page_num += 1

    # 全ページ結合ファイル
    combined_txt_path = output_dir / "all_pages_combined.txt"
    combined_txt_path.write_text("\n".join(combined_text_lines), encoding="utf-8")
    print(f"[INFO] 全ページ結合テキスト → {combined_txt_path}")


# ==========================
# ========= エントリ =========
# ==========================

def main():
    if len(sys.argv) < 3:
        print("使い方: python ocr_pdf_easyocr.py input.pdf output_dir [start_page] [end_page]")
        sys.exit(1)

    pdf_path = Path(sys.argv[1])
    output_dir = Path(sys.argv[2])

    first_page = int(sys.argv[3]) if len(sys.argv) >= 4 else PAGE_START
    last_page  = int(sys.argv[4]) if len(sys.argv) >= 5 else PAGE_END

    if not pdf_path.exists():
        print(f"[ERROR] PDF が見つかりません: {pdf_path}")
        sys.exit(1)

    ocr_pdf(pdf_path, output_dir, first_page, last_page)


if __name__ == "__main__":
    main()



0 件のコメント:

コメントを投稿