SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

続 Struts 2入門

Strutsプラグインで単体テストからレポート作成、共通デザインの作成まで
- JUnitプラグイン、JasperReportsプラグイン、Tilesプラグイン

続・Struts2入門(10)

  • X ポスト
  • このエントリーをはてなブックマークに追加

アプリケーションから動的にPDF帳票を作成する - JasperReportsプラグイン

 JasperReportsとは、JavaのアプリケーションでPDF帳票を出力するためのライブラリです。入手はJasperForgeより行います。

 JasperReportsプラグインはStruts 2で簡単に利用できるようにしたものです。JasperReportsを使ったテンプレート作成については「Java開発メモ - JasperReports」を参考にしてください。今回は、あらかじめJasperReports出力用ファイル(拡張子 jasper)を作成しておいたとします。出力ファイルに対してActionクラスでは、出力する内容を返すのみでPDFをブラウザで表示することができます。

 今回は、事前に登録してある住所録から郵便番号や住所などを出力するもので動作を確認してみます。Actionクラスは住所録のデータを取得し、JasperReportsへ渡します。ではそのActionクラスの例を見てみましょう。

リスト3 JasperReportsサンプルAction
@Namespace("/jasper")
@ParentPackage("jasperreports-default")
@Results( { 
    @Result(name = "success", 
            type = "jasper", 
            location = "/sample_report.jasper", 
            params = {"dataSource", "mysource" }),
        } )

public class JasperSampleAction extends ActionSupport {
    @Action("")
    public String execute() throws Exception {
        // PDF出力用のデータを取得
        mysource = createMySource();

        return "success";
    }

    public List<Map<String, Object>> createMySource() {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        
        // キー項目の作成
        String[] keys = { 
            "zip", "ken", "shi", "tyo", "kenkana", "shikana", "tyokana" };
        
        for (int i = 0; i < 10; i++) {
            // プロパティファイルからmysource.[番号]のテキストを取得
            String resource = getText("mysource." + i);

            StringTokenizer stk = new StringTokenizer(resource, ",");
            int position = 0;
            Map<String, Object> rowData = new HashMap<String, Object>();
            while (stk.hasMoreTokens()) {
                // 各プロパティファイルの最初の項目は数値なのでInteger、
                // それ以外はString。この定義は実際にJasperReports用の設定ファイルに従う。
                if (position == 0) {
                    rowData.put(keys[position], new Integer(stk.nextToken()));
                } else {
                    rowData.put(keys[position], stk.nextToken());
                }
                position++;
            }
            list.add(rowData);
        }
        return list;
    }
    
    private List<Map<String, Object>> mysource;
    public void setMysource(List<Map<String, Object>> mysource) {
        this.mysource = mysource;
    }
    public List<Map<String, Object>> getMysource() {
        return mysource;
    }
}

 データは以下のようにプロパティファイルで定義したものを使いました。この内容が出力されます。

リスト4 JasperReportsに出力するデータ
mysource.0=1234098,東京都,足立区,笹原,-,-,-
mysource.1=1238811,東京都,荒川区,柳田,-,-,-
mysource.2=1240098,東京都,板橋区,金剛町,-,-,-
mysource.3=1381765,東京都,あきる野市,三間木場,-,-,-
mysource.4=1403303,東京都,港区,芝浜,-,-,-
mysource.5=1572010,東京都,中央区,問屋町,-,-,-
mysource.6=2010822,神奈川県,横浜市,銀嶺町,-,-,-
mysource.7=1040515,東京都,品川区,北品川,-,-,-
mysource.8=1054570,東京都,大田区,森ヶ縁,-,-,-
mysource.9=4001234,山梨県,甲府市,躑躅ヶ岳,-,-,-

 なお、JasperReportsプラグインを使ったActionクラスには、次のルールに従います。

  • @ParentPackageには jasperreports-default またはこれを継承したパッケージを指定する
  • @Resultでtype="jasper"、locationにはjasperファイルの相対パス(例:"/sample_report.jasper")、params内で実際に渡す内容のオブジェクトを指定する

 @Result内のparamsで指定するパラメータでは、dataSourceの値を出力するActionクラスのフィールド名にします。

 ではサンプルを稼働させて実際にPDFを出力した結果を見てみましょう。http://127.0.0.1:8080/sample/jasper/ をブラウザで開いた結果は以下の図のようになります。実際に表示されるまでにPDFの出力と表示に少し時間がかかります。

図3 JasperReportsサンプルの出力画面
図3 JasperReportsサンプルの出力画面

注意点

 JasperReportsを使って日本語などマルチバイト文字を含んだPDFを出力する場合、テキスト出力ライブラリとフォントライブラリが別途必要になります。jasperreports.jar以外にもiText-rtf-2.1.7.jar、iTextAsian.jarが必須となりますのでlibフォルダへ追加しましょう。それぞれのダウンロードは、以下から行います。

次のページ
サイト共通デザインをテンプレート化する - Tilesプラグイン

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
続 Struts 2入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 東 浩二(アズマ コウジ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5661 2011/01/17 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング