JasperReportsでパラメータとフィールドを使ってPDFを出力する

前回は、PDFのデザインとプログラムからの出力できるところまでやったので、今回は、変数をバインドしてPDFを作成します。
ですので、変数のバインド先をiReportで設定することと、プログラムで変数を引き渡すところが今回の趣旨になります。

パラメータの作成

Report InspectorのParametersから「追加parameter」を選択します。
https://lh4.googleusercontent.com/-A3I0R57hYy4/UN2CjiAk7qI/AAAAAAAAOAc/m0e5PiHAiVk/s800/01_iReport.jpg


パラメータのプロパティは以下のようになります。今回はブログタイトルを表示しようと思いますので、パラメータ名を[blog_title]としました。
https://lh4.googleusercontent.com/-vzLSueOxvWQ/UN2CaOySaGI/AAAAAAAAN_Y/lfmMj3rJ6DQ/s800/02_Jaspersoft%2520iReport%2520Designer%25205.0.0.jpg

name パラメータ名
Parameter Class パラメータの型
Use as a prompt チェックすることで、Preview時にパラメータの表示値を入力するダイアログが表示
Default Value Expression 初期値を設定
Description パラメータの説明文
Properties SQLを利用する場合の入力値を設定

パラメータの配置

パレットからText Fieldを配置して、プロパティのText Field Expressionの[…]を押下します。するとダイアログが表示され、バインドするパラメータを編集することができます。
https://lh3.googleusercontent.com/-ousWucgmk8g/UN2CbFtxEJI/AAAAAAAAN_g/rsFNj7EmacA/s640/03_%2524F%257Bfield%257D%2520-%2520Text%2520Field%2520Expression.jpg

フィールドの作成

フィールドは繰り返し表示するリストの項目を設定します。今回は、「日付」と「タイトル」を列とするリストを作成しました。
https://lh3.googleusercontent.com/-sI4LbKmhMqk/UN2Cbv8_PcI/AAAAAAAAN_o/BxhGujwjtkA/s640/04_Jaspersoft%2520iReport%2520Designer%25205.0.0-2.jpg

Beanを作成

リストのデータを引き渡すためのBeanを作成します。

public class RowBean {

 /** 日付 */
 private String date;
 /** タイトル */
 private String title;

 /* getter/setterは省略 */
}
クラスパスを設定

[iReport]-[環境設定]でオプションダイアログを起動します。[Classpath]タグから[Add Folder]を押下して、プロジェクトフォルダを追加します。
https://lh4.googleusercontent.com/-aksRSGTwI-I/UN2Cc39jWEI/AAAAAAAAN_4/oqnbKvmIR_I/s640/05_%25E3%2582%25AA%25E3%2583%2597%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%25B3.jpg

Report Queryを起動

デザインビューの上部にあるアイコンを押下します。
https://lh5.googleusercontent.com/-bW9IjTie2Ac/UN2CcVZOvGI/AAAAAAAAN_w/9GcGICMWGq0/s800/06_Jaspersoft%2520iReport%2520Designer%25205.0.0-3.jpg

Beanからフィールドを読み込む

Beanを読み込んでクラスメンバを表示して、フィールドに定義するクラスメンバを選択して[Add Selected Field(s)]を押下します。
https://lh3.googleusercontent.com/-9PJGh6WUef8/UN2CdoJrubI/AAAAAAAAOAA/ZRGXEJkIkDQ/s800/07_Report%2520query.jpg

これで、フィールドが追加されました。
https://lh5.googleusercontent.com/-p3A6zZ9VpOw/UN2CeHITeyI/AAAAAAAAOAI/rNdWWRYxWOY/s800/08_Jaspersoft%2520iReport%2520Designer%25205.0.0-4.jpg

フィールドの配置

パラメータの時と同様に、フィールドを配置します。
https://lh5.googleusercontent.com/-ECassqAu_ys/UN2Ceq-NDUI/AAAAAAAAOAQ/ECoil1zu_Po/s800/09_Jaspersoft%2520iReport%2520Designer%25205.0.0-5.jpg

PDF出力

ソースはこちら。

 @Execute(validator = false)
 public String param() throws JRException, IOException {

  String path = RequestUtil.getRequest().getSession().getServletContext()
    .getRealPath("/WEB-INF/templates/parameter_report.jasper");

  /* パラメータにバインドするデータ */
  Map<String, Object> param = new HashMap<String, Object>();
  param.put("blog_title", "DISってHONEY");
  
  /* フィールドにバインドするデータ */
  List<RowBean> fields = new ArrayList<RowBean>();
  RowBean rowBean1 = new RowBean();
  rowBean1.setDate("2012-12-25");
  rowBean1.setTitle("JasperReportを利用してSAStrutsでPDF出力するサンプル");
  fields.add(rowBean1);
  
  RowBean rowBean2 = new RowBean();
  rowBean2.setDate("2012-12-20");
  rowBean2.setTitle("PDF帳票作成にはこれ!JasperReportsで日本語(IPAexフォント)を使うまで");
  fields.add(rowBean2);
  
  byte[] bytes = JasperRunManager.runReportToPdf(path,
    param, new JRBeanCollectionDataSource(fields));

  HttpServletResponse response = ResponseUtil.getResponse();
  response.setContentType("application/pdf");
  response.setContentLength(bytes.length);
  OutputStream out = response.getOutputStream();
  out.write(bytes);
  out.flush();
  out.close();

  return null;
 }

ちょっとテキストが切れてますが、パラメータとフィールドを使ったPDF出力ができました。
https://lh3.googleusercontent.com/-gAryjT-L7e8/UN2CfA9xdSI/AAAAAAAAOAU/XOU1vx9_rfE/s640/10_param.jpg

まとめ

これで、作成できるPDF帳票の幅が広がりましたね(・∀・)