pythonのPyPDF2,pdfminerモジュールを利用して、pdfファイルからテキスト抽出するプログラムを作成していきます。
プログラム作成の経緯
我が家では、私と妻で1社(ライフカード)のクレジットカードを生活費全般の決済に利用しています。私が本カードで、妻が家族カードです。
毎月清算の際には、妻がPDF化された明細をWebからダウンロードしてきて、利用者の確認を行い、目検と手作業での振り分けし、私宛に請求する形になっています。
この確認作業を自動化しようと考えたのが、プログラム作成の経緯です。
PyPDF2でのソースコード
以下のコードです。
残念ながら、「pageObj.extractText()」が日本語に対応していないようです。
文字化けのような記号のような内容が出力されておりました。
しかしながら、英語のみのPDFであれば動作するようです。
英語の論文を日本語訳する際の文字抽出などには使えるかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# coding UTF-8 import PyPDF2 pdf_reader = PyPDF2.PdfFileReader(open('[PDFファイルパス]', 'rb')) # is encryption print(pdf_reader.isEncrypted) # パスワード付きの場合、パスワードを入力 if pdf_reader.isEncrypted == True: pdf_reader.decrypt('[PDF展開パスワード]') # ページ数分だけループして、ページの取得とテキストの抽出 for i in range(pdf_reader.numPages): pageObj = pdf_reader.getPage(i) print('--------------') print(pageObj.extractText()) |
pdfminerでのソースコード
pdfminerでも実施しました。こちらは日本語のPDFでもきちんと出力されます。
しかしながら、パスワードロックが掛かっている一部のPDFだけは、パスワードロックを解除してもうまく出力されませんでした。
ほとんどのPDFの文字列が抽出できたため、同じPDFでも形式に違いがあるのかもしれません。
後ほど解決できるようならば、別の記事にしたいと思います。
マウスで文字部分を選択してコピーした場合には、きちんと文字が抽出できるので、 最悪、pyautogui(※)などを利用して力技で対応するかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage # CONST input_path = "[PDFファイルパス]" output_path = "[出力ファイルパス]" codec = 'utf-8' rsrcmgr = PDFResourceManager() params = LAParams() params.detect_vertical = True with open(output_path, "wb") as output: device = TextConverter(rsrcmgr, output, codec=codec, laparams=params) with open(input_path, 'rb') as input: interpreter = PDFPageInterpreter(rsrcmgr, device) for page in PDFPage.get_pages(input): print(page) interpreter.process_page(page) device.close() |
参考)pyautoguiでの対応(2021/6/7追記)
後日、文字部分を選択してコピーすることで、文字列抽出を行うプログラムを作成しました。
以下の記事で詳しく説明しています。

pyautoguiによる鍵付きpdfから文字列の抽出、及び、整形の自動化【pythonによるGUI作業の自動化】
パスワード付きpdfから文字列を抽出し、編集、及び、整形する作業の自動化をpythonのpyautoguiモジュールで実現します。 尚、今回は文字列をpdfから直接取得する方法をとりません。もっと具体的に言うと、PyPDF2やpdfmine...
コメント