PDFの表を表のまま読み取るには tabula


自治体やお役所のオープンデータの取り組みは以前に比べて多くなってきているが、問題はその公開フォーマット。

機械的に読み取って再利用したい側としては構造化されたテキストである JSON、あるいは XML、せめて CSV でほしいところだが、PDF でのみという場合も多い。

文章を PDF から抽出するのはそれほど難しくはないが、表を表の形のまま、抽出するのはなかなか難しい。行やカラムがずれたり、セルの中の改行をうまく扱えなかったりする。
これまで、自治体等が公開しているデータがどうしても PDF のみの場合に、コピー&ペーストしたり、入力しなおしたりと苦労してきたが、やっとうまく表データを抽出できるツール[Tabula](http://tabula.technology/)を見つけた。
Tabula は表の抽出に特化したツールではあるが、表の形を保ったままテキストを抽出できる。

- オフィシャルサイト： [Tabula: Extract Tables from PDFs](https://tabula.technology/)
- リポジトリ： [tabulapdf/tabula: Tabula is a tool for liberating data tables trapped inside PDF files](https://github.com/tabulapdf/tabula)

以下は Tabula 1.0.1 を mac で試した。

## インストール
Tabula は Wisdows と OSX に対応しているので、ダウンロードページから各 OS 用のアーカイブをダウンロードする。
ダウンロードしたアーカイブを展開すると、実行ファイルが入っているので、OSX の場合、Applications ディレクトリにでもコピーする。これだけ。

## 使い方
実行ファイルを実行すると、ブラウザが起動し次のようなページが開く。
Tabula の UI はローカルの Web サーバ上で動く形なので操作はブラウザ上で行う。

![Kobito.tlaYkD.png](https://qiita-image-store.s3.amazonaws.com/0/32533/65cac100-4237-0d43-530f-c14f3895747b.png "Kobito.tlaYkD.png")

使い方は、そのページに書いてあるとおりなのだが、以下に説明する。

青い `Browse...` ボタンをクリックするとファイルダイアログが開くので、読み取りたい PDF ファイルを選択する。選択したら、右側の `Import` ボタンをクリックする。

すると、Tabula がファイルを読み込み始める。プログレスバーに進捗が表示される親切 UI となっている。Tabula が読み込める DPF はテキストデータを含むものだけで、画像をスキャンして作った PDF は対応できない。
![Kobito.vRWdaw.png](https://qiita-image-store.s3.amazonaws.com/0/32533/b4921e1e-435a-b498-e383-92c077c337e6.png "Kobito.vRWdaw.png")

読み込みが終わると内容が表示される。表として読み取りたい部分をドラッグして選択すると赤く選択される。選択時には次の操作が可能となっている。

- 複数箇所の選択
（複数のページに選択箇所が別れても構わないが、同一ページの同一表で複数選択は無理なようだ）。
- 選択した領域の端をドラックによる高さ、幅の変更
- 選択した領域をドラッグによる移動
- 選択領域の削除

選択した箇所は左側のサムネールにも表示され、親切 UI となっている。`Autodetect Tables` ボタンをクリックするとドキュメント中のすべての表を選択してくれる親切機能も備えている。

![Kobito.WjTMBG.png](https://qiita-image-store.s3.amazonaws.com/0/32533/e504a5ba-a2be-e9b4-5dcf-1d076b630107.png "Kobito.WjTMBG.png")


選択が終わったら、緑の `Preview & Export Extracted Data` ボタンをクリックすると、選択した箇所のテーブルデータの抽出結果が表示される。次の 2 つのボタンのいずれかをクリックすると抽出データを取り出せる。

- `Copy to Clipboard` ボタン：抽出データがクリップボードにコピーされる
- `Export`：抽出データをファイルとして出力する

`Copy to Clipboard` はセルに改行を含んでいても、クオートされていないので、表が崩れてしまう。改行を含むデータがある場合には、`Export` でファイルに出力すればよい。

## 出力結果
ファイルとして出力した結果を LibereOffice で開いた結果は次の通り。改行を含むセルのデータもきちんとズレずに抽出されている。

![Kobito.S4V0HE.png](https://qiita-image-store.s3.amazonaws.com/0/32533/dc4b8229-713f-55f5-046a-ca2b0d86f1be.png "Kobito.S4V0HE.png")

ちなみに PDF で同じ表のテキストを選択して LibreOffice にコピー&ペーストした結果は次の通り。
全く表としては抽出できない。

![Kobito.cHPDWG.png](https://qiita-image-store.s3.amazonaws.com/0/32533/3a39a3d3-4d0e-7fa9-a761-3371eafee52b.png "Kobito.cHPDWG.png")

## 苦手なファイル

エクセルの表を何ページにも渡って PDF 化したファイルも読み取り変換できるのだが、ページの末尾の行がしっかり罫線で閉じていないときちんと読み取らない。ちゃんと読み取り範囲に指定してもその行を読み飛ばして出力される。

このあたりは有料ツールにはかなわない弱点だと思う。
ちなみに、Adobe の[PDF を Excel に変換](https://documentcloud.adobe.com/link/acrobat/pdf-to-excel)ではその様な行も飛ばさず変換してくれる。この機能だけなら年間 2,640 円(2021 年8 月現在)と高額というほどでもないので、大量に変換するなら検討してもいいかと思う。

## 各種言語ラッパー

- [chezou/tabula-py: Simple wrapper of tabula-java: extract table from PDF into pandas DataFrame](https://github.com/chezou/tabula-py)
- [ezodude/tabula-js: Helps you extract CSV data tables from PDF files using the mighty tabula-java. See https://github.com/tabulapdf/tabula-java](https://github.com/ezodude/tabula-js)

## サンプルとして使ったファイルについて
余談となるが、Tabula の使い方を説明するのに使ったサンプルファイルは[全国災害伝承情報：総務省消防庁](http://www.fdma.go.jp/html/life/saigai_densyo/)のページで公開されている[2\. 防災に関わる「言い伝え」](http://www.fdma.go.jp/html/life/saigai_densyo/02.pdf)で全国の災害にまつわる教訓、言い伝えを一覧にしたもの。例えば、次のような言い伝えが収録されておりなかなか興味深い資料である。

- 地震のとき「マンダラッコ、マンダラッコ」と唱えるとよい。(神奈川県平塚市)
- 地震のとき「マンザイロク、マンザイロク」といって、竹やぶに逃げる（新潟県新潟市）
- 地震のときは「まんぜえろく」と唱える（埼玉県毛呂山町）