Field Reportsの使い方:単票(2) テーブルを含む帳票
今回は,テーブル形式のデータを持つ帳票(見積書)を作成します。
下絵の作成
前回同様,OpenOffice.org の Calc で帳票のデザインを作成しました。
これを,PDF形式にエクスポートします。
フィールドの配置
明細項目の部分が2次元のテーブルになっています。
このような場合は,
<フィールド名>.<行>.<列>
という命名規則でフィールドを並べます。<行>.<列>は,0始まりの整数とします。
手作業で並べるのは大変なので,Acrobatの「複数のフィールドを配置...」を使用します。
一発でぴったり枠にはめ込むのは難しいので,まずは必要な数のフィールドを生成して,位置やサイズは後で微調整します。
タテ・ヨコのフィールドを複数選択した上で,「整列」「分布」「サイズ」などのメニュー項目を活用して,きれいに並べます。
Acrobat のフィールドの再描画が非常に遅くちょっとイラッときますが,これぐらいの帳票であれば,慣れてくれば30分〜1時間ぐらいで作業できると思います。
“stamp1”“stamp2”は,ボタン・フィールドです。ボタン・フィールドには,画像をはめ込むことができます。
プログラムの作成
以下のような Python プログラムを作成しました。
#!/usr/bin/env python # coding: utf-8 from field import reports param = { # テンプレート "template": "./mitumori.pdf", # フィールド値 "context": { "date": "平成23年1月22日", "number": "10R0001", "to": "△△△惣菜株式会社", "title": "肉じゃがの材料", "delivery_date": "平成23年1月22日", "delivery_place": "貴社指定場所", "payment_terms": "銀行振込", "expiration_date": "発行から3ヶ月以内", "stamp1": {"icon": "./stamp.bmp"}, "table": [ ["1", "N001", "牛肉(切り落とし)", "200g", "250円", "500円"], ["2", "Y001", "じゃがいも(乱切り)", "3個", "30円", "90円"], ["3", "Y002", "にんじん(乱切り)", "1本", "40円", "40円"], ["4", "Y003", "たまねぎ(くし切り)", "1個", "50円", "50円"], ["5", "Y004", "しらたき", "1袋", "80円", "80円"], ["6", "Y005", "いんげん", "1袋", "40円", "40円"] ], "sub_total": "800円", "tax": "40円", "total": "840円" } } if __name__ == "__main__": reports.render(param, "out.pdf")
注目していただきたいのは,“table”の値を設定している部分です。
「“table”.<行>.<列>」というフィールド名なので,本来であれば辞書を入れ子にして値を指定するところですが,「0, 1, 2, ...」という順に部分フィールド名が付けられている場合は,リストを使用することができます。
また,ボタン・フィールドの部分には,画像ファイルを指定しています。
おまけ
上のプログラムでは画像ファイルのパス名で印影イメージを指定していますが,dataストリーム形式で指定することもできます。
"stamp1": {"icon": """data:image/x-bmp;base64, Qk02NQAAAAAAADYAAAAoAAAARgAAAMD///8BABgAAAAAAAAAAAATCwAAEwsAAAAA AAAAAAAA//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// ////////////////////////////////bgD///////////////////////////// //////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////N1/+NpP9bfP8/ Zf82Xv9Daf9ph/+tvf/o7f////////////////////////////////////////// //////////////////////////////////////////////////////////9uAP// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// (中略) ////////////////////////////////////////////////bgA="""},
他にも,PDFテンプレートをdataストリーム形式で指定することができます。