
PDF OCR(光学文字認識)の実行は、スキャン済み文書を扱う際の一般的な要件です。標準的なデジタル PDF には検索可能なテキストレイヤーが含まれていますが、スキャン済み PDF は本質的に印刷文書の画像であるため、従来のテキスト抽出方法では効果的ではありません。
コンテンツにアクセス可能で編集可能にするために、開発者はまず PDF ファイルを画像に変換 し、その後 OCR 技術を使用してテキストを認識・抽出する必要があります。このプロセスを手動で実行するのは時間がかかり非効率的であり、特に複数の文書を扱う場合に問題となります。
このガイドでは、Spire.PDF for Python と Spire.OCR for Python を使用して、スキャン済み PDF からのテキスト抽出を自動化する完全な Python PDF OCR パイプライン の構築に焦点を当てています。このアプローチは、実世界の文書処理ワークフローに対応するスケーラブルなソリューションを提供します。
クイックナビゲーション
- PDF テキスト抽出に OCR が必要な理由
- 前提条件
- ステップ 1: PDF ページを画像に変換する
- ステップ 2: OCR を実行して画像からテキストを抽出する
- 完全なパイプライン: PDF から抽出されたテキストまで
- PDF OCR の一般的な課題
- 結論
- よくある質問
PDF テキスト抽出に OCR が必要な理由
PDF ファイルからテキストを抽出する場合、アプローチを決定する重要な要素の一つが PDF の種類です。一般的に、PDF は 2 つのカテゴリーに分類されます:スキャン済み(画像ベース)PDF と検索可能 PDF です。それぞれに異なるテキスト抽出戦略が必要です。
スキャン済み PDF は通常、書籍、請求書、契約書、雑誌などの物理文書をデジタル化して作成されます。テキストは人間の目には読み取れるように見えますが、実際には画像として埋め込まれているため、従来のテキスト抽出ツールではアクセスできません。古いデジタルファイルやパスワード保護された PDF にも、実際のテキストレイヤーがない場合があります。
一方、検索可能 PDF には、コンピューターがコンテンツを検索、コピー、または解析できる隠しテキストレイヤーが含まれています。これらのファイルは通常、Microsoft Word や PDF エディターなどのアプリケーションから直接生成され、プログラムによる処理がはるかに容易です。
この違いは、スキャン済み PDF を扱う際の OCR(光学文字認識)の重要性を浮き彫りにしています。Python PDF OCR のようなツールを使用することで、これらの画像ベースの PDF を画像に変換し、OCR を実行してテキストを認識し、さらに使用するために抽出することがすべて自動化された方法で可能になります。
前提条件
開始する前に、以下が準備されていることを確認してください:
Python 3.x がインストールされていること
Spire.PDF for Python がインストールされていること:
pip install spire.pdfSpire.OCR for Python がインストールされていること:
pip install spire.ocr公式の Spire.PDF および Spire.OCR ページにアクセスして手動でダウンロードおよびインストールすることもできます。
Spire.OCR 言語モデルファイルがダウンロードされていること(英語、中国語、フランス語、ドイツ語、その他の言語で利用可能)
このガイドでは、両方のライブラリを使用して完全な PDF OCR パイプラインを作成するワークフローを示します。
ステップ 1: PDF ページを画像に変換する
Python PDF OCR に取り組む前に、基本的なステップを理解することが重要です:OCR 技術は PDF ファイルを直接処理しません。特に画像ベースの PDF(スキャン済み文書から作成されたものなど)の場合、まず個々の画像ファイルに変換する必要があります。
Spire.PDF ライブラリを使用して PDF を画像に変換するのは簡単です。対象の PDF 文書を読み込み、各ページを反復処理するだけです。各ページに対して、PdfDocument.SaveAsImage() メソッドを呼び出して個別の画像ファイルとして保存します。このステップが完了すると、画像は後続の OCR プロセスの準備が整います。
Python を使用して PDF を画像に変換する
以下は、PDF ページを PNG 画像に変換する方法の例です:
from spire.pdf import *
# PDF ファイルを読み込む
pdf = PdfDocument()
pdf.LoadFromFile("Sample.pdf")
# ページをループ処理して画像として保存
for i in range(pdf.Pages.Count):
# 各ページを画像に変換
with pdf.SaveAsImage(i) as image:
# 必要に応じて異なる形式で保存
image.Save(f"output/pdftoimage/ToImage_{i}.png")
# image.Save(f"output/ToImage_{i}.jpg")
# image.Save(f"output/ToImage_{i}.bmp")
# PDF 文書を閉じる
pdf.Close()
以下は変換結果のプレビューです:

