17. JasperReportsでPDF出力

WebWork2ではJasperReportsという帳票ライブラリを使ってPDFファイルを出力することが出来ます。豊富なViewがあるのもWebWork2の特徴の一つです。

準備

以下の3つのライブラリを追加します。なおグラフを出力する場合はJFreeChartが必要になったり、Excelで出力する場合はJakartaPOIが必要になったりします。

  • itext.jar
  • iTextAsian.jar
  • jasperreports-x.x.x.jar(今回使用したのはjasperreports-0.6.8.jar)

xwork.xml

<action name="jasperTest"  class="ww2.examples.event.JasperTestAction">
  <result name="success" type="jasper">
    <param name="location">order.jasper</param>
    <param name="format">PDF</param>
    <param name="dataSource">orders</param>
    <param name="contentDisposition">attachment</param>
    <param name="documentName">orders</param>
  </result>
</action>
location(必須)
JasperReportsのテンプレート(中間ファイル)の場所。コンテキストパスからの相対パス
format(デフォルト=PDF)
出力フォーマット(PDF以外にはXLS,XML,HTML,CSV)
dataSource(必須)
レポート明細部のBeanのリストのフィールド名
contentDisposition(デフォルト=inline)
contentDispositionヘッダの内容
documentName
contentDispositionヘッダのファイル名(拡張子はformatによって決まるので上記の場合はorders.pdf)

JasperTestAction

public class JasperTestAction extends ActionSupport {
    private List orders = new ArrayList();

    public String execute() {
        Order order1 = new Order();
        order1.setName("注文1");
        order1.setPrice(2000);

        Order order2 = new Order();
        order2.setName("注文2");
        order2.setPrice(10000);

        orders.add(order1);
        orders.add(order2);

        return SUCCESS;
    }

    public List getOrders() {
        return orders;
    }

    public void setOrders(List test) {
        this.orders = test;
    }

    public static class Order {
        private String name;
        private int price;

        public int getPrice() {
            return price;
        }

        public void setPrice(int count) {
            this.price = count;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

レポートを出力するときには明細部にorders内のOrderの件数分表示されます。

レポートのデザイン

まずJasperReportsのレポートデザインをします。
直にXMLを書いても、ツールを使っても良いですが、ツールならiReport(http://ireport.sourceforge.net/)がおすすめです。
WebWork2のJasperReports連携の場合は、XMLのテンプレートではなく、テンプレートをコンパイルした中間ファイルを使うのですが、iReportならその中間ファイルを簡単に作ることが出来るためです。
iReportの詳しい説明はしませんが、日本語を出力する場合はiTextAsian.jarをlibに入れてフォントを日本語フォントに変えれば問題ないはずです。あと注意点として実行時に使うJasperReportsとiReportで使うJasperReportsのバージョンを同じにしないとエラーになるようです。iReportのJasperReportsのバージョンを変えたい場合はjasperreports.jarを削除して、使いたいバージョンのjasperreports-x.x.x.jarを入れればOKです。
JasperReporsのフィールドはデータソース(List)内のオブジェクトのプロパティで、パラメータはActionへのパラメータの値が格納されるようです。

結果

jasperTest.actionにアクセスすると、PDFが出力されるます。なおContent-Typeもformatに応じて自動でつきます(PDFの場合はapplication/pdf)