tabura-pyをHeroku上で利用する

##1.Google Colaboratoryでtabura-pyを利用する
[tabura-py](https://pypi.org/project/tabula-py/)は、taburaというpdfを読み込み操作するためのJava製モジュール(tabura-java)をPythonで利用するためのライブラリで、例えば地方自治体や政府系のオープンデータ（注：pdfで公開されている)をPythonでpdfファイルに載っている数値や項目を読み込みたい際にPythonなどでtabura-pyを利用すると良いかと思われる。

例えば[東京都福祉保健局](https://www.fukushihoken.metro.tokyo.lg.jp/)が、毎日15:00にHPで発表している、新型コロナ感染症(covid-19)の今日の東京都での新規感染者数(速報)のpdfファイルを、tabura-pyで読み込んでPythonで操作したいといった場合、以下のようなPythonスクリプトを生成することで、pdfにある感染者数(速報値)を抽出することができる。

```py:colab.py

!pip install tabula-py

from tabula import read_pdf
wmd = '030320'
url = 'https://www.fukushihoken.metro.tokyo.lg.jp/index.files/{0}sokuhou.pdf'.format(wmd )

tbls = read_pdf( url ,pages=1)
x =  tbls[0]['Unnamed: 0'][3]
txt ='[{0}_東京都] 新規感染者数_速報値:{1}'.format(wmd , x)
print(txt)  
```
注:Google Colaboratory上でtabura-pyを利用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91974/9e80fa0e-6c95-6428-20a3-e068d5689246.png)

余談だが、[東京都福祉保健局](https://www.fukushihoken.metro.tokyo.lg.jp/)がHP上に発表しているpdfファイルの名前の命名規則が**和暦利用**(令和3年)というのが、なんとも「しょっぱい」というかトホホな感じではあるが...(汗
（せめて西暦でファイル名を生成して欲しかった。というよりもそれ以前にpdfファイルではなく、txtファイルやcsvファイル、json形式などでオープンデータを公表していただけるのが一番手取り早いんすけどね...)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91974/7b6daac9-f5e8-e716-f2ed-debe6cfd661f.png)

##2.Herokuでtabura-pyを利用する
tabura-pyはtabura-javaのラッパーライブラリで、普通にtabura-pyを使ったPythonスクリプトをHerokuの環境にpushしてスクリプトを実行すると、以下のようなエラー(Javaのモジュールがないうんぬん)が出る。

`Еrror: tabula.errors.JavaNotFoundError: "java" command is not found from this Python process.Please ensure Java is installed and PATH is set for "java"`

解決方法としては、以下のstackoverflowの投稿を参照。
色々調べたり試行錯誤をしたが、このstackoverflowの投稿がすべてを語ってましたです(汗

※参考↓
https://stackoverflow.com/questions/58548093/java-not-found-when-i-try-to-read-a-pdf-file-using-the-tabula-library

解決方法としては要約すると、Herokuの**buildpack**にJavaを追加して、pythonとJavaの2つ構成にした上で、アプリ(Heroku上にpushするモジュール群)の中に、**pom.xml**を作成してHerokuにpushし直すと上記のエラーは解消され、tabura-pyがHeroku上で利用できるようになる。

#### 2-1.HerokuのBuildpackにJavaを追加する
Herokuのbuildpacksの構成を、Java[1]とpython[2]の2つを登録する。なお`heroku buildpacks`で現在のBuildpackの状況を確認できる。

```
heroku buildpacks:set heroku/python
heroku buildpacks:add --index 1 heroku/java

heroku buildpacks
```

#### 2-2.pom.xmlファイルの作成

```py:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <version>1.0-SNAPSHOT</version>
    <artifactId>helloworld</artifactId>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.0.1</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals><goal>copy-dependencies</goal></goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
```

pom.xmlについては、Herokuが提供しているドキュメント「Deploying Java Apps on Heroku」にある説明を参照。１行目の`<?xml version="1.0" encoding="UTF-8"?>`の箇所と、中段の`<dependencies>...</dependencies>`の箇所は削除して、pom.xmlを作成すればOK。

※参考↓
https://devcenter.heroku.com/articles/deploying-java#verify-that-your-pom-xml-file-is-set-up-correctly

##3.Herokuでtabura-pyを利用する便益
ちなみにお昼のTVのワイドショーで、15時に東京都の新型コロナ感染症の新規感染者数の速報のテロップが流れるのは、ソース元は、東京都保健衛生局HPに15時に公開されるpdfファイルであります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91974/3bbb4052-5919-654f-07d5-2cfcb4802f73.png)

なので上記のtabura-pyを使って東京都保健衛生局HPのpdfファイルを読むpythonスクリプトをHerokuで毎日15時数分に実行(Heroku schedulerを利用)して、それを[Googe hangout chatの任意のチャットルームのスレッドに投稿する](https://qiita.com/Fortinbras/items/48d908181558e4b08b6f)ようにしてあげると、「(在宅勤務中に)**3時にTVを付けてゴゴスマを見る**(そして数字を確認した後にテレビを消す)」という不毛な？作業からは開放されることになります(笑


##4.余談
[東京都福祉保健局](https://www.fukushihoken.metro.tokyo.lg.jp/)は、本日の新型コロナ感染症の新規感染者数の速報値を、[twitter](https://twitter.com/tocho_fukuho)でも配信しているので、そちらを閲覧するというのもありです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91974/fe02dc78-f113-828d-91e6-e627e9eb342b.png)

(わざわざtabura-pyで数字を読み込むPythonスクリプトを作らなくても、例えば[IFTTT](https://ifttt.com/)などで東京都保健衛生局のアカウントをフォローして、15時の新規感染者数の速報値を伝えるツイートを捕捉するのも手なのかなと...)