【PDF操作比較】pypdfでPDFからテキスト抽出を行う方法

PDF形式の文書は情報共有や保存に便利ですが、その中のテキストデータを直接操作したい場合、少々手間がかかることがあります。特に、LLM(大規模言語モデル)のチューニングデータ作成や、RAG(Retrieval-Augmented Generation)の文書前処理では、PDFデータのテキスト抽出が不可欠です。
そこで、この記事では **PythonのPDF操作ライブラリ「pypdf」**を使って、PDFからテキストを抽出する方法を詳しく解説します。
PDF操作ライブラリの選定
PDFのテキストや表を抽出する為のライブラリは複数存在します。比較するのは以下の3つです:
- pypdf:軽量でシンプルなPDF操作ライブラリ。テキスト抽出機能を備えています。
- pdfplumber:表や図なども抽出できる高機能ライブラリ。
- PyMuPDF(fitz):高速かつ多機能なライブラリで、テキスト抽出やPDF編集が可能。
今回は、軽量で簡単に扱えるpypdfにフォーカスして、基本的な使い方をご紹介します。
pypdfでPDFテキスト抽出を試してみよう!
まずは、簡単なテスト用PDFを用意しましょう。ここでは、Wordで文書を作成し、PDF形式で保存したファイルを使用します。
必要な準備
pypdfのインストール
pypdfはPythonのライブラリとして簡単にインストール可能です。以下のコマンドを実行してください:
pip install pypdf
使用するソースコード
以下のPythonコードを使えば、指定したPDFからテキストを抽出し、テキストファイルとして保存することができます。
import os from PyPDF2 import PdfReader input_pdf_path = "./docs/読み取りテスト文書.pdf" output_txt_path = "./output/text_extract.txt" def extract_text_from_pdf(input_path, output_path): try: reader = PdfReader(input_path) extracted_text = "" for page in reader.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_from_pdf(input_pdf_path, output_txt_path)
実行方法
- 上記コードを
text_extract.pyという名前で保存します。 - ターミナルやコマンドプロンプトで以下のコマンドを実行します:
python3 text_extract.py
これで、指定したPDFファイルからテキストが抽出され、output/text_extract.txt に保存されます。
実行結果
実際に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の本文が入ります。
以上
シンプルなPDFなら問題なく読み取れることが分かります。
pypdfの特徴と限界
メリット
- 軽量で高速:小規模なPDF処理に最適。
- 簡単なインストールと利用方法:コードもシンプルでわかりやすい。
- オープンソース:自由にカスタマイズ可能。
デメリット
- 表や図の抽出は苦手:pypdfはテキストの抽出には強いものの、複雑なレイアウトや表形式のデータには非対応です。
今回の内容をもとに、ぜひpypdfを活用してみてください!あなたのプロジェクトが一歩進む手助けになれば幸いです。
pdfplumberとPyMuPDFのライブラリについても調べていきます。更新をお楽しみに!
この記事をシェアする
合同会社raisexでは一緒に働く仲間を募集中です。
ご興味のある方は以下の採用情報をご確認ください。