見積書(連続帳票)

複数枚構成の見積書のサンプルです。

ポイント

  • 明細テーブルの行数応じてページ数を増やすタイプの帳票を連続帳票と呼びます。
  • 連続帳票では,PDFテンプレートの名称を“*”とします。
  • “rows”エントリにより,テーブルの最大の行数を指定します。
  • context要素の値は,リスト(配列)形式になります。
  • tableの値としてテーブルの最大行数を超えるデータを与えると,自動的に必要なページ数に分割します。
  • フィールドに「複数行」の指定がなされている場合,文字列中の“\n”の位置で改行します。
  • 2ページ目以降の印影と備考欄を非表示にしています。
  • 1行おきに背景色を変えるstyle指定を行っています。

Python

#!/usr/bin/env python
# coding: utf-8

import sys
from field import reports

param = {
    # テンプレート
    "template": [
        {"*": {"src": "./mitumori.pdf", "rows": 10}}
    ],

    # フィールド値
    "context": [
        {
            "date": "${NOW}",
            "number": "10R0002",
            "to": "△△△惣菜株式会社",
            "title": "今週の献立",
            "delivery_date": "2011-03-01",
            "delivery_place": "貴社指定場所",
            "payment_terms": "銀行振込",
            "expiration_date": "発行から3ヶ月以内",
            "stamp1": {"icon": "./stamp.png"},
            "table": [
                [1, "N001", "豚肉", "200g", 230, 460],
                [2, "G001", "エビ", "16尾", 40, 640],
                [3, "Y001", "小松菜", "1束", 120, 120],
                [4, "Y002", "ミツバ", "2束", 30, 60],
                [5, "Y003", "ショウガ", "1かけ", 30, 30],
                [6, "Y004", "大根", "1本", 120, 120],
                [7, "Y005", "水煮コーン", "1缶", 130, 130],
                [8, "K001", "片栗粉", "1袋", 150, 150],
                [9, "K002", "コーンスープの元", "2袋", 40, 80],
                [10, "T001", "卵", "1パック", 140, 140],
                [11, "T002", "牛乳", "1本", 180, 180],
                [12, "M001", "絹ごし豆腐", "2丁", 60, 120],
                [13, "C001", "みりん", "大さじ2", "‐", "‐"],
                [14, "C002", "しょうゆ", "大さじ7", "‐", "‐"],
                [15, "C003", "酢", "大さじ4", "‐", "‐"],
                [16, "C004", "砂糖", "大さじ3", "‐", "‐"],
                [17, "C005", "コショウ", "少々", "‐", "‐"],
                [18, "C006", "粉山椒", "少々", "‐", "‐"],
                [19, "C007", "赤唐辛子", "1パック", 180, 180],
                [20, "C008", "ごま油", "大さじ2", "‐", "‐"],
                [21, "C009", "サラダ油", "大さじ4", "‐", "‐"],
                [22, "S001", "酒", "大さじ3", "‐", "‐"],
                [23, "O001", "ホットケーキミックス", "200g", 80, 160],
                [24, "O002", "だし汁", "300ml", "‐", "‐"]
            ],
            "sub_total": 2570,
            "tax": 128,
            "total": 2699,
            "remark": """エビと豆腐のショウガ炒め(4人分)
ミツバの卵とじ(4人分)
大根のピリ辛漬け(4人分)
コーンカップケーキ (4人分)"""
        }
    ],

    # スタイル指定
    "style": [
        {"*.date": {"datetime": "GGE年M月D日"}},
        {"*.delivery_date": {"datetime": "GGE年M月D日"}},
        {"*.total": {"format": "###,###円"}},
        {"*.sub_total": {"format": "###,###円"}},
        {"*.tax": {"format": "###,###円"}},
        {"*.table.*.[4:6]": {"format": "###,###円"}},
        {"[1:].stamp1": {"visible": False}},
        {"[1:].remark": {"visible": False}},
        {"*.table.[1::2]": {"background-color": [220, 220, 255]}}
    ]
}

if __name__ == "__main__":
    if len(sys.argv) == 2:
        reports.set_log_level(3)
        reports.render(param, sys.argv[1])
    else:
        print("usage: %s " % (sys.argv[0], ))

Ruby

#!/usr/bin/env ruby
# coding: utf-8

require 'rubygems'
require 'field/reports'

