JasperReportのPDF出力で、用紙の縦と横が混在したPDFを作成する
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);
}

