【Python】MyPDF2でPDFからテキストをカンタンに抽出する方法 ~備忘録~
MyPDF2は、PythonでPDFファイルを操作するための便利なライブラリです。初心者でも使いやすいシンプルな設計が特徴で、PDFファイルの結合、分割、暗号化など、様々な操作を簡単に行えます。
本記事では、MyPDF2を使ってPDFからテキストを取得する方法を、サンプルコード付きで詳しく解説します。記事前半では、MyPDF2の概要、インストール方法、そして基本的な使用方法について説明します。後半では、複数のPDFファイルからテキストを取得する応用例も紹介していきます。
■MyPDF2とは?
MyPDF2は、PythonでPDFファイルを操作するためのライブラリです。PDFファイルの結合、分割、暗号化など、様々な操作を行うことができます。初心者でも使いやすいシンプルな設計が特徴です。
◆必要なもの:
Python環境
MyPDF2ライブラリ
◆MyPDF2のインストール:
MyPDF2ライブラリは、以下のコマンドでインストールできます。
pip install PyPDF2
■サンプルコード①:
任意のPDFファイル全ページからテキストを出力する。
サンプルコードをご紹介します。
'''
<概要>
指定したPDFのテキストを全て取得する。
<準備>
ソースファイルと同じフォルダに’sample.pdf'を入れる。
'''
import PyPDF2
filename = 'sample.pdf' #任意で変更
# PDFファイルを開く
pdf_file = open(filename, 'rb')
# PDFリーダーオブジェクトを作成
pdf_reader = PyPDF2.PdfReader(pdf_file)
# ページを繰り返し処理し、テキストを取得
text = ''
for page_num in range(len(pdf_reader.pages)):
page = pdf_reader.pages[page_num]
text += page.extract_text()
# テキストを出力
print(text)
with open('output.txt', "w") as f:
f.write(text)
# ファイルを閉じる
pdf_file.close()
◆使用方法:
ソースコードと同じフォルダに、『sample.pdf』を用意します。
プログラムを実行します。
実行結果は「output.txt」に出力します。
■サンプルコード①の説明
◆PyPDF2モジュールをインポート:
import PyPDF2
◆PDFファイルを開く:
pdf_file = open('sample.pdf', 'rb')
◆PDFリーダーオブジェクトを作成:
pdf_reader = PyPDF2.PdfReader(pdf_file)
◆パスワードを指定:
pdf_reader.decrypt('パスワード') #パスワードが不要ファイルの場合は無視される。
◆PDFのページ数を取得:
# PDFファイル内のすべてのページを表すページオブジェクトのリスト取得。
pdf_reader.pages
# リストの長さ (要素の数) 取得 = ページ数。
len(pdf_reader.pages)
◆PDFのページからテキスト取得:
# PDFページオブジェクトからテキスト情報を抽出するメソッド
# - PDFページ内に存在するすべてのテキストコンテンツを抽出します。
# - 画像内の文字や特殊なフォントは無視される。
page.extract_text()
◆ページを繰り返し処理し、各ページのテキストを取得:
text = ''
for page_num in range(len(pdf_reader.pages)):
page = pdf_reader.pages[page_num]
text += page.extract_text()
■サンプルコード②:
指定したファルダ内のPDFファイル全ページからテキストを出力する。
複数のPDFファイルのテキストを、一気に取得するサンプルコードを紹介します。
'''
<概要>
PDFフォルダ内、PDFファイルのテキストを全て取得する。
<準備>
ソースファイルと同じフォルダに『PDF』フォルダ用意する。
『PDF』フォルダにPDFファイルを入れる。
'''
import PyPDF2, os
from sys import exit
folder = "PDF"
password = '123456'
#PDFファイルリスト取得
files = os.listdir(folder)
pdf_files = [f for f in files if f.endswith(".pdf")]
#PDFファイルがなければ終了
if not pdf_files:
print("PDFファイルが見つかりません。")
exit()
for pdf in pdf_files:
# PDFファイルを開く
pdf_file = open(os.path.join(folder ,pdf), 'rb')
try:
# PDFリーダーオブジェクトを作成
pdf_reader = PyPDF2.PdfReader(pdf_file)
except:
print(f'▲ファイルオープンに失敗しました >> {pdf}')
continue
# ページ数を取得
try:
num_pages = len(pdf_reader.pages)
except:
print(f'▲ページ数の取得に失敗しました >> {pdf}')
pdf_file.close()
continue
# ページを繰り返し処理し、テキストを取得
text = ''
for page_num in range(num_pages):
page = pdf_reader.pages[page_num]
text += page.extract_text()
# テキストを出力
print(f"■ {pdf} ■")
print(text)
with open('output.txt', "a") as f: #追記
f.write(text)
# ファイルを閉じる
pdf_file.close()
■作成中に発生したエラー
◆PyPDF2がPDFファイルの暗号化方式を正しく認識できず、復号化に失敗
pdf_reader = PyPDF2.PdfReader(pdf_file)
^^^^^^^^^^^^^^^^^^^^^^^^^^
~
self._encryption.verify(pwd) == PasswordType.NOT_DECRYPTED
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
~
私の場合、試しに使用した内閣府の防災情報『災害時に便利なアプリとWEBサイト(多言語).pdf』が上記エラーにより開けませんでした。
このファイルはパスワードが掛かっていないファイルでしたがダメでした。
PyPDF2にはPDFの古いバージョンにのみ対応しているようですので注意が必要です。
■まとめ
MyPDF2を使えば、PDFファイル内のテキストを一気に取得できます。今回紹介した方法は、基本的なものなので、必要に応じて応用することができます。