PythonでPDFを扱う方法(pdfminer)

Python

本日はPythonでPDFのテキスト情報を抽出する方法を解説します。
最初にPDF全体のテキスト情報を抽出する方法を解説します。
その次にページごとにPDFのテキスト情報を抽出する方法についても解説します。
開発環境はJupyterLab Desktopを使用します

ライブラリのインストール

まずは事前準備としてPDFを扱うためのライブラリをインストールします。
PDFを扱うライブラリとしては画面上に映しているpdfminerを使用します。

GitHub - pdfminer/pdfminer.six: Community maintained fork of pdfminer - we fathom PDF
Community maintained fork of pdfminer - we fathom PDF - pdfminer/pdfminer.six

pdfminerをインストールするためにはJupyterLab Desktop上でNotebookを開き、そこに%pip install pdfminer.sixと入力して実行します。

PDF全体のテキスト情報を抽出する方法

抽出を実行

まずは抽出対象のPDFファイルを適当に用意します。
プログラミング pdfでGoogle検索すると文部科学省が公開しているプログラミングに関するPDFファイルが見つかりましたのでこれを使用します。

こちらのPDFファイルをダウンロードしてJupyterLab Desktopのフォルダにアップロードします。
test.pdfという名前でJupyterLab Desktopのファイル一覧にアップロードします。

from pdfminer.high_level import extract_text
 
FILE_PATH = "./test.pdf"
 
text = extract_text(FILE_PATH)
print(text)

そして、上のコードを実行することでPDF内のテキストを抽出することができます。
Ctrl+Enterで実行してみましょう。
すると出力結果が現れます

このPDFは62ページもあるので、大量に抽出結果が出力されています
抽出された結果とPDFの内容を比べてみましょう。

御覧の通り、PDFの内容がしっかりと抽出されていることがわかります。

実装の解説

それでは、先程のコーディングの内容を再掲載し、実装について詳しく内容を解説してゆきます。

# ①ライブラリのインポート
from pdfminer.high_level import extract_text

# ②PDFファイルからテキストを抽出
FILE_PATH = "./test.pdf"
 
text = extract_text(FILE_PATH)

# ③結果の出力
print(text)
  1. まずは一番最初にimport文でPDF抽出のためのライブラリをインポートしています。
  2. 次にPDFファイルからテキストを抽出する処理を実行しております。
    extract_textの引数にファイル名を入力して実行することでテキスト抽出処理を実行できます。
  3. そして最後、抽出したテキストの内容をprint関数で出力しております

以上がPDFファイルからテキストを抽出する処理についての解説です

ページごとにPDFのテキスト情報を抽出する方法

先程はPDF内のすべてのテキストを出力していましたが、今回は特定のページのみを出力します。

抽出を実行

from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from io import StringIO
from pdfminer.layout import LAParams
from pdfminer.converter import TextConverter

pdf_pages = {}
cnt = 1
FILE_PATH = "./test.pdf"

with open(FILE_PATH, 'rb') as fp:
    for page in PDFPage.get_pages(fp):
      rsrcmgr = PDFResourceManager()
      outfp = StringIO()
      laparams = LAParams()
      device = TextConverter(rsrcmgr, outfp, codec='utf-8', laparams=laparams)
      interpreter = PDFPageInterpreter(rsrcmgr, device)
      interpreter.process_page(page)

      pdf_pages[cnt] = outfp.getvalue()
      cnt += 1

画面のコードを実行すれば特定のページのテキストを抽出できます。
今回は二ページ目を出力します。
御覧の通りに二ページ目のみが出力されています。

実装の解説

# ①ライブラリのインポート
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from io import StringIO
from pdfminer.layout import LAParams
from pdfminer.converter import TextConverter

pdf_pages = {}
cnt = 1
FILE_PATH = "./test.pdf"

# ②PDFから実際にテキストを取り出す
with open(FILE_PATH, 'rb') as fp:
    for page in PDFPage.get_pages(fp):
      rsrcmgr = PDFResourceManager()
      outfp = StringIO()
      laparams = LAParams()
      device = TextConverter(rsrcmgr, outfp, codec='utf-8', laparams=laparams)
      interpreter = PDFPageInterpreter(rsrcmgr, device)
      interpreter.process_page(page)

      pdf_pages[cnt] = outfp.getvalue()
      cnt += 1

print(pdf_pages[2])

それでは、先程のコーディングの内容を再掲載し、実装について詳しく内容を解説してゆきます。

①ライブラリのインポート

まずは必要なライブラリ一式をインポートします。
簡単に概要を解説すると以下の通りです。

ライブラリ名内容
PDFPagePDFファイルのページを取得する
PDFResourceManagerPDFの内容を管理する
PDFPageInterpreterPDFのページを解析する
LAParamsPDFのレイアウトパラメータに関する
TextConverterPDF内のテキストを取り出す
StringIO取り出したテキストの出力先を作る
ライブラリ名一覧

②PDFから実際にテキストを取り出す

続いて、PDFから実際にテキストを取り出す部分です。
PDFを開いてPDFのページ情報を全て取得し、ループで一ページずつ処理してゆきます。
PDFResourceManager、StringIO、LAParamsを初期化します。

...
      rsrcmgr = PDFResourceManager()
      outfp = StringIO()
      laparams = LAParams()
...
...
      device = TextConverter(rsrcmgr, outfp, codec='utf-8', laparams=laparams)
      interpreter = PDFPageInterpreter(rsrcmgr, device)
...

TextConverterにPDFResourceManagerオブジェクト、StringIOオブジェクト、LAParamsオブジェクトを設定して初期化します。
さらにPDFResourceManagerオブジェクトとTextConverterオブジェクトを用いてPDFPageInterpreterを初期化します。

...
      interpreter.process_page(page)
...

そして、process_pageでページ情報を処理します。

...
      pdf_pages[cnt] = outfp.getvalue()
...

そして、StringIOのgetvalueメソッドでページのテキスト情報を取得し、キーをページ番号付きで辞書に格納します。

print(pdf_pages[2])

ページのテキスト情報を辞書に格納し終わったらprintで特定のページを出力します。

以上、ページごとにPDFのテキスト情報を抽出する方法でした。

タイトルとURLをコピーしました