2011年12月3日土曜日

PlayframeworkのPDFモジュール

Play! framework Advent Calendarの14日目の記事です。

Advent Calendarといえば、クリスマスをターゲットとしたイベントですが、クリスマスが終わればもうお正月。

ということで、PDFモジュールを使っておみくじを作りました。

PDFモジュールの使い方は簡単です。

% play install pdf

とコマンドを打てば、インストールされます。
あとは、他のモジュールと同じようにapplication.confに書くか、dependencies.ymlに追記してdependenciesコマンドを叩きます。

実際に使用する場合は、

import static play.modules.pdf.PDF.*;

とimportします。

以下、おみくじアプリのコードです。

package controllers;

import play.*;
import play.mvc.*;
import java.util.*;
import models.*;

import static play.modules.pdf.PDF.*;

public class Application extends Controller {

    public static void index() {
        Options options = new Options();
        options.filename = "omikuji";

        String result = getResult();

        renderPDF(options, result);
    }

    private static String getResult(){
      String[] kuji = {"Daikichi", "Chukichi", "Kichi", "Shokichi", "Kyo", "Daikyo"};
      Random rnd = new Random();
      int index = rnd.nextInt(kuji.length);
      return kuji[index];
    }
}

実際にPDF出力する実装は、通常render()とする箇所をrenderPDF()と書いているだけです。第一引数のoptionsは、PDF出力の際の各種オプションを設定することができ、今回はファイル名を定義しています。
その他のオプションについてはこちらを参照してください。
http://www.playframework.org/modules/pdf-0.7/home

viewのコードを見ていただくとわかるのですが、cssも普通に反映されます。

#{extends 'main.html' /}
#{set title:'Home' /}

<style type="text/css">
<!--
.omikuji{
    text-align:center;
    margin:0px auto;
    background-color:#FFCC5A;
    border-color:#660000;
    border-width:2px;
    border-style:solid;
    width:150px;
    height:100px;
    display:block;
}
-->
</style>

<div class="omikuji">
  Your fortune is <b>&{result}</b> !!
</div>

今回の実装で一点詰まった箇所がありまして、コードを見ていただくと分かるのですが、おみくじの結果が"Daikichi"のように少し不自然な形になっています。
本来は"大吉"としたかったのですが、日本語のフォントに対応していないようで、レンダリングされませんでした。

heroku上でこのアプリを実際に動かしていただくことができます。
http://quiet-beach-8560.herokuapp.com/
アクセスするといきなり結果がPDFで出力されますのでご注意ください。

ソースコードはこちら。
https://github.com/daiksy/PlayAdvent


ちなみに、RenderPDF()をRender()と書き換えると、このように動きます。
http://pure-ocean-8055.herokuapp.com/


それでは、少し気が早いですが、来年の運勢など占ってはいかがでしょうか?

次は @arahaya さんです。


0 件のコメント:

コメントを投稿