Python を利用して PDF ファイルからテキスト情報を抽出する場合、PyMuPDF (Fitz) を利用することが可能です。高速な処理、豊富な機能、活発なメンテナンスにより、PyMuPDF は多くの開発者から支持されています。
PyMuPDF
PyMuPDF は、C 言語で書かれた MuPDF ライブラリの Python バインディングです。PDF だけでなく、XPS、EPUB、FB2 など、さまざまなドキュメント形式に対応しています。
環境構築
PyMuPDF は pip (Python のパッケージ管理ツール) を使って簡単にインストールできます。
pip install pymupdf
基本的なテキスト抽出
まずは、PDF ファイルからテキストを抽出する最も基本的なコードを紹介します。PDF ファイルを開き、各ページを順に処理し、各ページからテキストを抽出して、最後に全て結合して表示します。
import fitz # PyMuPDF # PDF ファイルを開く doc = fitz.open("example.pdf") # example.pdf は抽出したい PDF ファイル名 # 抽出したテキストを格納する変数 text = "" # 各ページをループ for page in doc: text += page.get_text() # テキストを抽出して変数に追加 # 抽出したテキストを表示 print(text) # ドキュメントを閉じる doc.close()
with ステートメントの利用
上記のコードは with ステートメントを使うと、より簡潔に記述でき、ファイルの閉じ忘れも防げます。
import fitz with fitz.open("example.pdf") as doc: text = "" for page in doc: text += page.get_text() print(text)
出力形式の変更
page.get_text() メソッドは、引数によって出力形式を変えられます。PDF ファイルを開き、各ページから HTML 形式でテキストを抽出し、表示します。例えば、page.get_text("html"):ではテキストを HTML 形式で取得します。
import fitz with fitz.open("example.pdf") as doc: html_text = "" for page in doc: html_text += page.get_text("html") # HTML 形式で抽出 print(html_text)
主な出力形式
| 形式 | 説明 |
|---|---|
"text" |
(デフォルト) プレーンテキスト |
"html" |
HTML 形式 (スタイル情報を含む) |
"xhtml" |
XHTML 形式 (XML に準拠した HTML) |
"xml" |
XML 形式 |
"json" |
JSON 形式 (テキストブロック、行、単語、文字レベルの情報を含む) |
"rawjson" |
JSON 形式 (より詳細なレイアウト情報を含む) |
"dict" |
Python 辞書形式 (JSON 形式に似ているが、Python オブジェクトとして直接利用可能) |
"rawdict" |
Python 辞書形式 (より詳細な情報を含む) |
テキスト抽出の応用
特定ページ範囲の抽出
PDF ファイルを開き、指定した範囲のページからテキストを抽出します。ページ数をしているするときに利用するrange()では、0から数えますので、例えばrange(1, 4)では2 ページ目から 4 ページ目までのページを指定するということに注意してください。
import fitz with fitz.open("example.pdf") as doc: text = "" # 2ページ目から4ページ目まで抽出 for page_num in range(1, 4): # 2, 3, 4ページ が対象 page = doc[page_num] # ページ番号でページを取得 text += page.get_text() print(text)
テキストブロックの抽出
PDFファイルを開き、各ページのテキストを、テキストブロック(段落など)ごとに区切って抽出します。
import fitz with fitz.open("example.pdf") as doc: for page in doc: blocks = page.get_text("dict")["blocks"] # テキストブロックの情報を取得 for b in blocks: # 各ブロックを処理 if b["type"] == 0: # type 0 がテキストブロック for line in b["lines"]:#各行をループ for span in line["spans"]:#各スパン(単語)をループ print(span["text"])
画像を含むページの処理
PDFファイルを開き、各ページを走査して、テキストブロックと画像ブロックを区別して情報を出力します
import fitz with fitz.open("example.pdf") as doc: for page_num, page in enumerate(doc): # ページ番号とページを取得 blocks = page.get_text("blocks") # テキストと画像ブロックの情報を取得 for b in blocks: if b[6] == 0: # テキストブロック print(f"Page {page_num + 1} (Text Block):\n{b[4]}\n") elif b[6] == 1: # 画像ブロック print(f"Page {page_num + 1} (Image Block): Image {b[0]}\n")
抽出したテキストのファイルへの保存
PDF ファイルからテキストを抽出し、そのテキストをファイルに保存します。
import fitz with fitz.open("example.pdf") as doc: text = "" for page in doc: text += page.get_text() # ファイルに書き込み (UTF-8 エンコーディング) with open("output.txt", "w", encoding="utf-8") as f: f.write(text)
まとめ
PyMuPDF (Fitz) は、Python で PDF からテキストを抽出するための非常に強力で使いやすいライブラリです。基本的なテキスト抽出から、出力形式の変更、特定ページの抽出、テキストブロックの処理、そしてファイルへの保存まで、幅広い応用が可能です。PyMuPDFには他にも便利な機能があり、別記事で紹介しています。組み合わせて利用して下さい。
最後にPythonの学習に利用できるUdemy
のサイトを紹介します。ぜひ活用ください。
[PR]
退屈なことはPythonにやらせよう 第2版 ノンプログラマーにもできる自動化処理プログラミング [ AI Sweigart ]