PDFの表をエクセルにコピペする:Python tabula-py

※この記事は2020年11月14日に追記しました
hanako
PDFにある表をエクセルにコピペできない。。
moku
Python使えば数行で解決できます!
レポートやらデータ収集やらでよくPDFにある表を手元で集計したくなりますよね。
でもPDFの表って普通に選択してコピペしてもエクセルに貼れません!一つのセルにつながって入ってしまいます。

区切り位置を使うにも表の体裁になっていないのでうまくいきません。。。

Python使ってどうにかならないかググってみると“tabula-py“なるもので解決できるようです。

早速やってみました。
# tabula-pyをインストール
!pip install tabula-py

# import
import tabula
import glob
import os

# pdfフォルダに置かれたファイル名を取得する
file = glob.glob("/content/pdf/*")

#ファイル名だけにする
filename = os.path.splitext(os.path.basename(file[0]))[0]

# 出力ファイルのpathを決める
newfile = "/content/csv/" + filename + ".csv"
newexcelfile = "/content/excel/" + filename + ".xlsx"

# convert PDF into CSV file
tabula.convert_into(file[0], newfile, output_format="csv", pages='all')

# pdfファイルを読み込む
dfs = tabula.read_pdf(file[0], pages='all', lattice=True)

# エクセルに書き出してフォルダに入れる
dfs[0].to_excel(newexcelfile, index=None)
こちらのPDFがこちらのエクセルファイルに。とても簡単ですね。
以下プログラムを作るまでの経緯になりますので超初心者の軌跡ということで同じようなレベルの方の参考になればと思います。

  • 1: 何故Python?
  • 2: Tabula-py
    • 2.1: つくってみる
      • 2.1.1: Step1 : テスト
      • 2.1.2: Step 2 : フォルダからファイルを読んで違うフォルダに置く
      • 2.1.3: Step 3 : やっぱりエクセルにする

何故Python?

機械学習で大人気の Pythonということで使っている人多いと思います。
そもそもPythonは汎用的なプログラムで機械学習以外にも様々なことに使えるからいい!ってことですよね。

でも様々なことに使ってない。。。

ちょうどPDFファイルに記載されている表をエクセルに貼り付けようと苦労していたのでPythonで業務改善してみましょう。

やりたいこと
“PDFファイルを特定のフォルダにおいてプログラムを実行すると別のフォルダにPDFにある表をエクセルにして吐き出す。”

取りあえずパパっとやれそうなクラウドサービスGoogle Colaboratoryを使います。

Tabula-py

ググってみると”tabula-py”というので簡単にできます。
説明読んでみるとwrapperということらしいです。wrapperは文字通り他の機能を包んでいるということでしているということですね。
でラップされているのは”tabula-java”でPDFから表を抽出してくれるとのいことです。

つくってみる

Step1 : テスト
このページの下の方にある”Example”を読んでみるとdataframeのリストで持ってくるとあります。
やってみましょう。

【code】例をそのまま
# tabula-pyをインストール
!pip install tabula-py

# tabulaをインポート
import tabula

# PDF内の表を読み込む
df = tabula.read_pdf("/content/testpdf.pdf", pages='all')

# 表示
df
確かにリストになっていますね。

csvで出力するという便利な方法がありました。エクセルフォーマットじゃなくてこっちでいいですね。
# convert PDF into CSV file
tabula.convert_into("/content/testpdf.pdf", "/content/testpdf.csv", output_format="csv", pages='all')
ちゃんとcsvファイルができてますね。

これでやりたかったことはクリアです。


Step 2 : フォルダからファイルを読んで違うフォルダに置く
せっかくなのでもうちょっと使いやすくしましょう。
“pdf”フォルダにファイルを置いてプログラムを走らせると”csv”フォルダに変換したファイルを置きなおすようにしたいと思います。
# tabula-pyをインストール
!pip install tabula-py

# import
import tabula
import glob
import os

# pdfフォルダに置かれたファイル名を取得する
file = glob.glob("/content/pdf/*")

#ファイル名だけにする
filename = os.path.splitext(os.path.basename(file[0]))[0]

# 出力ファイルのpathを決める
newfile = "/content/csv/" + filename + ".csv"

# convert PDF into CSV file
tabula.convert_into(file[0], newfile, output_format="csv", pages='all')
実際はerrorを読みながら進めましたが、注意点はglobやos.patがlistで取得されるのでindex番号をいれて指定してあげないといけないところが少しありましたね。

ここら辺がわからない場合は一旦Pythonの基本教科書をサラッと読むといいと思います。
正直その後はググればすごい人達が懇切丁寧に教えてくれたものがあふれています。

プログラミング初めてというレベルでもこれは読みやすかったです。
Step 3 : やっぱりエクセルにする
csvでいいやと思ったのですがそういうわけにもいかないパターンもあると思うのでちゃんとエクセルにしましょう。

Google Colaboratoryに”excel”という名前でフォルダを作っておきます。
# pdfファイルを読み込む
dfs = tabula.read_pdf(file[0], pages='all', lattice=True)

# 出力先の名前を設定
newexcelfile = "/content/excel/" + filename + ".xlsx"

# エクセルに書き出してフォルダに入れる
dfs[0].to_excel(newexcelfile, index=None)
これでちゃんとエクセルにできましたね

その他環境によってプリインストールされているPackageに差があったりしますがerror見ながら少しずつ進めればいいですよね。教科書やネットにあるコードをそのまま写しても動かないことが多いのでやはり自分で頑張る必要はそれなりにありますね。