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

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

Field Reportsの使い方:単票(2) テーブルを含む帳票

今回は,テーブル形式のデータを持つ帳票(見積書)を作成します。

下絵の作成

前回同様,OpenOffice.org の Calc で帳票のデザインを作成しました。
これを,PDF形式にエクスポートします。
f:id:fet:20110304102822p:image

フィールドの配置

明細項目の部分が2次元のテーブルになっています。
このような場合は,

<フィールド名>.<行>.<列>

という命名規則でフィールドを並べます。<行>.<列>は,0始まりの整数とします。

手作業で並べるのは大変なので,Acrobatの「複数のフィールドを配置...」を使用します。
f:id:fet:20110304102824p:image

一発でぴったり枠にはめ込むのは難しいので,まずは必要な数のフィールドを生成して,位置やサイズは後で微調整します。
f:id:fet:20110304102825p:image

タテ・ヨコのフィールドを複数選択した上で,「整列」「分布」「サイズ」などのメニュー項目を活用して,きれいに並べます。

Acrobat のフィールドの再描画が非常に遅くちょっとイラッときますが,これぐらいの帳票であれば,慣れてくれば30分〜1時間ぐらいで作業できると思います。
f:id:fet:20110304102826p:image

“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, ...」という順に部分フィールド名が付けられている場合は,リストを使用することができます。

また,ボタン・フィールドの部分には,画像ファイルを指定しています。

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

おまけ

上のプログラムでは画像ファイルのパス名で印影イメージを指定していますが,dataストリーム形式で指定することもできます。

        "stamp1": {"icon": """data:image/x-bmp;base64,
Qk02NQAAAAAAADYAAAAoAAAARgAAAMD///8BABgAAAAAAAAAAAATCwAAEwsAAAAA
AAAAAAAA////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////bgD/////////////////////////////
////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////N1/+NpP9bfP8/
Zf82Xv9Daf9ph/+tvf/o7f//////////////////////////////////////////
//////////////////////////////////////////////////////////9uAP//
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
(中略)
////////////////////////////////////////////////bgA="""},

他にも,PDFテンプレートをdataストリーム形式で指定することができます。