FIELD NOTES: 書を持って街へ出よう

合同会社フィールドワークス プログラマ兼代表のブログ

Field Reportsの使い方:複合帳票

今回は,表紙付きの請求書を作成します。
復数のテンプレートを組み合わせて作る帳票を複合帳票と呼んでいます。

テンプレートの作成

表紙のテンプレートを作成します。
前回と同様に,OpenOffice.orgで下絵を作成し,Acrobatでフィールドを配置しました。

請求書明細部分のテンプレートは,前回のものをそのまま使用します。
f:id:fet:20110305183325p:image

プログラムの作成

作成したプログラムは,以下のとおりです。

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")

完成した帳票を以下に示します。
f:id:fet:20110305183326p:image

環境変数

プログラム中の「 ${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": "###,###円"}}
    ]

ここでは,日付と数値を表示しているフィールドの書式を指定しています。