$param = {
    # テンプレート
    "template" => [
        {"*" => {"src" => "./mitumori.pdf", "rows" => 10}}
    ],

    # フィールド値
    "context" => [
        {
            "date" => "${NOW}",
            "number" => "10R0002",
            "to" => "△△△惣菜株式会社",
            :title => "今週の献立",
            "delivery_date" => "2011-03-01",
            "delivery_place" => "貴社指定場所",
            "payment_terms" => "銀行振込",
            "expiration_date" => "発行から3ヶ月以内",
            "stamp1" => {"icon" => "./stamp.png"},
            "table" => [
                [1, "N001", "豚肉", "200g", 230, 460],
                [2, "G001", "エビ", "16尾", 40, 640],
                [3, "Y001", "小松菜", "1束", 120, 120],
                [4, "Y002", "ミツバ", "2束", 30, 60],
                [5, "Y003", "ショウガ", "1かけ", 30, 30],
                [6, "Y004", "大根", "1本", 120, 120],
                [7, "Y005", "水煮コーン", "1缶", 130, 130],
                [8, "K001", "片栗粉", "1袋", 150, 150],
                [9, "K002", "コーンスープの元", "2袋", 40, 80],
                [10, "T001", "卵", "1パック", 140, 140],
                [11, "T002", "牛乳", "1本", 180, 180],
                [12, "M001", "絹ごし豆腐", "2丁", 60, 120],
                [13, "C001", "みりん", "大さじ2", "‐", "‐"],
                [14, "C002", "しょうゆ", "大さじ7", "‐", "‐"],
                [15, "C003", "酢", "大さじ4", "‐", "‐"],
                [16, "C004", "砂糖", "大さじ3", "‐", "‐"],
                [17, "C005", "コショウ", "少々", "‐", "‐"],
                [18, "C006", "粉山椒", "少々", "‐", "‐"],
                [19, "C007", "赤唐辛子", "1パック", 180, 180],
                [20, "C008", "ごま油", "大さじ2", "‐", "‐"],
                [21, "C009", "サラダ油", "大さじ4", "‐", "‐"],
                [22, "S001", "酒", "大さじ3", "‐", "‐"],
                [23, "O001", "ホットケーキミックス", "200g", 80, 160],
                [24, "O002", "だし汁", "300ml", "‐", "‐"]
            ],
            "sub_total" => 2570,
            "tax" => 128,
            "total" => 2699,
            "remark" => "エビと豆腐のショウガ炒め(4人分)
ミツバの卵とじ(4人分)
大根のピリ辛漬け(4人分)
コーンカップケーキ (4人分)"
        }
    ],

    # スタイル指定
    "style" => [
        {"*.date" => {"datetime" => "GGE年M月D日", :color => :Red}},
        {"*.delivery_date" => {"datetime" => "GGE年M月D日"}},
        {"*.total" => {"format" => "###,###円"}},
        {"*.sub_total" => {"format" => "###,###円"}},
        {"*.tax" => {"format" => "###,###円"}},
        {"*.table.*.[4:6]" => {"format" => "###,###円"}},
        {"[1:].stamp1" => {"visible" => false}},
        {"[1:].remark" => {"visible" => false}},
        {"*.table.[1::2]" => {"background-color" => [220, 220, 255]}}
    ]
}

if ARGV.length == 1 then
    Field::Reports.set_log_level(3)
    Field::Reports.render($param, ARGV[0])
else
    p "usage: %s " % $0
end

Perl

#!/usr/bin/env perl
# coding: utf-8

use utf8;
use Field::Reports;

my $param = {
    # テンプレート
    "template" => [
        {"*" => {"src" => "./mitumori.pdf", "rows" => 10}}
    ],

    # フィールド値
    "context" => [
        {
            "date" => "\${NOW}",
            "number" => "10R0002",
            "to" => "△△△惣菜株式会社",
            "title" => "今週の献立",
            "delivery_date" => "2011-03-01",
            "delivery_place" => "貴社指定場所",
            "payment_terms" => "銀行振込",
            "expiration_date" => "発行から3ヶ月以内",
            "stamp1" => {"icon" => "./stamp.png"},
            "table" => [
                [1, "N001", "豚肉", "200g", 230, 460],
                [2, "G001", "エビ", "16尾", 40, 640],
                [3, "Y001", "小松菜", "1束", 120, 120],
                [4, "Y002", "ミツバ", "2束", 30, 60],
                [5, "Y003", "ショウガ", "1かけ", 30, 30],
                [6, "Y004", "大根", "1本", 120, 120],
                [7, "Y005", "水煮コーン", "1缶", 130, 130],
                [8, "K001", "片栗粉", "1袋", 150, 150],
                [9, "K002", "コーンスープの元", "2袋", 40, 80],
                [10, "T001", "卵", "1パック", 140, 140],
                [11, "T002", "牛乳", "1本", 180, 180],
                [12, "M001", "絹ごし豆腐", "2丁", 60, 120],
                [13, "C001", "みりん", "大さじ2", "‐", "‐"],
                [14, "C002", "しょうゆ", "大さじ7", "‐", "‐"],
                [15, "C003", "酢", "大さじ4", "‐", "‐"],
                [16, "C004", "砂糖", "大さじ3", "‐", "‐"],
                [17, "C005", "コショウ", "少々", "‐", "‐"],
                [18, "C006", "粉山椒", "少々", "‐", "‐"],
                [19, "C007", "赤唐辛子", "1パック", 180, 180],
                [20, "C008", "ごま油", "大さじ2", "‐", "‐"],
                [21, "C009", "サラダ油", "大さじ4", "‐", "‐"],
                [22, "S001", "酒", "大さじ3", "‐", "‐"],
                [23, "O001", "ホットケーキミックス", "200g", 80, 160],
                [24, "O002", "だし汁", "300ml", "‐", "‐"]
            ],
            "sub_total" => 2570,
            "tax" => 128,
            "total" => 2699,
            "remark" => "エビと豆腐のショウガ炒め(4人分)
ミツバの卵とじ(4人分)
大根のピリ辛漬け(4人分)
コーンカップケーキ (4人分)"
        }
    ],

    # スタイル指定
    "style" => [
        {"*.date" => {"datetime" => "GGE年M月D日", "color" => "Red"}},
        {"*.delivery_date" => {"datetime" => "GGE年M月D日"}},
        {"*.total" => {"format" => "###,###円"}},
        {"*.sub_total" => {"format" => "###,###円"}},
        {"*.tax" => {"format" => "###,###円"}},
        {"*.table.*.[4:6]" => {"format" => "###,###円"}},
        {"[1:].stamp1" => {"visible" => "False"}},
        {"[1:].remark" => {"visible" => "False"}},
        {"*.table.[1::2]" => {"background-color" => [220, 220, 255]}}
    ]
};