コードの説明
- LoadFromFile: 指定されたパスから PDF 文書を読み込む
- SaveAsImage(i): 指定されたページ(インデックス
i)を画像オブジェクトに変換 - image.Save(): 画像を希望の形式(PNG、JPG、BMP など)で保存
- with ステートメント: 画像オブジェクトの適切なリソース管理を保証
この段階で、PDF は個別の画像ファイルに変換されています。これらの画像は現在、OCR 技術を使用してテキストコンテンツを抽出するために処理できます。
PDF 変換オプションの詳細については、次を参照してください:Python で PDF を画像形式に変換
ステップ 2: OCR を実行して画像からテキストを抽出する
スキャン済み PDF を画像に変換した後、Python で PDF OCR を実行して PDF からテキストを抽出する作業に進むことができます。Spire.OCR の OcrScanner.Scan() を使用すると、画像内のテキスト認識が簡単になります。英語、中国語、フランス語、ドイツ語など、複数の言語をサポートしています。テキストが抽出されると、.txt ファイルに簡単に保存したり、Word 文書を生成したりできます。
単一画像の OCR とテキスト抽出
以下のコード例は、最初の PDF ページを OCR して Python でテキストにエクスポートする方法を示しています:
from spire.ocr import *
# OCR スキャナーインスタンスを作成
scanner = OcrScanner()
# OCR モデルパスと言語を設定
configureOptions = ConfigureOptions()
configureOptions.ModelPath = r'E:/win-x64/'
configureOptions.Language = 'Japanese'
scanner.ConfigureDependencies(configureOptions)
# 画像に対して OCR を実行
scanner.Scan(r'output/pdftoimage/ToImage_0.png')
# 抽出されたテキストをファイルに保存
text = scanner.Text.ToString()
with open('output/scannedpdfoutput.txt', 'a', encoding='utf-8') as file:
file.write(text + '\n')
以下は OCR 結果のプレビューです:

コードの説明
- OcrScanner: テキスト認識用の OCR スキャナーインスタンスを作成
- ConfigureOptions: OCR エンジンの設定を構成
- ModelPath: OCR 言語モデルファイルへのパスを指定
- Language: 認識言語を設定(例:"English"、"Chinese"、"French"、"German"、"Japanese")
- ConfigureDependencies: 指定された構成で OCR エンジンを初期化
- Scan(): 指定された画像ファイルに対して OCR を実行
- scanner.Text: 認識されたテキストを文字列として取得
- ファイル書き込み: 抽出されたテキストを UTF-8 エンコーディングで
.txtファイルに保存
このセクションでは、単一の画像からテキストを抽出するためのコア OCR ワークフローを示しています。次のセクションでは、このアプローチを拡張して すべてのページを自動的に 処理する方法を説明します。
完全なパイプライン: PDF から抽出されたテキストまで
以下は、PDF OCR からテキスト抽出までの完全なワークフローを示す実行可能な例です:
from spire.pdf import *
from spire.ocr import *
import os
# ---------------------------
# 設定
# ---------------------------
pdf_path = "AI生成アート.pdf"
output_image_dir = "output/pdftoimage"
output_text_file = "output/scannedpdfoutput.txt"
ocr_model_path = r"E:/win-x64/"
ocr_language = "Japanese"
# 出力ディレクトリが存在しない場合は作成
os.makedirs(output_image_dir, exist_ok=True)
os.makedirs(os.path.dirname(output_text_file), exist_ok=True)
# ---------------------------
# ステップ 1: PDF を画像に変換
# ---------------------------
pdf = PdfDocument()
pdf.LoadFromFile(pdf_path)
image_paths = []
for i in range(pdf.Pages.Count):
# 各ページを画像に変換
with pdf.SaveAsImage(i) as image:
image_path = f"{output_image_dir}/ToImage_{i}.png"
image.Save(image_path)
image_paths.append(image_path)
print(f"ページ {i} を {image_path} に変換しました")
pdf.Close()
print(f"変換された総ページ数: {len(image_paths)}")
# ---------------------------
# ステップ 2: すべての画像に対して OCR を実行
# ---------------------------
# OCR スキャナーインスタンスを作成
scanner = OcrScanner()
# OCR モデルパスと言語を設定
configureOptions = ConfigureOptions()
configureOptions.ModelPath = ocr_model_path
configureOptions.Language = ocr_language
scanner.ConfigureDependencies(configureOptions)
# 以前の出力ファイルをクリア
if os.path.exists(output_text_file):
os.remove(output_text_file)
# 各画像を処理
for i, image_path in enumerate(image_paths):
print(f"ページ {i} を処理中: {image_path}")
# 画像に対して OCR を実行
scanner.Scan(image_path)
# テキストを抽出して保存
text = scanner.Text.ToString()
with open(output_text_file, 'a', encoding='utf-8') as file:
file.write(f"--- ページ {i} ---\n")
file.write(text + '\n\n')
print(f"ページ {i} の OCR が完了しました")
print(f"\nOCR が完了しました。テキストは次の場所に保存されました: {output_text_file}")
この完全な例は、PDF OCR パイプライン全体を示しています:
- Spire.PDF を使用して PDF ページを画像に読み込み・変換
- 言語モデルと設定で OCR エンジンを構成
- すべての画像に対して OCR を実行してテキストを抽出
- 構造化された出力ファイルに 抽出されたテキストを保存
このコードを直接実行して、スキャン済み PDF を編集可能なテキストファイルに変換できます。出力には、より良い整理のためにページ区切りが含まれています。
PDF OCR の一般的な課題
PDF OCR を実行するプロセスは単純に見えるかもしれませんが、いくつかの実用的な課題が発生する可能性があります。
1. 画質が悪い
低解像度のスキャンやぼやけた画像は、OCR の精度を低下させる可能性があります。
解決策:
- PDF から画像への変換中に DPI を増加
- 画像前処理を適用(コントラスト強化、ノイズ除去)
- 可能な限り高品質のスキャンソースを使用
2. 複雑なレイアウト
マルチカラムレイアウト、表、または混合コンテンツを含む PDF は、OCR エンジンを混乱させる可能性があります。
解決策:
- 必要に応じてセクションを個別に処理
- 抽出されたテキストを後処理して構造を復元
3. フォントおよびテキスト認識に関する問題
特殊なフォント、手書きのテキスト、装飾的なテキストは、正確に認識されない場合があります。
解決策:
- テキスト認識用のAIモデルを導入してください。「テキスト認識用AIモデルを使用したPython向けSpire.OCRの使い方」を参照してください。
- 重要な文書については、手動で確認を行い、結果を検証してください。
4. 言語検出エラー
間違った言語モデルを使用すると、認識精度が大幅に低下します。
解決策:
- 構成で正しい言語を明示的に設定
- 不明な文書には言語検出ライブラリを使用
- 不確かな場合は複数の言語モデルでテスト
5. 大容量文書の処理性能
数百ページの処理には時間がかかる可能性があります。
解決策:
- 複数のページに対して並列処理を実装
- 画像解像度を最適化(品質と速度のバランス)
- バッチ処理技術を使用
6. 特殊文字と記号
数学記号、図、または非標準の文字は正しく抽出されない可能性があります。
解決策:
- テキスト領域のみに OCR を集中
- 一部の要素には手動修正が必要になることを受け入れる
これらの問題を予測することで、より信頼性の高い PDF OCR ワークフロー を構築し、全体的な抽出品質を向上させることができます。
結論
Python で PDF OCR を実行することは、ワンステップの操作ではなく、PDF を画像に変換し、その後 OCR 技術を使用してテキストコンテンツを認識・抽出する構造化されたプロセスです。
2 段階のパイプライン(PDF から画像への変換、その後に OCR テキスト抽出)に焦点を当て、Spire.PDF と Spire.OCR を備えた Python を使用することで、完全な PDF OCR ソリューション を効率的に実装でき、文書処理タスクの自動化が容易になります。
このアプローチは、編集可能で検索可能なテキストに変換する必要があるスキャン済みの請求書、契約書、レポート、その他の画像ベースの PDF を処理する場合に特に有用です。
Spire.PDF for Python と Spire.OCR for Python のパフォーマンスを評価し、制限を解除したい場合は、30 日間の無料トライアルを申請できます。
よくある質問
PDF OCR とは何ですか?
PDF OCR(光学文字認識)は、スキャン済みまたは画像ベースの PDF を検索可能で編集可能なテキストに変換するプロセスです。スキャン済み PDF には実際のテキストではなく画像が含まれているため、画像内の文字を認識して機械可読のテキストに変換するには OCR 技術が必要です。
Python は PDF に対して直接 OCR を実行できますか?
いいえ。Python は PDF ファイルに対してワンステップで直接 OCR を実行できません。典型的なワークフローには以下が含まれます:
- PDF ライブラリ(例:Spire.PDF)を使用して PDF ページを画像に変換
- OCR エンジン(例:Spire.OCR)を使用して画像に対して OCR を実行
- 認識されたテキストを抽出して保存
Spire.OCR はどの言語をサポートしていますか?
Spire.OCR は、英語、中国語(簡体字および繁体字)、フランス語、ドイツ語、日本語、韓国語など、複数の言語をサポートしています。適切な言語モデルファイルをダウンロードし、Language パラメーターを適切に設定する必要があります。
PDF OCR の精度はどのくらいですか?
OCR の精度はいくつかの要因に依存します:
- 画質と解像度
- フォントの明瞭さとスタイル
- 言語モデルの品質
- 文書レイアウトの複雑さ
高品質のスキャンと明確なフォントは通常 95% 以上の精度を達成します。画質が悪い画像や特殊なフォントは手動修正が必要になる場合があります。
複数の PDF をバッチで OCR できますか?
はい。複数の PDF ファイルをループ処理し、同じ OCR パイプラインをそれぞれに適用できます。大規模な処理の場合は、パフォーマンスを向上させるために並列処理の実装を検討してください。
検索可能 PDF とスキャン済み PDF の違いは何ですか?
- 検索可能 PDF: プログラムで選択、コピー、検索できる実際のテキストレイヤーを含む
- スキャン済み PDF: テキストレイヤーのない本質的に文書の画像であり、コンテンツを抽出するには OCR が必要
この違いを理解することは、PDF 処理ワークフローに OCR が必要かどうかを判断するのに役立ちます。






