データサイエンス&サイバーセキュリティ備忘録

Python, Data Science, Kaggle, Cyber Security, CTF, などなど

PythonでPDFの表を読み込み、ExcelまたはCSVファイルで出力する

きっかけ

Tableauの使い方をマスターするために、埼玉県の公式サイトからデータを持ってきてデータ接続をしようとしました。

a7xche.hatenablog.com


公表されているデータを、てっきりCSVファイルでダウンロードできると思っていましたが、ファイルがPDF形式。

表記ゆれを発見した上に、データの表が複数ページにまたがっていたので、Pythonで結合させて前処理をする必要がありました。

しかし、CSVファイルやExcelファイルを読み込んだことはありましたが、PDFファイルを読み込んだことは一度もありませんでした。

read_pdfなんてあるのかな、と思っているそこのあなた!

このブログで明らかになります。

使用するライブラリ

PDFファイルを読み込む方法を調べてみると、tabula-pyというライブラリを見つけました。

tabula-py.readthedocs.io

サイトにも書いてある通り、PDFにある表をpandasのDataFrameに変換し、CSVファイルやJSONファイルなどで出力できる優れものです。

公式サイトには書いてありませんが、Excelファイルの出力も可能です。(実証済み)

また、Google Colabで試したい方向けにNotebookが用意されています。

今回は、ローカルのJupyter Notebookでtabula-pyを使用したい方向けに、インストール方法、コードの書き方、エラーが起きたときの設定方法を紹介します。

インストール方法

Anaconda Promptを開き、以下のコマンドを入力します。

pip install tabula-py 

これでインストールは完了です。

コードの書き方

最初に必要なライブラリを読み込み、read_pdfで読み込みます。
引数で、読み込みたいページ数が設定できます。

from tabula import read_pdf

# pageという引数がallなので全てのページが読み込まれる
df  = read_pdf("sample.pdf", page="all")

# この場合は、1~2ページ目と4ページ目が読み込まれる
df1 = read_pdf("sample.pdf", page="1-2,4")

自動的に表の部分を読み込んでくれるらしいので、基本的にはページを指定するだけで十分かと思います。

公式ドキュメントを読んでいて、他に便利そうと思った引数があるので紹介します。

どのファイルでもそうですが、重要な情報が入っているPDFファイルには、開くときにパスワードを入力する必要な場合もあるかと思います。

その時に使える引数として、passwordという引数があります。

使い方は、以下の通りです。

from tabula import read_pdf

# PDFを開くときに、abcdというパスワードが必要な時は以下で設定
# パスワードを直接入力するので、コードを他人に見せないように注意!
df  = read_pdf("sample.pdf", page="all", password="abcd")

パスワードつきのPDFをPythonで読み込んだことはないので、機会があればこの引数を使用してみたいです。

DataFrame型で読み込んだ後は、いつも通りPythonでいろいろいじることができます。

もちろん、ファイル出力をするときの to_csv や to_excel も問題なくできます。

read_pdf()でエラーが起きたときの設定方法 (Windows版)

ここからは、read_pdf()で以下のエラーが起きたときの対処法を紹介します。

`java` command is not found from this Python process. Please ensure Java is installed and PATH is set for `java`

そもそも、このライブラリはtabula-javaというJavaのライブラリをPythonでラッパーしたものです。

なので、パソコンの設定でJavaをインストールしないと使えないというわけです。

Javaが入っていない方は、以下のサイトからインストーラーをダウンロードできます。

www.java.com

ダウンロードが完了したらインストールし、Javaのパスの設定をします。

ここから先の設定方法は、Windows向けです。

Macのパソコンは持っていなくて、やり方が分からないです...

まず、インストールしたJavaがちゃんと入っているかを確認します。

Windows 10の場合、C:\Program Files\Java にあるとのことです。

ちなみに私のパソコン(Surface Pro)は、C:\Program Files (x86)\Java にありました。

このJavaのフォルダの中に、Javaのバージョンが記載されているフォルダ名があると思います。

その中に、bin というフォルダがあることを確認し、binのフォルダを含めたファイルパスをコピーします。

以下は見本なので、自分の環境のパスをコピーしてください。

C:\Program Files (x86)\Java\jre1.8.0_241\bin

コピーしたら、次にJavaのパスの設定です。

まず、コントロールパネルを開き、以下のパスまで進みます。

コントロール パネル\システムとセキュリティ\システム

システムまで進んだら、ウインドウの左側に4つ項目があるかと思います。

その中の1つの、システムの詳細設定をクリックします。

クリックすると、別ウインドウでシステムのプロパティが設定できます。

開いたら、環境変数のボタンをクリックし、別ウインドウで環境変数を設定することができます。

開かれたウインドウの下半分がシステム環境変数用の設定画面であり、その中の Path (またはPATH) という変数を選択します。

選択したら、編集ボタンをクリックし、パスを追加するために新規をクリックします。

クリックしたらパスが入力できるようになるので、そこに先ほどコピーした binまでのファイルパスを貼り付けます。

貼り付けたら、OKをクリックしてウインドウを閉じ、その後もOKをクリックします。

これで、Javaのパスの設定は完了です!

設定した後は、一度パソコンを再起動させ、Jupyter Notebookを開くとread_pdf()が使えるようになります。

以上、エラーの対処法の説明です。

Macユーザーの方も、Javaのパスが設定できれば使えるかと思います。

感想

PDFにある表を読み込む機会は、個人的にはほどんどないかもしれませんが、知っていて損はないライブラリだと思います。

パスの設定はちょっとめんどくさいですが、一度設定すれば基本的に設定をいじることがないかと思います。

あと、読み込んだファイルが前処理しやすいかはPDFファイル次第です笑

私がダウンロードした埼玉県の新型コロナウイルスの陽性確認者数の表は、複数ページにわたっていたので、ページごとにデータフレームが分かれてしまっていて(しかも何故かlist型だった)大変でした笑