【Python】tabula-pyを使ってPDFファイルのテーブルデータを読みとってみる

  • 2023年12月3日
  • 2023年12月3日
  • python

こんにちは。

野中やすおです。

仕事でPythonを使ってpdfをテーブルデータを読み込むことがあり、tabula-pyを活用する機会がありました。

ということもあって今回のtabula-pyというライブラリ使ってPDFファイルのテーブルデータを読み込む方法を紹介します!

tabula-pyとは

tabula-pyとは、PDFファイル内のテーブルを抽出してPythonのDataFrameに変換するためのライブラリになります。

元々はJavaでつくされていたTabulaというライブラリをPythonで使えるようにしたいものです。

tabula-pyのインストール方法

tabupa-pyはpip installでインストールすることができます。Python3.8以上がRequirementsであることに注意が必要です。

また元々TabulaがJavaで開発されていたことからJava runtimeの環境も必要になっています。

必要に応じて、Javaのインストールもしてください。以下のコマンド(Macの場合)でJavaのバージョンの確認とインストールを行なってください。こちらもJava8以上がRequirementsになっています。

tabula-pyの使用方法

tabula-pyのインストールが完了したら実際に使用していきましょう。

今回のテーブルの作成対象となるデータは、2023年11月にリリースされた「東京都令和6年度予算の要求について」を選びました。

財務局

東京都財務局の令和6年度予算要求(令和6年度予算)のページです。…

まずは基本動作ということで、tabula-pyからread_pdfをインポートします。第1引数にはpdfのURLを指定します。そして第2引数にはページ番号を指定します。またオプション引数としてlatticeを指定しています。これをTrueにすることで、各セルを区切る罫線がある場合にPDFを強制的に抽出することができるようになります。デフォルトでは、Falseになっています。またpandas_optionsも指定して”dtype”: strにしています。

read_pdfでは、複数のDataFrameが返されるので、そのうちの一番目をdfs[0]と指定することで以下のような結果となります。

 

上記では、1ページ目の〔各 会 計 要 求 状 況〕 のテーブルが取得されました。

次に第2引数ではpdfのページ全てを指定することもできます。そしてpandas_optionsでは、‘header’: Noneで、ヘッダーを指定しないようにもできます以下のような実装だと出力はどうなるでしょうか。

 

上記のように1ページ目のテーブル以外の罫線に囲まれた文字列もテーブルとして取得することができました。ちなみにdfs[1]を指定すると「各局からの予算要求の概要については、財務局ホームページにて公表…」の箇所が取得されます。

pagesのオプションでは、1、’all’以外にも‘1-2,3’,や [1,2]など複数ページを指定することもできます。

2ページ目の「局 別 内 訳 ( 一 般 会 計 )」と「会 計 別 総 括 表」も読み込んでみましょう。dfs[3]、dfs[4]で取得できます。

「局 別 内 訳 ( 一 般 会 計 )」は問題なく読み込めましたが、「会 計 別 総 括 表」では区 分列の中でさらに項目が分かれていて、dfの行列がずれてしまいましたね・・・。この場合は、tabula-pyとは別のライブラリの使用を検討する、または行がずれているだけで必要な値は取れているようなのでpdfを読み込んだ後の後処理で対応するといったアプローチがよさそうです。

tabula-pyについて

tabula-pyはあくまでpdf上でテーブル(表)になっているものを読み込むことに主眼を置いているシンプルに使用できるライブラリなので、pdfの文字列を読み込みたい、あるいはテーブルの外側の単位等の文字列も一緒に取得したい場合は他のライブラリとの併用を検討すると良さそうです!

最後に

最後で書くのもなんですが、上記で出力したDataFrameは全て、Google Colab上で動作確認を行い、data_table.enable_dataframe_formatter()を使用することで見栄えを良くしています。dfの見栄えが段違いに良くなるので、こちらもぜひ活用してみてください!