min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

Python3 PDFにページ番号を付与する

f:id:min117:20201031134123p:plain

 

PDFにページ番号を付与したい。ユーザー向けにマニュアルや手引きを作っている人はけっこうコレに出くわすと思う。

f:id:min117:20201031131858p:plain

マニュアルは様々なファイル形式の合体で作られる。例えば本文はWord(.doc)や一太郎(.jtd)で、図はPowerPoint(.ppt)で、表はExcel(.xlsx)、ついにはVisioDocuworksの文書までが入り混じる。

 

これらのファイルを一つにまとめるにはいったんPDFにしてから合体するしかない。PDFの合体はshell(bash)のpdfuniteコマンドで一発でできる。

f:id:min117:20201031130548p:plain

www.atmarkit.co.jp

 

で、合体したPDF(今回は60ページ以上ある)にページ番号を付与したい。しかし、この方法がなかなか見つからない。ググってもまともな記事が出てこない。

 

唯一、Python3で実現している人がいた。

qiita.com

やってみる。

 

まずは reportlab のインストール。

$ pip3 install reportlab --user

f:id:min117:20201031131216p:plain

 

続いて pdfrw をインストールする。

$ pip3 install pdfrw --user

f:id:min117:20201031131339p:plain

※ 環境によっては --user は付けなくてもいいかも。我が家のLinuxでは必要だった(たぶん権限が原因)。

 

Python3で処理を書く。コードは上記の記事まんま真似してみる。ソースのファイル名は my_PDFPAGENUMBER.py にした。

 

$ vim my_PDFPAGENUMBER.py

f:id:min117:20201031131017p:plain

22行目…ページ番号だけ(総ページ数は不要)で出したい場合は f"{page_num}" にする。

25行目…ページ番号のフォントサイズは14にした。少し大きめにしたい。

 

仮に united.pdfというファイルにページ番号を付けたい場合、実行はこう。

 

$ python3 my_PDFPAGENUMBER.py united.pdf

f:id:min117:20201031133733p:plain


こんな感じでページ番号がつく。

f:id:min117:20201031131858p:plain

全てのページに一瞬で番号が付与される。

 

「いや、職場はWindowsだからPython入れられない」「職場にLinux環境ない」なんて場合もGoogle Cloud Platform(GCP)に接続して Cloud Shellを使えばOK。

 

職場のChromeからやるとこんな感じ。

f:id:min117:20201031132337p:plain

Googleアカウントさえあればできる。

GCPの環境構築に関しては別記事で書く。

 

今回のコードを書いて

f:id:min117:20201031132717p:plain

 

実行すればいい。

f:id:min117:20201031132553p:plain

ちなみにGCPにPDFをアップロード or ダウンロードしたい場合は、右上の「縦の…」からできる。

 


コピペ用

from reportlab.pdfgen.canvas import Canvas
from pdfrw import PdfReader
from pdfrw.toreportlab import makerl
from pdfrw.buildxobj import pagexobj
import sys
import os

if len(sys.argv) != 2 or ".pdf" not in sys.argv[1].lower():
    print(f"Usage: python {sys.argv[0]} <pdf filename>")
    sys.exit()
input_file = sys.argv[1]
output_file = os.path.splitext(sys.argv[1])[0] + "_pgn.pdf"

reader = PdfReader(input_file)
pages = [pagexobj(p) for p in reader.pages]

canvas = Canvas(output_file)

for page_num, page in enumerate(pages, start=1):
    canvas.doForm(makerl(canvas, page))

    footer_text = f"{page_num}/{len(pages)}"
    canvas.saveState()
    canvas.setStrokeColorRGB(0, 0, 0)
    canvas.setFont('Times-Roman', 14)
    canvas.drawString(290, 10, footer_text)
    canvas.restoreState()
    canvas.showPage()

canvas.save()

 

 

 

 

 

 

Softbank Desire X06HTを使い始めて10年を超えた

まだVodafoneだった頃からずっとソフトバンクを使い続けている。

f:id:min117:20201031115901p:plain

知る人ぞ知る名機。HTC Desire X06HT。使い始めて10年を超えた

 

契約したのは2009年。まだiPhone 3Gが現役だった頃だ。

f:id:min117:20201031120407p:plain

 

毎月の利用料は通話料込みで6,000円弱。

f:id:min117:20201031115938p:plain

 

なつかしのホワイトプランが今も現役。しかも「パケットし放題フラット」なので通信は4,200円上限なしでパケットが使える。

f:id:min117:20201031121056p:plain

