Pythonにできることは自動化しよう!【第15回 PDF】

こんにちは、unogram管理人のうのちゅ〜です。

【Pythonにできることは自動化しよう!】シリーズとして、Pythonの基礎から順を追って学習し、作業の自動化・効率化を実現する能力を身に着けていきます。Pythonの基礎について学ぶだけで、大規模なコードを書かなくても十分に役に立つプログラムを記述することができるようになります。Pythonは気になるけど、プログラミングには苦手意識がある方も安心してトライしてみてください!

本シリーズでは、以下のようなことができるようになります。

  • ファイルの読み書き・管理
  • Webサイトからファイルをダウンロード
  • エクセルシート操作
  • PDF・ワード文書操作・テキスト抽出
  • 電子メール・SMS送信

うまく活用すれば作業に役立ちそうなワードがたくさん並んでいますね!

なお、本シリーズでは一部以下の書籍を参考にしています。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。

それでは見ていきましょう!



PythonでPDFを扱ってみよう PyPDF2, pdfminer.six

今回は、Pythonを使ってPDFを操作する方法について学習していきます。

webサイトからダウンロードするドキュメントには、PDF化されているものが多いです。PDFに記載された文章をコピペするなどして使用したい場合もあるでしょう。大量にコピペする必要があったり、検索を伴う場合などはプログラムにやらせたら生産性が高まりそうですよね。

しかしながら、通常のtxtファイル等と違って、PDFはバイナリファイルであるため、扱いが難しいです。テキストエディタなどで開くことはできませんよね。

そんなPDFファイルをPythonで扱うためのPyPDF2モジュールについて紹介していきます。

PyPDF2のインストールとインポート

まずはいつも通りpipでモジュールをインポートしましょう。

%pip install PyPDF2

インストールできたら、さっそくインポートして使っていきます。

import PyPDF2

PDFを読み込んでテキストを取得する

PDFを読み込んでテキストを取得してみましょう。流れとしては、

  1. open()関数を使ってファイルを開く(バイナリファイルを読み込む'rb'を指定する)
  2. PyPDF2.PdfFileReader()関数を使ってPdfFileReaderオブジェクトを生成する
  3. getPage()メソッドにページの番号を与えてPageオブジェクトを取得する
  4. extractText()メソッドを使ってテキストを取得する
    となります。

それでは実際にPDFファイル中のテキストを取得してみましょう。今回は、次のサンプルファイルからテキストを取得してみます。

出典:これはサンプル PDF ファイルです
pdf = open('PDF_sample.pdf','rb')
pdfreader = PyPDF2.PdfFileReader(pdf)
page = pdfreader.getPage(0)
page.extractText()
# '\n\n\n\nPDF\n\n\n\n \n \nhttp://windows8.a\n-\nwindows.com/\n \n \n\nWindows 8\n\nˆ›\nWindows8\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n'

出力結果を見てみると、なにやらおかしな文字列が出力されていますね。いくらか正しく出力されている文字列も見られます。

特に気になるのは、日本語の文章が出力されていない点です。日本語文章に関しては、PyPDF2モジュールではうまく読み取ることができません。英語のPDFドキュメントならともかく、日本語の文章に対応していないのは困ってしまいますね。



PDF中の日本語テキストを抽出するpdfminer.six

pdfminer.sixを使うと、日本語の文章も上手く抽出することができます。まずはpipでインストールしましょう。

%pip install pdfminer.six

少し複雑ですが、次のようにしてPDF中のテキストを抽出して、プレーンの.txtファイルとして出力できます。

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

pdfname = 'PDF_sample.pdf'
outputfile = pdfname[:-4] + '.txt'
manager = PDFResourceManager()
with open(outputfile, "wb") as wf:
    with open(pdfname, 'rb') as rf:
        with TextConverter(manager, wf, codec='utf-8', laparams=LAParams()) as conv:
            interpreter = PDFPageInterpreter(manager, conv)
            for page in PDFPage.get_pages(rf): 
                interpreter.process_page(page)

参考:Python PDFファイルをページ毎に分割/日本語テキストを抽出/画像を抽出する方法

出力されたテキストファイルを見てみましょう。Pythonにできることは自動化しよう!【第5回 ファイルの操作・読み書き】で学習した内容の復習です。

readfile = open(outputfile)
texts = readfile.readlines()
for text in texts:
    print(text)
readfile.close()
# こ れ は サ ン プ ル PDF フ ァ イ ル で す  
# http://windows8.a-windows.com/ 
# タッチパネルのない従来のデスクトップパソコンとして会社で Windows 8 を使うための快適な
# 方法を図解付きで一覧。初心者さんも理解できる Windows8 の基本設定方法のまとめです。 
# ぜひ、サイトにあそびにきてくださいね。

出力結果では、改行を省略しています。pdfminer.sixを使うことで、日本語も含めて無事テキストを抽出できていることが確認できました。

番外編:PythonによるPDF操作は難しい?

今回はPythonによるPDF操作について紹介し、テキスト抽出のやり方を学習しました。今回紹介したPyPDF2pdfminer.six以外にもPythonのPDF関連モジュールは多数存在します。

しかしながら、バイナリファイルであるPDFの処理は単純ではなく、どんなPDFファイルにも対応した処理を実装するのはなかなか大変です。画像抽出のような処理は、同じPDFという分類のファイルであっても、モノによって対応できたりできなかったりする場合も多いです。

そのような場合には、Pythonによる自動化が適さない場合もあるので注意しましょう。

参考書の応用例

今回は、PDF操作の中でも自動化による恩恵の大きいテキスト抽出について紹介しました。本シリーズで参考にしている「退屈なことはPythonにやらせよう」では、テキスト抽出の他にも次のような操作について紹介されています。

  • PDFの暗号解除
  • PDFの作成
  • ページのコピー・回転

また、次のような応用例にPythonによるPDF操作を活用しています。詳しい実装内容等についてはぜひ書籍を参照してみてください。

  • PDFのページの並び替え
  • 抽出したテキストの中に特定のテキストを含むページのみを用いてPDFを作成



まとめ

今回は、【Pythonにできることは自動化しよう!】シリーズ第15回としてPythonによるPDF操作について解説しました。自動化による恩恵を受けやすいPDFファイル中のテキスト抽出に焦点を当て、英文に限らず、日本語にも対応した出力方法について解説しました。

さらに追加で詳しく学びたいという方は、下記の参考書などを使った学習にも挑戦してみてください。

おすすめ参考書

冒頭でも紹介しましたが、Pythonによる自動化に向けた学習は、本シリーズでも参考にしている次の書籍がおすすめです。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。