paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

SUICAの利用明細をDBに取り込みたい 前編

自宅の家計簿はFirefly IIIを使ってトラッキングしています。

クレジット以外の電子決済はモバイルSUICAを使用しており、SUICAのチャージもクレジット払いで利用額はわかるのですが、何にいくら使ったかがわかりません。
SUICAは電車とコンビニ払いくらいしか使っていないのですが、無駄遣いしてないかを追いたいので利用明細をDBに突っ込んで分析してみようと思います。

別にDBじゃなくてCSVとかでもいいんですが、集計が楽ですからね。

SUICAの明細

JR東日本のサイトから明細をダウンロードできます。
が、PDFでしかダウンロードできません。

まずはこれを出力させないといけませんね。

明細はこんな感じです。(一応モザイクかけます)

f:id:paloma69:20211010141543p:plain

PDFのテーブル出力

私はpythonを使えますので
「PDF テーブル python」で検索するとPDFからテーブルを出力するライブラリが主に以下の2つが出てきます。

tebulaはjavaのラッパーのようでjavaもインストールの必要ありなワードがあったのでcamelot-pyを使用することにしました。

あまり環境にあれこれ入れたくないので。

環境

サブ機のubuntuデスクトップを使います。

masashi@PC-ubuntu:~$ uname -r ; lsb_release -a
5.4.0-88-generic
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal

camelot-pyインストール

どんな依存ライブラリが入ってくるかわからないので仮想環境作ります。

masashi@PC-ubuntu:~$ python3 -m venv pdf
masashi@PC-ubuntu:~$ source pdf/bin/activate
(pdf) masashi@PC-ubuntu:~$ python --version
Python 3.8.10
(pdf) masashi@PC-ubuntu:~$ 
(pdf) masashi@PC-ubuntu:~$ pip list
Package       Version
------------- -------
pip           20.0.2 
pkg-resources 0.0.0  
setuptools    44.0.0 
依存パッケージのインストール

公式サイトに沿って依存パッケージをインストールします。

(pdf) masashi@PC-ubuntu:~$ sudo apt install ghostscript python3-tk
camelot-pyインストール

本体をインストール。

(pdf) masashi@PC-ubuntu:~$ pip install "camelot-py[base]"
Collecting camelot-py[base]
ライブラリの確認
(pdf) masashi@PC-ubuntu:~$ pip list
Package          Version 
---------------- --------
camelot-py       0.10.1  
cffi             1.14.6  
chardet          4.0.0   
click            8.0.2   
cryptography     35.0.0  
et-xmlfile       1.1.0   
ghostscript      0.7     
numpy            1.21.2  
opencv-python    4.5.3.56
openpyxl         3.0.9   
pandas           1.3.3   
pdfminer.six     20201018
pdftopng         0.2.3   
pip              20.0.2  
pkg-resources    0.0.0   
pycparser        2.20    
PyPDF2           1.26.0  
python-dateutil  2.8.2   
pytz             2021.3  
setuptools       44.0.0  
six              1.16.0  
sortedcontainers 2.4.0   
tabulate         0.8.9   

いろいろ入ってきました。

ファイルの読み込み

こちらも公式サイトに沿ってPDFを読み込みます。
ファイル名は日付だけわかるようにリネームしてます。

>>> import camelot
>>> 
>>> tables = camelot.read_pdf('20210825_20210925110904.pdf')
>>> tables
<TableList n=0>
>>> tables.export('suica.csv', f='csv', compress=True)
>>> tables[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/masashi/pdf/lib/python3.8/site-packages/camelot/core.py", line 689, in __getitem__
    return self._tables[idx]
IndexError: list index out of range

なんとSUICAの明細はテーブルとして認識されませんでした…
困りましたねえ。

ということで他のPDF操作ライブラリ

pythonは他にもPDF操作ライブラリがあるので他の手を試してみます。

PyPDF2

開発は終わっているようなのですが使ってみます。
calelot-pyと一緒にインストールされてきました。

「Automate the Boring Stuff with Python」でも出てきます。

>>> import PyPDF2
>>> file = open('20210825_20210925110904.pdf', 'rb')
>>> pdfreader = PyPDF2.PdfFileReader(file)
>>> pdfreader.numPages
2
>>> pageobj = pdfreader.getPage(0)
>>> pageobj.extractText()
')Þ>fl>”>¢>¼ˆ‡˛«˜`#㘘>fl>”>¢>¼˜`#㘘ˆ‡˛«>fl>”>¢>¼ˆ‡˛«˜`#㘘˜`#㘘ˆ‡˛«ˆ‡˛«˜`#㘘>fl>”>¢>¼˜`#㘘ˆ‡˛«ˆ‡˛«˜`#㘘>fl>”>¢>¼>fl>”>¢>¼˜`#㘘ˆ‡˛«ˆ‡˛«˜`#㘘>fl>”>¢>¼˜`#㘘ˆ‡˛«ˆ‡˛«˜`#㘘˜`#㘘ˆ‡˛«˙v˚g8€ˆ¥'

日本語対応してませんでした…

pdfminer

とりあえず中身を読み取れればなんとかなると思い別のライブラリを試します。
pdfminerは日本語対応しているようです。

こちらもcalelot-pyと一緒にインストールされてきました。

>>> from pdfminer.high_level import extract_text
>>> text = extract_text('20210825_20210925110904.pdf')
>>> print(text)
モバイル  Suica  残額ご利用明細

JE*** **** **** 3311

残額履歴  (101件)

利用駅

種別

利用駅

月
08
08
08
08

()

読み込みは成功しましたが、行ごとではなく列順で読み込まれて出力されるようなのであまり有効ではありませんね。

pdftotext

shellにもpdfを読み込めるパッケージがあるようなのでこちらも試してみます。
コマンドを実行すると同名のtxtファイルが作成されます。

(pdf) masashi@PC-ubuntu:~/expenses$ pdftotext 20210825_20210925110904.pdf 
(pdf) masashi@PC-ubuntu:~/expenses$ ls -l 20210825_20210925110904.*
-rw-rw-r-- 1 masashi masashi 45899 109 13:11 20210825_20210925110904.pdf
-rw-rw-r-- 1 masashi masashi  4682 109 15:50 20210825_20210925110904.txt

(pdf) masashi@PC-ubuntu:~/expenses$ cat 20210825_20210925110904.txt
モバイル

Suica

残額ご利用明細
JE*** **** **** 3311

残額履歴
月
08
08
08
08
08
08
08
()

結果はpdfminerと同じですね。
これもダメか…

まとめ

SUICAの利用明細はテーブルとして出力できませんでした。
こうなったら自分でコンバートしてDBにインポートするしかありませんね。
というわけで次回に続きます。

参考サイト

Camelot: PDF Table Extraction for Humans — Camelot 0.10.1 documentation

【Python】pdfminerでPDFからテキストを抽出する | ジコログ

【 pdftotext 】コマンド――PDFファイルからテキストを抽出する:Linux基本コマンドTips(286) - @IT