JasperReportのPDF出力で、用紙の縦と横が混在したPDFを作成する

2010年5月17日

JasperReportsで複数のテンプレートを結合してPDFを出力する際に、最初に思いつくのはaddPageメソッドでページを追加してい くという方法だが、この方法だと用紙サイズ、用紙方向などが最初の用紙の設定でページが追加されるようで追加したページの設定が良くない。

そこで、少し面倒だが、各用紙の設定を維持したまま単一のPDF出力が出来るようにする
具体的には、JasperReportsのクラス で「JRPdfExporter」というのがあり、このクラスを使ってPDFを出力する

/*
 * runTestStream
 * reportNamesで渡されたテンプレートをもとに、PDFを作成し
 * データをbyte[]型で戻り値として返す
 * 
 * reportNames : jasperファイルの配列
 * paramMap    : jasperファイルを実行する時に渡すパラメータHash
 * 
 * */
public byte[] runTestStream(Array reportNames, HashMap paramMap) {
  Connection con = null;
  try {
    con = getConnection();

    // PDFのバイナリデータを保持
    ByteArrayOutputStream outStream = new ByteArrayOutputStream();

    JRPdfExporter jrPdfExporter = new JRPdfExporter();
    
    // PDFデータの出力先を設定
    jrPdfExporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outStream);
    
    List jasperReportList = new ArrayList();

    // ここで、jasperファイルからJasperPrintインスタンスを生成し、Listに格納
    for (int i = 0; i < Array.getLength(reportNames); i++) {
      String item = (String) Array.get(reportNames, i);

      JasperPrint tmpJasperReport = JasperFillManager.fillReport(item, paramMap, con);

      jasperReportList.add(tmpJasperReport);
    }

    // Listに追加したJasperPrintデータをJASPER_PRINT_LISTに設定する
    jrPdfExporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperReportList);
    
    // JASPER_PRINT_LISTに設定されたデータを元に、outStreamに出力
    jrPdfExporter.exportReport();

    //outStreamからbyte[]に変換して戻り値に返す
    return (outStream.toByteArray());

  } catch (JRException e) {
    e.printStackTrace();
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    closeConnection(con);
  }

  return (null);
}

JasperReports

Posted by GENDOSU