さあ、良い子のみんなが大好きな帳票ソリューション系のお話だよ!
え?そんなの聞き飽きたって?いつものExcel + Word + VB Script + Windows の話と勘違いしているようだね。
今回はちょっとだけ違うよ、Linux + rubyでPDFを扱う話だから楽しめると思うよ。
事前準備
という事で、rubyでPDFフォーム(形が作られている穴あき形式)を出力するプログラムの紹介をします。
この記事はUbuntu16.04を利用して動作確認をしています。
まずはpdftkをインストールします。
$ sudo apt install pdftk
次にrubyもインストールします。
$ sudo apt-add-repository ppa:brightbox/ruby-ng
$ sudo apt update
$ sudo apt install ruby2.4 ruby2.4-dev
rubyからpdftkを扱うためのライブラリであるpdf-formsをインストールします。
$ sudo gem install pdf-forms
PDFフォームは検索したら出てきたサンプルをお借りしました。
$ wget http://foersom.com/net/HowTo/data/OoPdfFormExample.pdf
ちなみにPDFフォームは有料になりますがAdobe Acrobatで作成すると楽ですよ。
PDFフォームに値を入れて出力する
rubyのプログラムに移りましょう。PdfFormsのインスタンスを作ります。
require 'pdf_forms'
pdftk = PdfForms.new(`which pdftk`.chomp, utf8_fields: true)
値が入れられるフィールドを取得するにはget_field_names
を利用します。
pdftk.get_field_names 'OoPdfFormExample.pdf'
上記をコマンドから実行するには以下のようになります。
$ pdftk OoPdfFormExample.pdf dump_data_fields_utf8
出力先のpdfを開いておきます。Ubuntuなのでevinceが便利です。
$ evince OoPdfFormExample-filled.pdf
fill_form
にパラメーターを指定すると値を埋め込む事ができます。
pdftk.fill_form 'OoPdfFormExample.pdf',
'OoPdfFormExample-filled.pdf',
{"Given Name Text Box" => "tkosuga"}
evince
で開いているファイルが自動更新されてPDFフォームに値が入ったと思います。
このライブラリはutf8も対応しているのでドイツ語を入れて見ましょう。※PDFの方でフォントが入っている必要があります。
pdftk.fill_form 'OoPdfFormExample.pdf',
'OoPdfFormExample-filled.pdf',
{"Given Name Text Box" => "Grußkarten"}
大丈夫ですね。
まとめ
PDFを生成するライブラリはたくさんありますが、PDFのテンプレートをプログラムで作ったりHTMLから変換するのが面倒だったりします。
それであれば最初からPDFフォームに値を入れ込む形にする方が多くの場合で奇麗に出力できるし楽だと思います。
JavaのiTextぐらいプログラムから色々できれば便利ですが、pdftk
をコマンドから操作するのでも多くの事が出来ます。
どうしてもrubyでiText相当の事を行いたい場合はjrubyを使いましょう。