PDFminerでPDFからテキストを自動取得する

AI活用

PDFファイルは、文書を共有する際に便利なフォーマットですが、その内容を編集したり、他のアプリケーションで利用したりするには、テキストデータとして抽出する必要があります。

そこで今回は、Pythonのpdfminerライブラリを使って、PDFファイルからテキストを自動取得するプログラムを作成したので、その方法をご紹介します。

今回はトヨタ自動車の2023年3月期決算からテキストを自動取得してみます。

プログラム全体像

今回作成したプログラムを紹介します。

Python
from pdfminer.pdfinterp import PDFResourceManager   #PDFのテキストや画像を管理するクラス
from pdfminer.layout import LAParams                #テキスト抽出に必要なパラメータを設定するクラス
from pdfminer.converter import TextConverter        #PDFのテキストを抽出するためのクラス
from pdfminer.pdfpage import PDFPage                #PDFの1ページごとの情報を管理するクラス
from pdfminer.pdfinterp import PDFPageInterpreter   #PDFpageから必要な処理を行うクラス
from io import StringIO

# PDFファイルを開く
pdf_file = open("toyota_fiscal.pdf","rb")

#読みだすテキストの出力先(今回は文字ストリーム)
outIO = StringIO()

rmgr = PDFResourceManager() #PDFResourceManagerオブジェクトの取得
lprms = LAParams()          # LAParamsオブジェクトの取得
txtcvt = TextConverter(rmgr, outIO, laparams=lprms)    #TextConverterにリソースマネージャと出力先ストリームを指定
iprtr = PDFPageInterpreter(rmgr, txtcvt) # PDFPageInterpreterにリソースマネージャと使用するテキストコンバータを指定

# PDFファイルから1ページずつ解析(テキスト抽出)処理する
for page in PDFPage.get_pages(pdf_file):
    iprtr.process_page(page)

text = outIO.getvalue()  # Pythonコンソールへの出力内容を取得

outIO.close()  # I/Oストリームを閉じる
txtcvt.close() # TextConverterオブジェクトの解放
pdf_file.close()     #  Fileストリームを閉じる

print(text)

プログラム解説

ライブラリのインポート

Python
from pdfminer.pdfinterp import PDFResourceManager   #PDFのテキストや画像を管理するクラス
from pdfminer.layout import LAParams                #テキスト抽出に必要なパラメータを設定するクラス
from pdfminer.converter import TextConverter        #PDFのテキストを抽出するためのクラス
from pdfminer.pdfpage import PDFPage                #PDFの1ページごとの情報を管理するクラス
from pdfminer.pdfinterp import PDFPageInterpreter   #PDFpageから必要な処理を行うクラス
from io import StringIO

ここでは今回使用するライブラリをインポートしています。

  • PDFResourceManager: PDFのテキストや画像を管理するクラス
  • LAParams: テキスト抽出に必要なパラメータを設定するクラス
  • TextConverter: PDFのテキストを抽出するためのクラス
  • PDFPage: PDFの1ページごとの情報を管理するクラス
  • PDFPageInterpreterPDFpageから必要な処理を行うクラス
  • StringIO: テキストデータを扱うストリームクラス

パラメータ設定

Python
# PDFファイルを開く
pdf_file = open("toyota_fiscal.pdf","rb")

#読みだすテキストの出力先(今回は文字ストリーム)
outIO = StringIO()

rmgr = PDFResourceManager() #PDFResourceManagerオブジェクトの取得
lprms = LAParams()          # LAParamsオブジェクトの取得
txtcvt = TextConverter(rmgr, outIO, laparams=lprms) #TextConverterにリソースマネージャと出力先ストリームを指定
iprtr = PDFPageInterpreter(rmgr, txtcvt) # PDFPageInterpreterにリソースマネージャと使用するテキストコンバータを指定

pdfminerでは出力先を文字ストリームとするため、テキストの出力先にstringIOを設定します。

StringIOとは、文字列に対しread, write, printといったファイル操作を行うことができるようにするライブラリです

下の4行はpdfminerを使うにあたってお決まりの文になっているので、とりあえずコピペで問題ないです。

処理部分

Python
# PDFファイルから1ページずつ解析(テキスト抽出)処理する
for page in PDFPage.get_pages(pdf_file):
    iprtr.process_page(page)

text = outIO.getvalue()  # Pythonコンソールへの出力内容を取得

outIO.close()  # I/Oストリームを閉じる
txtcvt.close() # TextConverterオブジェクトの解放
pdf_file.close()     #  Fileストリームを閉じる

print(text)  # Jupyterの出力ボックスに表示する

PDFPageのget_pages関数を使って、pdf_fileファイルのすべてのページを取得し、page変数に代入します。

メモリ節約のため、処理が終わり次第各ストリームを閉じます

結果

今回はトヨタ自動車の2023年3月期決算書からテキストを取得しました。

写真のように文字が取得できていることが分かります。

まとめ

今回はPDFminerを使ってPDFからテキストを自動取得するプログラムを作成しました。

このプログラムを参考に、さまざまな応用例を試してみてください。

注意

  • このプログラムは、あくまでもサンプルです。必要に応じて、コードを修正したり、機能を追加したりしてください。
  • プログラムを実行する前に、pdfminerライブラリをインストールする必要があります。

コメント

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