【PDF操作比較】PyMuPDFでPDFからテキストも表も簡単抽出

PDF操作ライブラリの比較検討記事の続きです。
前回までの記事はこちら
PDFデータの前処理において、テキスト抽出と表形式データの抽出は非常に重要な作業です。今回紹介するのは、PythonライブラリのPyMuPDFを活用したPDFデータの抽出方法です。PyMuPDFは、速度と柔軟性に優れたPDF操作ライブラリで、シンプルなAPI設計が特徴です。
PyMuPDFの特徴
- 軽量で高速: 大量のPDFファイルでも効率よく処理できます。
- 多機能: テキスト抽出だけでなく、表や画像の抽出、PDF編集も可能。
- RAGやLLMに最適: 抽出結果を後続処理に簡単に利用できます。
今回は、基本的なテキスト抽出と表抽出にフォーカスして解説します。
PyMuPDFを使ったテキスト抽出
PyMuPDFのインストール
以下のコマンドを実行してインストールします:
pip install PyMuPDF
サンプルコード
以下のコードは、PDFからテキストを抽出し、ファイルに保存するシンプルな例です。
import os import pymupdf input_pdf_path = "./docs/読み取りテスト文書.pdf" output_txt_path = "./output/text_extract.txt" def extract_text_with_pymupdf(input_path, output_path): try: doc = pymupdf.open(input_path) extracted_text = "" for page in doc: extracted_text += page.get_text() output_dir = os.path.dirname(output_path) if not os.path.exists(output_dir): os.makedirs(output_dir) with open(output_path, "w", encoding="utf-8") as f: f.write(extracted_text) print(f"テキストが正常に抽出され、以下のファイルに保存されました: {output_path}") except Exception as e: print(f"エラーが発生しました: {e}") # 実行 if __name__ == "__main__": extract_text_with_pymupdf(input_pdf_path, output_txt_path)
実行方法
上記コードを text_extract.py として保存し、以下のコマンドで実行します:
python3 text_extract.py
結果
実行すると、PDFのテキストが抽出され、以下のような結果が得られます:
1
文書のタイトル
見出し1
見出し1-1
ここには見出し1-1 の本文が入ります。ここには見出し1-1 の本文が入ります。ここには見
出し1-1 の本文が入ります。ここには見出し1-1 の本文が入ります。ここには見出し1-1 の
本文が入ります。ここには見出し1-1 の本文が入ります。ここには見出し1-1 の本文が入り
ます。ここには見出し1-1 の本文が入ります。ここには見出し1-1 の本文が入ります。ここ
には見出し1-1 の本文が入ります。ここには見出し1-1 の本文が入ります。
見出し1-2
ここには見出し1-2 の本文が入ります。ここには見出し1-2 の本文が入ります。ここには見
出し1-2 の本文が入ります。ここには見出し1-2 の本文が入ります。ここには見出し1-2 の
本文が入ります。ここには見出し1-2 の本文が入ります。ここには見出し1-2 の本文が入り
ます。
ここには見出し1-2 の本文が入ります。ここには見出し1-2 の本文が入ります。
2
ここには見出し1-2 の本文が入ります。ここには見出し1-2 の本文が入ります。
見出し1-3
ここには見出し1-3 の本文が入ります。ここには見出し1-3 の本文が入ります。
ここには見出し1-3 の本文が入ります。ここには見出し1-3 の本文が入ります。ここには見
出し1-3 の本文が入ります。ここには見出し1-3 の本文が入ります。ここには見出し1-3 の
本文が入ります。ここには見出し1-3 の本文が入ります。
3
列1
列2
列3
列4
行1 列1 の本文が入
ります。
行1 列2 の本文が入
ります。
行1 列3 の本文が入
ります。
行1 列4 の本文が入
ります。
行2 列1 の本文が入
ります。
行2 列2 の本文が入
ります。
行2 列3 の本文が入
ります。
行2 列4 の本文が入
ります。
行3 列1 の本文が入
ります。
行3 列2 の本文が入
ります。
行3 列3 の本文が入
ります。
行3 列4 の本文が入
ります。
表1. 表1 の名前が入ります。
列1
列2
列3
列4
行1 列1 の本文が
入ります。
行1 列2 の本文が
入ります。
行1 列3 の本文が
入ります。
行1 列4 の本文が
入ります。
行2 列1 の本文が
入ります。
行2 列2 の本文が
入ります。
行2 列3 の本文が
入ります。
行2 列4 の本文が
入ります。
表2. 表2 の名前が入ります。
見出し1-4
ここには見出し1-4 の本文が入ります。ここには見出し1-4 の本文が入ります。ここには見
4
出し1-4 の本文が入ります。ここには見出し1-4 の本文が入ります。ここには見出し1-4 の
本文が入ります。ここには見出し1-4 の本文が入ります。ここには見出し1-4 の本文が入り
ます。ここには見出し1-4 の本文が入ります。ここには見出し1-4 の本文が入ります。ここ
には見出し1-4 の本文が入ります。
5
見出し2
(項目名が入ります)
見出し2-1 ここには見出し2-1 の本文が入ります。ここには見出し2-1 の本文が入り
ます。ここには見出し2-1 の本文が入ります。ここには見出し2-1 の本文が入ります。ここ
には見出し2-1 の本文が入ります。ここには見出し2-1 の本文が入ります。ここには見出し
2-1 の本文が入ります。ここには見出し2-1 の本文が入ります。
(項目名が入ります)
見出し2-2 ここには見出し2-2 の本文が入ります。ここには見出し2-2 の本文が入り
ます。ここには見出し2-2 の本文が入ります。ここには見出し2-2 の本文が入ります。ここ
には見出し2-2 の本文が入ります。ここには見出し2-2 の本文が入ります。ここには見出し
2-2 の本文が入ります。
ここには見出し2-2 の本文が入ります。
以上
PyMuPDFを使った表抽出
PyMuPDFでは、PDF内の表をリスト形式で抽出することができます。
サンプルコード
以下は、表を抽出してMarkdown形式で保存する例です:
import pymupdf import os input_pdf_path = "./docs/読み取りテスト文書.pdf" output_txt_path = "./output/table_extract.txt" def extract_tables_with_pymupdf(input_path, output_path): doc = pymupdf.open(input_path) for i, page in enumerate(doc, start=1): tabs = page.find_tables() print(f"{len(tabs.tables)} found on {page}") if tabs.tables: for table in tabs.tables: extracted_text = table.to_markdown() output_dir = os.path.dirname(output_path) if not os.path.exists(output_dir): os.makedirs(output_dir) with open(output_path, "w", encoding="utf-8") as f: f.write(extracted_text) if __name__ == "__main__": extract_tables_with_pymupdf(input_pdf_path, output_txt_path)
実行方法
コードを table_extract.py として保存し、以下のコマンドで実行します:
python3 table_extract.py
結果
以下のようなMarkdown形式のテーブルが出力されます:
|列1|列2|列3|列4| |---|---|---|---| |行 1 列 1 の本文が 入ります。|行1 列 2 の本文が 入ります。|行1 列 3 の本文が 入ります。|行1 列 4 の本文が 入ります。| |行 2 列 1 の本文が 入ります。|行2 列 2 の本文が 入ります。|行2 列 3 の本文が 入ります。|行2 列 4 の本文が 入ります。|
PyMuPDF4LLMで効率化
LLMやRAG向けに特化したPyMuPDFの派生ライブラリPyMuPDF4LLMも非常に便利です。これを使えば、PDF全体をMarkdown形式で抽出できます。
インストール
pip install pymupdf4llm
サンプルコード
import pymupdf4llm input_pdf_path = "./docs/読み取りテスト文書.pdf" output_txt_path = "./output/md_extract.md" def extract_md_with_pymupdf4llm(input_path, output_path): md_text = pymupdf4llm.to_markdown(input_path) with open(output_path, "w", encoding="utf-8") as f: f.write(md_text) if __name__ == "__main__": extract_md_with_pymupdf4llm(input_pdf_path, output_txt_path)
実行方法
以下のコマンドで実行します:
python3 md_extract.py
結果
PDFの内容が見出しやテーブル付きでMarkdown形式に変換されます:
# 文書のタイトル ## 見出し1 ### 見出し1-1 ここには見出し1-1 の本文が入ります。ここには見出し1-1 の本文が入ります。ここには見 出し1-1 の本文が入ります。ここには見出し1-1 の本文が入ります。ここには見出し1-1 の 本文が入ります。ここには見出し1-1 の本文が入ります。ここには見出し1-1 の本文が入り ます。ここには見出し1-1 の本文が入ります。ここには見出し1-1 の本文が入ります。ここ には見出し1-1 の本文が入ります。ここには見出し1-1 の本文が入ります。 ### 見出し1-2 ここには見出し1-2 の本文が入ります。ここには見出し1-2 の本文が入ります。ここには見 出し1-2 の本文が入ります。ここには見出し1-2 の本文が入ります。ここには見出し1-2 の 本文が入ります。ここには見出し1-2 の本文が入ります。ここには見出し1-2 の本文が入り ます。 ここには見出し1-2 の本文が入ります。ここには見出し1-2 の本文が入ります。 1 ----- ここには見出し1-2 の本文が入ります。ここには見出し1-2 の本文が入ります。 ### 見出し1-3 ここには見出し1-3 の本文が入ります。ここには見出し1-3 の本文が入ります。 ここには見出し1-3 の本文が入ります。ここには見出し1-3 の本文が入ります。ここには見 出し1-3 の本文が入ります。ここには見出し1-3 の本文が入ります。ここには見出し1-3 の 本文が入ります。ここには見出し1-3 の本文が入ります。 2 ----- |列1|列2|列3|列4| |---|---|---|---| |行1 列1 の本文が入 ります。|行1 列2 の本文が入 ります。|行1 列3 の本文が入 ります。|行1 列4 の本文が入 ります。| |行2 列1 の本文が入 ります。|行2 列2 の本文が入 ります。|行2 列3 の本文が入 ります。|行2 列4 の本文が入 ります。| |行3 列1 の本文が入 ります。|行3 列2 の本文が入 ります。|行3 列3 の本文が入 ります。|行3 列4 の本文が入 ります。| 表1. 表1 の名前が入ります。 列1 列2 列3 列4 行1 列1 の本文が 行1 列2 の本文が 行1 列3 の本文が 行1 列4 の本文が 入ります。 入ります。 入ります。 入ります。 行2 列1 の本文が 行2 列2 の本文が 行2 列3 の本文が 行2 列4 の本文が 入ります。 入ります。 入ります。 入ります。 表2. 表2 の名前が入ります。 ### 見出し1-4 ここには見出し1-4 の本文が入ります。ここには見出し1-4 の本文が入ります。ここには見 3 |列1|列2|列3|列4| |---|---|---|---| |行 1 列 1 の本文が 入ります。|行1 列 2 の本文が 入ります。|行1 列 3 の本文が 入ります。|行1 列 4 の本文が 入ります。| |行 2 列 1 の本文が 入ります。|行2 列 2 の本文が 入ります。|行2 列 3 の本文が 入ります。|行2 列 4 の本文が 入ります。| ----- 出し1-4 の本文が入ります。ここには見出し1-4 の本文が入ります。ここには見出し1-4 の 本文が入ります。ここには見出し1-4 の本文が入ります。ここには見出し1-4 の本文が入り ます。ここには見出し1-4 の本文が入ります。ここには見出し1-4 の本文が入ります。ここ には見出し1-4 の本文が入ります。 4 ----- ## 見出し2 (項目名が入ります) ### 見出し2-1 ここには見出し2-1 の本文が入ります。ここには見出し2-1 の本文が入り ます。ここには見出し2-1 の本文が入ります。ここには見出し2-1 の本文が入ります。ここ には見出し2-1 の本文が入ります。ここには見出し2-1 の本文が入ります。ここには見出し 2-1 の本文が入ります。ここには見出し2-1 の本文が入ります。 (項目名が入ります) ### 見出し2-2 ここには見出し2-2 の本文が入ります。ここには見出し2-2 の本文が入り ます。ここには見出し2-2 の本文が入ります。ここには見出し2-2 の本文が入ります。ここ には見出し2-2 の本文が入ります。ここには見出し2-2 の本文が入ります。ここには見出し 2-2 の本文が入ります。 ここには見出し2-2 の本文が入ります。 以上 5 -----
PyMuPDFのメリットと活用方法
- テキストと表を統合的に扱える。
- 高速かつ効率的に処理可能。
- Markdown形式での出力に対応しており、RAGやLLMに最適。
PyMuPDFを活用して、PDFデータの前処理を効率化し、プロジェクトの生産性を向上させましょう!
この記事をシェアする
合同会社raisexでは一緒に働く仲間を募集中です。
ご興味のある方は以下の採用情報をご確認ください。