今月は19.37GB使った。約20GBだ。

 

折しも今月(2020年10月)は20GBプランの値下げが騒がれている

www.itmedia.co.jp

iphone-mania.jp

 

こちとら10年前から4,200円パケットし放題で、毎月20GBくらいは使ってきたわけで。時代がやっとX06HTに追いついてきたという感じか。

 

今はもう契約できない「銀SIM」の最強ぶり。

f:id:min117:20201031122010p:plain f:id:min117:20201031122031p:plain

 

最高のプランに10年前に入れていたわけだ。

min117.hatenablog.com

 

そんなDesire X06HTの利用料は、通話料コミだと毎月平均6,046円

f:id:min117:20201031120659p:plain

 

分散と偏差はこんな感じ。

f:id:min117:20201031120832p:plain

 

テザリング実測で3Mbpsは軽く出るから3Gだけど全く困らない

f:id:min117:20201031122010p:plain

 

本体はもう国内では売っていないから予備を買い揃えてある

f:id:min117:20201031122642j:plain

OSはCyanogenModのカスタムROM。めちゃカッコいい。

f:id:min117:20201031122904j:plain

2024年の3Gサービス終了までは現役で使い続けられるだろう。

 

 

 

 

csvの任意の列2つをタテヨコにとった散布図scatterを表示するだけのpythonコード

csvの任意の列2つをタテヨコにとったグラフ(散布図)を作るだけのコード。こういうシンプルな機能を揃えたい。

f:id:min117:20201027070130p:plain


サンプルcsvはこんな感じ。銀行の残高をcsvに出力したもの。

$ cat dpwithdraw.csv
f:id:min117:20201027063250p:plain

 

コードはこれ。python3。

f:id:min117:20201027064119p:plain
11〜15行目 csvの列名を取り出して変数に入れる(リストになる?)

20行目 グラフにしたい変数(変数リスト?)を2つ決める。scatter(a, b)的に。

23行目 グラフを表示する

 

変数名がテキトーなのは元ソースをそのまま流用してるから。

 

元ソース

wagtail.cds.tohoku.ac.jp

 

jupyter notebook で .pyソースを実行するときは run する。

In[]: run my_csv02.py

f:id:min117:20201027062717p:plain

支払いを横軸、残高を縦軸にとったんじゃ、グラフ(散布図)にしてもほとんど意味をなさない。

けど、2つの要素を縦横にして即時グラフにできる仕組みにしたのは意味ある。

 

例えば

$ python3 my_csv02.py target.csv X Y

のようにして、X列とY列の散布図を作れるようにすれば、いろんなXYの関係を試せる。

 

Excelでももちろん同じことできるけど、セルにデータを貼るのがダルい。それよりも、銀行サイトから出力したcsvを即時で(bashから)python食わせる、データを比較できる、ような仕組みを作って、データに見慣れるのが大事と思ってる。

 

note.nkmk.me

 

 

 

 

楽天モバイルのeSIM交換・再発行手数料が無料になってる(楽天UN-LIMITもだと思う)

ついこないだ(9月12日)に楽天UN-LIMIT契約した際、ひやかしに行った楽天店舗の店員は確かに言った。「eSIMの再発行?手数料かかっちゃいます。3,000円」と。それが10月12日から無料になっているとは。

network.mobile.rakuten.co.jp

 

コレ結構重要なことと思う。

min117.hatenablog.com

 

こないだ買ったばかりの楽天ミニにeSIMを載せるのも、今後は無料でできるわけだ。

f:id:min117:20200927071642j:plain

別に三木谷社長が好きなわけでもないし、ほめそやす気は無いが、コレに関しては先見の明があると思う。

 

eSIMに総務省が言及したのが10月21日。

f:id:min117:20201025191738p:plain

 

iphone-mania.jp

携帯業界に口出しする政府や総務省には辟易しているし、強権的な政府には本当に腹が立つが、それはそれとして、その言及の1週間以上前に、三木谷はeSIMの再発行手数料無料を決めていたわけだ。楽天やるな」と思うことが結構多い最近。MNOとしては化ける気がする。

 

参考になった記事。

www.na3.jp

 

 

 

 

matplotlibのグラフ凡例の豆腐文字化けをIPAフォントで解消する → 失敗

jupyterでcsv読み込んでグラフ化したら豆腐文字化けした。

f:id:min117:20201025181731p:plain

 

このサイト参考に直す。

qiita.com

 

調査に使ったpythonコードは3つ。

import matplotlib

matplotlib.matplotlib_fname()

matplotlib.get_configdir()

