gnuplotで領収書を作る

gnuplotの「データファイルから情報を読み出してきて画像化する」という機能を考えれば、領収書をgnuplotで作ることも可能だということに気づきます。Officeソフトにあるような埋め込み印刷機能の使い方がわからなくても、gnuplotさえあれば簡単に領収書ができます。

領収書を作る

以下のようなデータファイルをもとに、gnuplotで領収書を作ります。

山田太郎	1000
田中次郎	15000
佐藤三郎	17000
山中四郎	40000
齋藤五郎	800
渡辺六郎	21400
鈴木七郎	32000
高橋八郎	10040
山本九郎	1400
中村十郎	1216000
加藤十一郎	1200
山下十二郎	10
近藤十三郎	15500
谷十四郎	109000
岸十五郎	0
沖田十六郎	40000
原田十七郎	200
芹沢十八郎	2220
岡田十九郎	2220
笠原二十郎	130000

このデータファイルには、1列目に名前(宛名)が、2列目には金額が記載されています。なお、以下のスクリプトを使う場合、データファイル・スクリプトファイルとも、文字コードをUTF-8Nにしておく必要があります。また、gnuplot 5.0.0以降が必要です。

set encoding utf8

file = "reciept.dat"
name  = 1  # データファイル中の宛名の入っているコラムの指定
money = 2  # データファイル中の金額の入っているコラムの指定

hsize = 91.0 #mm 
vsize = 55.0 #mm

Hsize = 210.0 # mm (A4 size)
Vsize = 297.0 # mm (A4 size)

bm = 11.0 # mm;  bottom margin
tm = 11.0 # mm;  top margin
lm = 14.0 # mm;  left margin
rm = 14.0 # mm;  right margin


# 数字に3桁ごとにカンマを入れる関数
addcomma(x) = (x >= 1000000 ? sprintf("%d,%03d,%03d", int(x)/1000000, (int(x-int(x)/1000000*1e6)/1000), int(x)%1000) : \
     (x >= 1000 ? sprintf("%d,%03d", int(x)/1000, int(x)%1000) : sprintf("%d", int(x))))

# データ数の取得
stats file u 0 nooutput 
N = STATS_records


set term pdfcairo size 21.0cm,29.7cm font "Meiryo,10" enhanced
set out "reciept.pdf"

set size hsize/Hsize, vsize/Vsize

# 枠線が要らない場合は次行のコメントを外す
#set border 0

unset xtics
unset ytics
set format xy ""
set xrange [0:1]
set yrange [0:1]
set tmargin 0
set bmargin 0
set rmargin 0
set lmargin 0
set label 1 at graph 0.05,0.92 left "領収書" font ",22"
set label 2 at graph 0.95,0.9 right "XXXX年XX月XX日"
set label 3 at graph 0.5,0.42 center "但し、○○代として"
set label 4 at graph 0.5,0.34 center "上記正に領収いたしました。" font ",12"
set label 5 at graph 0.95,0.25  right "京都府京都市左京区吉田本町"
set label 6 at graph 0.95,0.19 right "京都大学××研究科○○研究室"
set label 7 at graph 0.95,0.10 right "京大太郎  ?  " font ",12"


do for [i=0:N-1]{
     if (i%10 == 0){
          set multiplot
	  }
     if (i%10 < 5) {set origin lm/Hsize, (bm+(4-i%10)*vsize)/Vsize}
     else {set origin (lm+hsize)/Hsize, (bm+(9-i%10)*vsize)/Vsize}
     plot file using (0.5):(0.72):("{/:Bold ". stringcolumn(name) . " 様}") every ::i::i with labels font ",25" notitle,\
          file using (0.5):(0.56):("\\\\" . addcomma(column(money)) . "-") every ::i::i with labels font ",30" notitle
     if (i%10 == 9){
          unset multiplot
	  }
     }


unset multiplot
set term pop
set out
rep

このデータファイルを以下のgnuplotスクリプトで処理すると、こちら(reciept.pdf)のような領収書が作成できます。

これで、急に領収書を作る必要ができた場合でもgnuplotさえあれば慌てる必要がありません。画像ファイルを入れ込んだりすれば、ロゴを入れたり、印影を入れたりもできるはずです。