if (@ARGV == 1) {
    Field::Reports::set_log_level(3);
    Field::Reports::render($param, $ARGV[0]);
} else {
    die "usage: $0 \n";
}

PHP

<?php
$param = array(
    # テンプレート
    "template" => array(
        array("*" => array("src" => "./mitumori.pdf", "rows" => 10))
    ),

    # フィールド値
    "context" => array(
        array(
            "date" => "\${NOW}",
            "number" => "10R0002",
            "to" => "△△△惣菜株式会社",
            "title" => "今週の献立",
            "delivery_date" => "2011-03-01",
            "delivery_place" => "貴社指定場所",
            "payment_terms" => "銀行振込",
            "expiration_date" => "発行から3ヶ月以内",
            "stamp1" => array("icon" => "./stamp.png"),
            "table" => array(
                array(1, "N001", "豚肉", "200g", 230, 460),
                array(2, "G001", "エビ", "16尾", 40, 640),
                array(3, "Y001", "小松菜", "1束", 120, 120),
                array(4, "Y002", "ミツバ", "2束", 30, 60),
                array(5, "Y003", "ショウガ", "1かけ", 30, 30),
                array(6, "Y004", "大根", "1本", 120, 120),
                array(7, "Y005", "水煮コーン", "1缶", 130, 130),
                array(8, "K001", "片栗粉", "1袋", 150, 150),
                array(9, "K002", "コーンスープの元", "2袋", 40, 80),
                array(10, "T001", "卵", "1パック", 140, 140),
                array(11, "T002", "牛乳", "1本", 180, 180),
                array(12, "M001", "絹ごし豆腐", "2丁", 60, 120),
                array(13, "C001", "みりん", "大さじ2", "‐", "‐"),
                array(14, "C002", "しょうゆ", "大さじ7", "‐", "‐"),
                array(15, "C003", "酢", "大さじ4", "‐", "‐"),
                array(16, "C004", "砂糖", "大さじ3", "‐", "‐"),
                array(17, "C005", "コショウ", "少々", "‐", "‐"),
                array(18, "C006", "粉山椒", "少々", "‐", "‐"),
                array(19, "C007", "赤唐辛子", "1パック", 180, 180),
                array(20, "C008", "ごま油", "大さじ2", "‐", "‐"),
                array(21, "C009", "サラダ油", "大さじ4", "‐", "‐"),
                array(22, "S001", "酒", "大さじ3", "‐", "‐"),
                array(23, "O001", "ホットケーキミックス", "200g", 80, 160),
                array(24, "O002", "だし汁", "300ml", "‐", "‐")
            ),
            "sub_total" => 2570,
            "tax" => 128,
            "total" => 2699,
            "remark" => "エビと豆腐のショウガ炒め(4人分)
ミツバの卵とじ(4人分)
大根のピリ辛漬け(4人分)
コーンカップケーキ (4人分)"
        )
    ),

    # スタイル指定
    "style" => array(
        array("*.date" => array("datetime" => "GGE年M月D日", "color" => "Red")),
        array("*.delivery_date" => array("datetime" => "GGE年M月D日")),
        array("*.total" => array("format" => "###,###円")),
        array("*.sub_total" => array("format" => "###,###円")),
        array("*.tax" => array("format" => "###,###円")),
        array("*.table.*.[4:6]" => array("format" => "###,###円")),
        array("[1:].stamp1" => array("visible" => "False")),
        array("[1:].remark" => array("visible" => "False")),
        array("*.table.[1::2]" => array("background-color" => array(220, 220, 255)))
    )
);

fr_set_log_level(3);
fr_render($param, $argv[1]);
?>

実行結果