f:id:min117:20201025181929p:plain

 

matplotlib.matplotlib_fname() で表示されるフォルダにIPAexフォントを置けば解消するらしい。

IPAexフォント

https://ipafont.ipa.go.jp/node26#jp

 

jupyterはiMacで動かしているので、macOSのターミナル(bash)で作業を進める。

cd '/Users/bash/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/matplotlib/mpl-data/'

f:id:min117:20201025182404p:plain

 

$ cp ~/Downloads/IPAexfont00401/*ttf /Users/bash/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/matplotlib/mpl-data/fonts

f:id:min117:20201025182742p:plain

 

$ cd /Users/bash/.matplotlib

$ vim fontlist-v300.json

f:id:min117:20201025183118p:plain

f:id:min117:20201025183216p:plain

    {
      "fname": "fonts/ttf/ipaexg.ttf",
      "name": "IPAexGothic",  # ここ #
      "style": "normal",
      "variant": "normal",
      "weight": 400,
      "stretch": "normal",
      "size": "scalable",
      "__class__": "FontEntry"
    },

 

$ ls /Users/bash/.matplotlib

f:id:min117:20201025183305p:plain

 

$ mv tex.cache/ tex.cache_

f:id:min117:20201025183603p:plain

 

あかん。解消せん。

f:id:min117:20201025181731p:plain

 

jupyter notebookを再起動してみる。

f:id:min117:20201025183806p:plain

 

$ jupyter notebook --NotebookApp.token="" --NotebookApp.allow_remote_access=True --NotebookApp.use_redirect_file=False

f:id:min117:20201025183906p:plain

 

ダメか。また今度調査する。

f:id:min117:20201025184246p:plain

 

フォント入れる場所違ってた?入れ直したけどなお解消せず。

f:id:min117:20201025184525p:plain

 

import pandas as pd
import matplotlib.pyplot as plt

#これいるのか

plt.rcParams['font.family'] = 'IPAexGothic'
data = pd.read_csv('./dpwithdrawaldtl_181228041752_utf8.csv', encoding='UTF8')
data

f:id:min117:20201025185226p:plain

 

解消まであと一歩な気がする。

f:id:min117:20201025185407p:plain

 

f:id:min117:20201025185604p:plain

font_manager.py は編集したらアブなそうなので保存せず閉じた。

 

matplotlibrc を ~/.matplotlib にコピーしてfont.familyをいじってみる。

f:id:min117:20201025193638p:plain

f:id:min117:20201025193819p:plain

 

f:id:min117:20201025194102p:plain

 

ai-inter1.com

vim慣れてるとjupyterのpython3環境が楽しい

f:id:min117:20201025132958p:plain

 

自分のiMacにはjupyter環境がインストールされてた。たぶん去年このへんの記事を作ったんだと思う(うろ覚え)。

qiita.com

 

前回使ったPaizaのjupyter環境からダウンロードしたipynbファイルを取り込んだら即使えた。

min117.hatenablog.com

 

取り込みは簡単。Paizaで作ったマイサーバのJupyter Notebookから

f:id:min117:20201025134936p:plain

 

書きかけのコードをipynbファイルとして手元にダウンロードして

f:id:min117:20201025135203p:plain

 

手元iMacのjupyterからダブルクリックするだけ。

f:id:min117:20201025134748p:plain

 

前回作った「アンスコムの4つ組みグラフ」も手元iMacで動く。

f:id:min117:20201025132347p:plain

 

jupyterをいじる。

 

まず、この行を消したいなーと思ったらEscキーを押してコマンドモードにして

f:id:min117:20201025132525p:plain

 

行の色が変わったらddで行を消せる

f:id:min117:20201025132614p:plain

vimキーバインドと同じ。最高。

 

aを押すと行が増えた。

f:id:min117:20201025132728p:plain

addだろう。これもvimっぽくて良い。

 

jで下の行へ移動、kで上の行に戻る。vimそのもの。

f:id:min117:20201025133041p:plain

 

OSコマンドも使える。

$ ls | grep .py

f:id:min117:20201025132119p:plain


.pyファイルを実行したいときは run ファイル名 で可能らしい。

f:id:min117:20201025132023p:plain

tabでファイル名の補完も聞く。気持ちいい。

 

てことは、試したいソースをいつもの慣れた環境(bash)で書いてjupyterで実行させることも可能なわけだ。

 

やってみる。整数の因数を計算するコードを例にとる。

f:id:min117:20201025133404j:plain

 

$ vim py_math_p013.py

f:id:min117:20201025134246p:plain

これをbashで実行すると動く(当然)。

f:id:min117:20201025134320p:plain

 

jupyterで動かしてみる。

f:id:min117:20201025134450p:plain

素晴らしい。

 

bashと違うのは、グラフを描画してくれるところ。

 

書籍で「こうやると」

f:id:min117:20201025140049j:plain

「こうなるよ」を

f:id:min117:20201025140054j:plain

jupyterでやってみると

f:id:min117:20201025140151p:plain

こうなるよ、と。コレめっちゃ楽しい。

 

グラフで点を作る(marker指定)すると

f:id:min117:20201025140602p:plain

f:id:min117:20201025140509j:plain

ホントに付いた。

f:id:min117:20201025140647p:plain

 

marker='x' もイケる。

f:id:min117:20201025141031p:plain

 

marker='' を取り去ると点だけになる。

f:id:min117:20201025141133p:plain

 

気温グラフ。

f:id:min117:20201025165612p:plain

 

書籍はだいぶ前の(2016年刊行)なので、pythonも変わっちゃってグラフは無理かな?と思ってたけど、フツーに使える。

from pylab import plot, show は今(2020年10月)もそのまま動くみたい。

 

これで書籍の中のいろんなコードを試すことができる。jupyter最高。

 

 

 

jupyter notebook(Python3)で アンスコムの4つ組(Anscombe's quartet)を試す

前回記事で、WebさえあればPython3でグラフ描ける環境ができた。

min117.hatenablog.com

Shellのコンソールだけだとグラフ描けなくて困ってたけど、これなら色々と試せる。

 

以前からいじりたかったコレ。

f:id:min117:20201025064910j:plain

さっそく試してみる。

 

P87の散布図。

f:id:min117:20201025064900j:plain

アンスコムの4つ組」(Anscombe's quartet)というデータがあるらしい。

 

「平均」「分散」「相関関係」が同じなんだと。ほぅ。

f:id:min117:20201025064905j:plain

分散の求め方はこないだやった。

min117.hatenablog.com

 

グラフは scatterメソッドで描けるみたい。

x = [1, 2, 3, 4]
y = [2, 4, 6, 8]
import matplotlib.pyplot as plt
plt.scatter(x, y)

f:id:min117:20201025065702p:plain

scatterって何だろう。あとで調べる。

 

アンスコムの4つ組」(Anscombe's quartet)を試す。

f:id:min117:20201025065935p:plain

 

x1 = [10.0, 8.0, 13.0, 9.0, 11.0, 14.0, 6.0, 4.0, 12.0, 7.0, 5.0]
y1 = [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68]
plt.scatter(x1, y1)

f:id:min117:20201025065832p:plain

グラフにすると直感的になって面白い。

 

X1のデータをこないだのスクリプト (分散を求める)に食わせてみる。

f:id:min117:20201025070532p:plain

 

平均が9、標準偏差が3.32になっていれば正解らしい。

f:id:min117:20201025070751p:plain

 

$ ./my_statistics_bunsan.sh 10 8 13 9 11 14 6 4 12 7 5

f:id:min117:20201025070623p:plain

あれ。標準偏差が3.16になってしもた。スクリプト がおかしい?今度見直す。

 

同じ分散・標準偏差になる別のデータの組み(X2)もグラフにしてみる。

x2 = [10.0, 8.0, 13.0, 9.0, 11.0, 14.0, 6.0, 4.0, 12.0, 7.0, 5.0]
y2 = [9.14, 8.14, 8.74, 8.77, 9.26, 8.10, 6.13, 3.10, 9.13, 7.26, 4.74]
import matplotlib.pyplot as plt
plt.scatter(x2, y2)

f:id:min117:20201025071802p:plain


X1と比べる。

f:id:min117:20201025071847p:plain

だいぶ違うくて面白い。同じ分散なのに。

 

X3だとこう。

x3 = [10.0, 8.0, 13.0, 9.0, 11.0, 14.0, 6.0, 4.0, 12.0, 7.0, 5.0]
y3 = [7.46, 6.77, 12.74, 7.11, 7.81, 8.84, 6.08, 5.39, 8.15, 6.42, 5.73]
plt.scatter(x3, y3)

f:id:min117:20201025072439p:plain

 

X4はまた違う。

f:id:min117:20201025072716p:plain

よし。これでデータさえあれば好きにグラフを描ける環境はできた。

 

国の統計データとか取ってきて色々調べることにする。

www.e-stat.go.jp

www.stat.go.jp

f:id:min117:20201025072854p:plain