Field Reportsの使い方:複合帳票
今回は,表紙付きの請求書を作成します。
復数のテンプレートを組み合わせて作る帳票を複合帳票と呼んでいます。
テンプレートの作成
表紙のテンプレートを作成します。
前回と同様に,OpenOffice.orgで下絵を作成し,Acrobatでフィールドを配置しました。
プログラムの作成
作成したプログラムは,以下のとおりです。
PDFテンプレートが2種類になりましたので,template要素の値をリストとし,テンプレートのパス名を並べています。
その際,表紙のテンプレートには“header”,明細のテンプレートには“body”という名前をつけています。
これは,それぞれのテンプレートで同じフィールド名をつけても区別できるように,名前空間を分離する目的で付けています。
例えば,表紙テンプレート上のdateフィールドは“header.date”,明細テンプレート上のdateフィールドは“body.date”というフィールド名になります。
#!/usr/bin/env python # coding: utf-8 from field import reports param = { # テンプレート "template": [ {"header": "./hyousi.pdf"}, {"body": "./mitumori.pdf"} ], # フィールド値 "context": { "header": { "date": "${NOW}", "number": "10R0001", "to": "△△△惣菜株式会社", "title": "肉じゃがの材料", "delivery_date": "2011-03-01", "delivery_place": "貴社指定場所", "payment_terms": "銀行振込", "expiration_date": "発行から3ヶ月以内", "total": 840 }, "body": { "date": "${NOW}", "number": "10R0001", "to": "△△△惣菜株式会社", "title": "肉じゃがの材料", "delivery_date": "2011-03-01", "delivery_place": "貴社指定場所", "payment_terms": "銀行振込", "expiration_date": "発行から3ヶ月以内", "stamp1": {"icon": "./stamp.png"}, "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 } }, # スタイル指定 "style": [ {"*.date": {"datetime": "GGE年M月D日"}}, {"*.delivery_date": {"datetime": "GGE年M月D日"}}, {"*.total": {"format": "###,###円"}}, {"*.sub_total": {"format": "###,###円"}}, {"*.tax": {"format": "###,###円"}}, {"body.table.*.[4:6]": {"format": "###,###円"}} ] } if __name__ == "__main__": reports.render(param, "out.pdf")
環境変数
プログラム中の「 ${NOW}」の部分は,システム定義の環境変数を参照しています。
以下の環境変数が,システムによりあらかじめ定義されています。
変数名 | 値 |
---|---|
PAGE | 現在のページ数(0はじまり) |
PAGE+ | 現在のページ数(1はじまり) |
NUM_PAGES | 全ページ数 |
NOW | 現在時刻 |
スタイル指定
以下の部分が今回はじめて出てきたstyle要素です。
パターンに当てはまるフィールドのスタイルを指定します。
"style": [ {"*.date": {"datetime": "GGE年M月D日"}}, {"*.delivery_date": {"datetime": "GGE年M月D日"}}, {"*.total": {"format": "###,###円"}}, {"*.sub_total": {"format": "###,###円"}}, {"*.tax": {"format": "###,###円"}}, {"body.table.*.[4:6]": {"format": "###,###円"}} ]
ここでは,日付と数値を表示しているフィールドの書式を指定しています。