見出し画像

【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()

◆使用方法:

  1. ソースコードと同じフォルダに、『sample.pdf』を用意します。

  2. プログラムを実行します。

  3. 実行結果は「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ファイル内のテキストを一気に取得できます。今回紹介した方法は、基本的なものなので、必要に応じて応用することができます。

この記事が気に入ったらサポートをしてみませんか?