PythonでPDFからテキストを取り出したい場合、シンプルなPDFであればpypdfから試すのが現実的です。
この記事では、pypdfのインストール方法から、テキスト抽出の基本的な書き方、よくあるミスと対処法まで順番に解説します。以前よく使われていたPyPDF2との違いについても説明します。
pypdfとは何か
pypdfはPythonでPDFファイルを操作するためのライブラリです。テキストの抽出、ページの結合・分割、メタデータの取得といった処理をPythonのコードから行えます。
以前はPyPDF2が広く使われていましたが、現在はpypdfとして開発が続いています。新しくPDF処理を書く場合は、from pypdf import PdfReader のようにpypdfを使う方が自然です。古い記事ではPyPDF2ベースのコードが残っているため、参考にする場合はインポート文に注意してください。
- pypdf:現在アクティブにメンテナンスされている推奨ライブラリ
- PyPDF2:旧バージョン。新規利用は非推奨
pypdfのインストール方法
pypdfはPythonの標準ライブラリには含まれていないため、pipでインストールします。コマンドプロンプトまたはターミナルで以下を実行してください。
pip install pypdf
インストール後、以下のようにインポートして使います。
from pypdf import PdfReader
エラーなくインポートできればインストールは成功しています。
PDFからテキストを抽出する基本の書き方
特定のページからテキストを抽出する
PDFを読み込むにはPdfReaderを使います。ページは0始まりのインデックスで指定します。
from pypdf import PdfReader
reader = PdfReader("sample.pdf")
# 1ページ目のテキストを抽出(インデックスは0始まり)
page = reader.pages[0]
text = page.extract_text()
print(text)
reader.pages[0]が1ページ目、reader.pages[1]が2ページ目を指します。extract_text()でそのページのテキストを文字列として取得できます。
全ページのテキストをまとめて抽出する
複数ページのテキストをまとめて取得したい場合はループを使います。extract_text()はページによってNoneを返すことがあるため、テキストが取得できた場合のみ連結するように書いておくとエラーを防げます。
from pypdf import PdfReader
reader = PdfReader("sample.pdf")
full_text = ""
for page in reader.pages:
text = page.extract_text()
if text:
full_text += text + "\n"
print(full_text)
ページ数を確認する
PDFの総ページ数は以下で確認できます。
from pypdf import PdfReader
reader = PdfReader("sample.pdf")
print(len(reader.pages))
実行結果の例:
10
よくあるミスと対処法
extract_text()の結果が空になる
テキストを抽出しようとしても空文字やNoneが返ってくる場合、主に以下の原因が考えられます。
- スキャンPDF:紙をスキャンして作ったPDFは、内部にテキストデータが存在せず画像として保存されています。この場合、pypdfではテキストを取り出せません。画像から文字を読み取るOCR処理が別途必要になります。
- 特殊なフォント:フォントの埋め込み方によって抽出に失敗することがあります。
- 暗号化されたPDF:パスワードが設定されているPDFは、復号してから抽出する必要があります。
パスワード付きPDFを読み込む
パスワードで保護されたPDFはdecrypt()で復号してから処理します。
from pypdf import PdfReader
reader = PdfReader("protected.pdf")
if reader.is_encrypted:
reader.decrypt("パスワード")
text = reader.pages[0].extract_text()
print(text)
暗号化方式によっては、復号処理に追加ライブラリが必要になる場合があります。うまく読み込めない場合は、エラーメッセージを確認して必要なライブラリを追加してください。
ModuleNotFoundError: No module named ‘pypdf’
pypdfがインストールされていないか、仮想環境が異なる場合に発生します。pip install pypdfでインストールしてください。また、PyPDF2(大文字混じり)を誤ってインストールしているケースもあります。パッケージ名がpypdf(すべて小文字)であることを確認してください。
pdfplumberとの使い分け
PDFのテキスト抽出でよく比較されるライブラリにpdfplumberがあります。用途によって使い分けるとよいです。
- pypdf:シンプルなテキスト抽出、PDF結合・分割など操作全般に向いています。依存ライブラリが少なく導入がかんたんです。
- pdfplumber:表(テーブル)の抽出や、文字の位置情報を使った処理に向いています。レイアウトを考慮して抽出したい場合に検討しやすいライブラリです。
まずはpypdfで試して、抽出結果が不十分だった場合にpdfplumberを検討するという順番が現実的です。
AIが生成したコードでPDFを扱う場合の注意点
AIにPDF処理のコードを生成させると、古い記事を参照してPyPDF2ベースのコードが出てくることがあります。pypdfとPyPDF2ではインポート文が異なるため、生成されたコードがどちらを前提にしているかを確認してから使うようにしてください。
ライブラリの新旧や用途の違いを見分けるには、基礎的な知識が下地として効いてきます。AIを使ってPythonを学ぶ場合の考え方については、AI時代でもプログラミング学習は必要かで整理しています。
まとめ
pypdfを使ったPDFのテキスト抽出は、以下の手順で行います。
pip install pypdfでインストールするPdfReaderでPDFを読み込むpage.extract_text()でテキストを取得する- 全ページ抽出はループで処理し、Noneチェックを入れる
テキストが空になる場合はスキャンPDFか暗号化PDFを疑ってください。抽出精度をさらに高めたい場合はpdfplumberの利用も検討してみてください。