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

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

Field Reportsの使い方:単票(1) Hello World

今回から,Field Reports の使い方を説明させて頂きたいと思います。

まずは単純な1ページ構成の帳票を作成します。
開発言語は,Python 2.7 を使用します。

テンプレートの準備

最初にテンプレートの下絵として使用するPDFを作成します。
PDFを作成できればどんなアプリケーションでもよいですが,今回は OpenOffice.org の Calc を使用しました。

Calc で表示が固定されている部分のレイアウトを作成して,PDF形式で保存します。
f:id:fet:20110303110342p:image
次に,PDFを編集できるアプリケーションで作成したPDFを開いて,テキスト・フィールドを配置します。

今回は,Adobe Acrobat 8 Professional を使用しました。
Acrobat を使用する場合は,Professional版を使用する必要があります。Standard版ではフォーム・フィールドの配置ができませんので,ご注意ください。
Acrobat 以外にもフィールドの配置が可能なアプリケーションはいくつか存在するようですが,テーブル形式にフィールドを並べる機能を持っているアプリケーションは Acrobat しか見つかりませんでした。本格的な帳票を開発する際には,Acrobat をお勧めします。

テキスト・フィールドをひとつ配置して,名前を「name」としました。
f:id:fet:20110303110451p:image

ここで,フォント・フォントサイズなどの表示属性も設定します。
今回は,フォント「ヒラギノ角ゴ ProN W3」,フォントサイズ「自動」 としました。
f:id:fet:20110303110452p:image

Field Reports は,基本的にここで設定した表示属性どおりにPDFの外観を生成しますが,一部例外があります。

  • 「アクション」「フォーマット」「検証」「計算」の様な JavaScript を必要とする属性には対応していません。
  • 「リッチテキスト」には対応していません。
  • ボタン・フィールドでのラベル表示のような,利用頻度が低いと思われる一部の属性には未対応です。
  • 「均等割付」,パディングの指定の様に独自に拡張した表示属性があります。

フィールドの配置が終わったら,PDFファイルを保存します。
ここまでで,PDFテンプレートの準備は完了です。

Python プログラムの作成

次に,テンプレートを元にPDF帳票を作成する処理を Python で記述します。
以下に,今回作成したプログラムを示します。

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

from field import reports

param = {
    # テンプレート
    "template": "./hello.pdf",

    # フィールド値
    "context": {
        "name": "Field Reports へ",
    }
}

if __name__ == "__main__":
    reports.render(param, "out.pdf")

“from field import reports”で,field.reports 拡張モジュールをインポートします。

render() 関数は,第1引数にレンダリング・パラメータを,第2引数に出力するPDFファイル名を指定します。

レンダリング・パラメータでは,使用するテンプレートファイルのパス名,フィールドへ当てはめる値などのパラメータをひとつの辞書として渡します。

実行結果は,以下のとおりです。
f:id:fet:20110303110453p:image
デフォルトの動作では,フィールドに値を当てはめた後にフィールドと同じ外観の描画オブジェクトに置き換えていますので,テンプレートに配置した「name」フィールドは残っていません。

表示属性の設定

これだけでは何なので,表示属性を動的に変更する方法をご紹介します。

通常,表示色・フォントサイズ等の表示属性を変更したい場合は,Acrobat でテンプレートを再度開いてテキストフィールドのプロパティを変更すればよいのですが,特定の条件によって動的に表示属性を変えたい場合もあると思います。
そのようなケースを想定して,レンダリング・パラメータで表示属性を変更することができます。

単にテキストフィールドの値を指定する時は name 要素の値は文字列でしたが,表示属性と共に指定する場合は辞書形式で与えます。

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

from field import reports

param = {
    # テンプレート
    "template": "./hello.pdf",

    # フィールド値
    "context": {
        "name": {
            "value": "Field Reports へ",
            "color": "Red",
            "text-align": "Justify",
            "border-width": 2,
            "border-style": "Dashed",
            "padding": [10, 0, 10, 0],
        },
    }
}

if __name__ == "__main__":
    reports.render(param, "out2.pdf")

実行結果を以下に示します。
f:id:fet:20110303110454p:image