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

PDF操作ライブラリの比較検討記事の続きです。
前回の記事はこちら
PDFファイルからテキストや表データを抽出する作業は、データ前処理において重要な役割を果たします。特に、LLM(大規模言語モデル)のチューニングやRAG(Retrieval-Augmented Generation)の文書前処理では、PDFデータの扱いやすさが効率を左右します。
今回ご紹介するのは、Pythonライブラリのpdfplumberを使ったテキストと表データの抽出方法です。このライブラリは、テキストだけでなく複雑な表形式データにも対応しており、非常に便利です!
pdfplumberの概要
pdfplumberは、PDFから以下のようなデータを簡単に抽出できるライブラリです:
- テキスト
- 表(表形式データ)
- 画像や図
pdfplumberの基本的な使い方
以下では、テキスト抽出と表抽出の方法をそれぞれ紹介します。
PDFは前回の記事で使ったものと同じものを使います。
テキストの抽出
必要な準備
まずは、pdfplumberをインストールします。
pip install pdfplumber
テキスト抽出のコード例
以下のコードを使えば、PDFからテキストを抽出してファイルに保存できます。
import os import pdfplumber input_pdf_path = "./docs/読み取りテスト文書.pdf" output_txt_path = "./output/text_extract.txt" def extract_text_with_pdfplumber(input_path, output_path): try: with pdfplumber.open(input_path) as pdf: extracted_text = "" for page in pdf.pages: extracted_text += page.extract_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_pdfplumber(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-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-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
このように、PDFのレイアウトに沿ったテキストが抽出されます。
表の抽出
pdfplumberでは表の内容をリスト形式で取り出せるため、後続処理が簡単です。
表抽出のコード例
次のコードは、PDFから表を抽出し、タブ区切り形式でファイルに保存する例です。
import os import pdfplumber input_pdf_path = "./docs/読み取りテスト文書.pdf" output_txt_path = "./output/table_extract.txt" def extract_tables_with_pdfplumber(input_path, output_path): try: with pdfplumber.open(input_path) as pdf: extracted_table = "" for i, page in enumerate(pdf.pages, start=1): tables = page.extract_tables() if tables: for table in tables: for row in table: extracted_table += "\t".join(row) + "\n" extracted_table += "\n" # テーブル間に空行を追加 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_table) print(f"テーブルデータが正常に抽出され、以下のファイルに保存されました: {output_path}") except Exception as e: print(f"エラーが発生しました: {e}") # 実行 if __name__ == "__main__": extract_tables_with_pdfplumber(input_pdf_path, output_txt_path)
実行方法
コードを table_extract.py として保存し、以下のコマンドで実行します:
python3 table_extract.py
結果
抽出した表の例:
列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 列2 列3 列4
行 1列 1の本文が
入ります。 行1列 2の本文が
入ります。 行1列 3の本文が
入ります。 行1列 4の本文が
入ります。
行 2列 1の本文が
入ります。 行2列 2の本文が
入ります。 行2列 3の本文が
入ります。 行2列 4の本文が
入ります。
このように、PDFの表が整った形式で抽出されます。
3. 抽出データの後処理
pdfplumberで抽出した表データは、リスト形式で取得されます。このデータをさらに加工する場合、pandasを活用すると便利です。
PandasでのExcel出力例
import pandas as pd # 抽出した表データをリスト形式にする(例) data = [ ["列1", "列2", "列3", "列4"], ["行1列1", "行1列2", "行1列3", "行1列4"], ["行2列1", "行2列2", "行2列3", "行2列4"] ] # データフレームとして作成 df = pd.DataFrame(data[1:], columns=data[0]) # Excelファイルとして保存 df.to_excel("./output/extracted_table.xlsx", index=False) print("表データがExcelファイルに保存されました!")
pdfplumberの活用ポイント
- テキスト抽出に加え、表データも簡単に処理可能。
- 後続処理との組み合わせが簡単(例:pandasでExcel出力)。
- 複雑なレイアウトでも精度高く抽出。
これで、PDFからテキストや表を抽出する方法はバッチリです!ぜひ、pdfplumberを使って、プロジェクトの効率化に役立ててください。
次はPyMuPDFのライブラリについても調べていきます。更新をお楽しみに!
この記事をシェアする
合同会社raisexでは一緒に働く仲間を募集中です。
ご興味のある方は以下の採用情報をご確認ください。