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ページごとの情報を管理するクラスPDFPageInterpreter
:PDFpage
から必要な処理を行うクラス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ライブラリをインストールする必要があります。
コメント