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); }