pdf2txt.py 便利すぎる(PDF表をテキスト化)

2021/08/31PC

SARS-COV-2関連情報を集めていると、国や自治体、企業が公開している情報がPDFなのにムカついてしまう。ExcelをPDF化したものもあって、素直にxlsも出せよと思う。
(それでも画像データで公開している組織に比べればかなりマシなのが悲しい)

例えば、沖縄県のワクチン接種率の情報がPDFだ。「沖縄県のワクチン接種進捗状況/沖縄県」に掲載されている「県内市町村ごとの新型コロナワクチン接種件数」がPDFだ。タイトルは .xlsx になっているので、元々はExcelであったのだろう。

ご丁寧なことに情報が更新されると過去のPDFが消されてしまうので、接種率の変化を追っかけたい場合はPDFを手元に保存しておかないといけない。沖縄県の情報公開はこういうところがダメダメだと思う。消すなよ。

表から情報を抜き出す

情報を抜き出すツールとしては adobeの【無料】PDFをExcelに変換 – Adobe 公式を使うのが便利なのだが、お布施をしないと利用回数が限られてくる。大量の情報をバッチ処理するのにも向いていない。

コマンドラインで抜き出すツールを探していたら python のツールがいくつか見つかった。

名前の通り、pdf2txtはPDFをテキスト化、tabula-pyは表形式のPDFをテキスト化してくれる。ハマれば後者の方が使いやすいのだが、今回のPDFではうまくいかない。下図の矢印部分で表が分かれていると判断されて(実際そうなのだと思う)、左端1行しかテキスト化されない。

tabula-py には領域を指定する機能もあるので、がんばればテキスト化できそうなのであるが面倒なのでパス。

pdf2txt.pyを使う

-M と -L オプションを付けて pdf2txt.py を使うと、うまいこと変換してくれる。これを指定しないと、分かれた表ごとに変換してしまうので、後処理が面倒くさい。

$ pdf2txt.py -M 60 -L 2 0823.pdf
ワクチン接種記録システム(VRS)に基づく市町村ごとの接種状況
全年代 高齢者

令和3年8月23日
:
市区町村 1回目 2回目 1回目 2回目 1回目 2回目 1回目 2回目
(全国) 127,138,033 57,108,262 44,479,488 44.92% 34.99% 35,486,339 31,590,840 30,587,127 89.02% 86.19%
(沖縄県) 1,481,547 573,368 423,265 38.70% 28.57% 323,501 278,554 264,516 86.11% 81.77%
:

-M は文字間(横方向)に空白があっても、同じ行だと判定してくれる。 -Lは同様に行間である。

–char-margin CHAR_MARGIN, -M CHAR_MARGIN
If two characters are closer together than this margin they are
considered to be part of the same line. The margin is specified
relative to the width of the character.
–line-margin LINE_MARGIN, -L LINE_MARGIN
If two lines are are close together they are considered to be
part of the same paragraph. The margin is specified relative to
the height of a line.



追記: パラメータの解説記事を見つけたので、追記しておきます。


あとはsedで不要な行を削って、数値3桁区切りのカンマを削って、空白をカンマに変換すればCSVになる。

$ pdf2txt.py -M 60 -L 2 0823.pdf|nkf -w|sed -e '1,/市区町村/d’ -e '/^※/,$d’ -e 's/,//g’ -e 's/ /,/g’
(全国),127138033,57108262,44479488,44.92%,34.99%,35486339,31590840,30587127,89.02%,86.19%
(沖縄県),1481547,573368,423265,38.70%,28.57%,323501,278554,264516,86.11%,81.77%
那覇市,322011,122453,88896,38.03%,27.61%,74092,61333,57624,82.78%,77.77%
宜野湾市,99678,29214,19581,29.31%,19.64%,19153,15916,15278,83.10%,79.77%
石垣市,49824,28847,25478,57.90%,51.14%,10655,9859,9825,92.53%,92.21%
浦添市,115340,43016,32519,37.29%,28.19%,22580,19056,18139,84.39%,80.33%
名護市,63389,23587,17391,37.21%,27.44%,13988,12385,11864,88.54%,84.82%
:



pdf2txt.py 便利すぎる。


追記

pdftotextを教えてもらいました。これでも良いですね。 -layout オプションで、pdf2txt.pyと同じことができました。

PC

Posted by ず@沖縄