【Python】PDFの表テーブル読込ライブラリ(pdf2txt、tabula-py)使い方・使用感

Python
スポンサーリンク

業務上、PDFファイルからデータを抽出するニーズは多くあります。

この作業を効率化するために、Pythonを活用する方法が考えられます。

今回は、特にpdf2txt.pytabula-pyという2つのライブラリを利用して、PDFからテキストやテーブルデータを抽出する方法を詳しく説明していきます。

ツールをうまく使いこなすことで、業務を効率化していきましょう。

1.pdf2txt.py

pdf2txt.pyは、PDFファイルをテキスト形式に変換するためのライブラリです。

特にテーブル構造に特化しているわけではありませんが、テーブル部分の文字列も読み取ってくれるため、スペースをカンマに置換→CSV形式で保存する、といった使い方で表の読み取り用としても使えそうです。

インストール

まず、pdfminer.sixをインストールします。pdfminer.sixはPDFファイルからテキスト情報を抽出するモジュールで、Pythonには標準で付属していません。

pip install pdfminer.six

使い方

コマンドラインで以下のように使います。

python pdf2txt.py [オプション] -o [出力ファイル名] [入力ファイル名]

基本的には、出力ファイル名(.txt)と入力ファイル名(.pdf)を指定することでpdfファイルをテキストファイルに書き出してくれるといったものになります。

オプション
文字間隔:M、単語間の間隔:W、行間隔:L、縦読み:V 

オプション値を指定しなかったらデフォルト値としてM= 1.0、 W=0.2、L=0.3 が適用され、横読みとなります。

MとLの値をうまく調整すればテキストの抽出精度が向上するようですが、個人的にはチューニングのコツを見出すまで至っていません。最適な設定を見つけるには多少の試行錯誤が必要かもしれません。

<実例>

python pdf2txt.py -M 6.0 -L 10.0 -o d:\B9D00000.txt d:\B9D00000.pdf

詳しくはここに記載があります。
https://www.unixuser.org/~euske/python/pdfminer/

2.tabula-py

tabula-pyはPDFファイルからテーブルデータを直接抽出するのに特化したライブラリです。DataFrame形式でデータを取得できるので、さらに分析や操作が行いやすくなっています。

インストール

以下のコマンドでインストールします。

pip install tabula-py

実はこれだけで使おうとしても以下のような JavaNotFoundError が出て実行できません。tabula-pyはJavaのライブラリをラップしたものであるため、Javaの環境構築をしないと正常に動いてくれません。

JavaNotFoundError: ‘java’ command is not found from this Python process.

Windowsの場合はOracleのサイトから「jre-〇〇〇-windows-x64.exe」をダウンロードする必要があります。

ダウンロードしようとするとサインインが求めれます。

最近はJavaのインストールにOracleのアカウント登録が必要になっているんですね(※調べたらかなり前からっぽかったです)。アカウント登録をしてから、あらためて「jre-〇〇〇-windows-x64.exe」をダウンロードしましょう。

使い方

ここからはコマンドライン上ではなくPythonスクリプト内にコード書いていく形になります。

下記は読み込んだものをDataFrameに突っ込む例です。

pdffile1 = 'd\:sample.pdf'
dfs = tabula.read_pdf(pdffile1, lattice=True , pages = 'all')
#すべてのリストを表示したい場合
for df in dfs:
  print(df)
#ちなみに↑のfor文内で
#df.to_csv("d:\xxx.csv",encoding="shift-jis", index=None)
#としてもなぜか各リストは出力されず、最後のリストしか出力されない?
#1つ目のみを表示
print(dfs[0])

オプション
lattice:表の罫線を認識してくれる
pages:ページを指定できる。’2,4’とか’all’とかで指定。

1つのPDF内に表がいくつか存在する場合は、上記のfor df in dfs:の書き方で下記のようにすべてのテーブルを表示してくれます。print(dfs[0])だと一番最初の表のみ表示します。

ちなみに上記のfor文内で df.to_csv(“d:\xxx.csv”,encoding=”shift-jis”, index=None)などとしても一番最後の表しかcsvに出力してくれませんでした。この辺の正確な仕様についてはまだ調べきれていません。

このような方法でPDF内のテーブルを抽出し、DataFrameとして利用できます。

3.まとめ

ここでは2つのライブラリについて見てきました。

  • pdf2txt.py:特にテーブル構造に特化しているわけではありませんが、使い方次第で十分にテーブル読み取り用としても使えそう
  • tabula-py:テーブル抽出に特化したものですが、Javaのライブラリをラップしたものであるため、Javaのインストールが必要

また、ここには記載していませんが、いろんな種類のPDFファイル読み込みを試してみた感想としては「PDFにもいろいろあり、一筋縄ではいかない」ということです。

存在するPDFごとに、テキスト抽出後の加工方法(スペースを除去する、カンマに変換する、全角を半角に変換する、ある決まった位置の値を取得する……など)を変える必要があるので、基本的には書き捨てコードを書くことになると思っていたほうがいいかもしれません。

ただ、業務などで「毎月あるサイト等から定期取得するような決まった構造のPDF」については、あるひと月分に対して一度スクリプトを作成したら同じものを毎回使えますので、大幅な時間短縮が見込めるのではないでしょうか。

pdf2txt.pyとtabula-pyを適切に使い分けて、面倒なPDFからのデータ抽出処理を効率化していきましょう。

Pythonおすすめの勉強方法

Pythonを最も効率的に学べる方法についてはこちらにまとめています。

Python入門におすすめのUdemy学習教材 5選
本記事では、Pythonの入門学習におすすめのUdemy学習教材について紹介します。 はじめに このブログでも業務に役立つPython技術をかいつまんで取りあげていますが、体系立った知識を得るためには、やっぱり書籍か動画の学習教材を使うのが...



本ブログでは業務に役立つ技術情報をこれからも発信していきますので、困った時にはぜひ参考にしてみて下さいね。

\ほかにもPythonを知りたい人はこちらもおすすめ/

楽天Kobo電子書籍ストア
¥2,266 (2024/09/14 21:57時点 | 楽天市場調べ)
楽天ブックス
¥2,640 (2024/09/16 12:23時点 | 楽天市場調べ)

\あわせて読みたい/

【Python】tabula.read_pdfで読み込めるpdfと読み込めないpdf(IndexError: list index out of range)
ここではtabula.read_pdfで読み込めるpdfと読み込めないpdfについて比較してみます。 tabula-pyで読み込めるpdf tabula-pyがpdf上の表(テーブル)をテキスト抽出できる優秀ツールであることは前記事で詳しく...
【Python】tabula.read_pdfでDataFrameにどんなデータが取得されるか
tabula-pyは表形式をテキスト化するのに特化した優秀ライブラリでしたね。 では、tabula-pyを使って複数の表が記載されたpdfファイルをDataFrameへ読み込んだ時、一体どんな感じになっているのでしょうか。 ここではVisu...
【Python】Pandasとopenpyxlを使った業務効率化のためのサンプルコード
業務でのデータ処理や分析の場面で役立つPandasとopenpyxlのサンプルコードをまとめました。 ここでは「最低限これだけあれば事足りそう」というものに絞って紹介します。これらのライブラリを活用することで、日々の業務をより効率的にこなし...

タイトルとURLをコピーしました