Приветствую! Пришлось мне столкнуться с задачей реализации отчета содержащего в себе страницы вертикальной (портретной) и горизонтальной (альбомной) ориентации одновременно.
Поиск по таким запросам выдал парочку результатов, и, конечно с первого раза ничего не получилось. Потратив несколько часов перебора вариантов кода добрался до рабочего варианта, что же, сразу к делу:
Для реализации понадобится отделить альбомные страницы от портретных.
1) Делим на N отчётов страницы. В моем случае получилось 2 отчета лежащих в одной директории (не обязательно): 1-ый отчет содержит портретные страницы, 2-ой отчет — альбомные.
2) Указать в коде генерации отчета параметры для JRPdfExporter. Я вывожу страницы в сервлете, в выходной поток, поэтому использую JRPdfExporterParameter.OUTPUT_STREAM с выводом в response.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
InputStream fs = context.getResourceAsStream("/reports/privatelist/HRPrivateList.jasper"); InputStream fs2 = context.getResourceAsStream("/reports/privatelist/HRPrivateList2.jasper"); JasperReport template = (JasperReport) JRLoader.loadObject(fs); JasperReport template2 = (JasperReport) JRLoader.loadObject(fs2); JasperPrint jasperPrint1 = JasperFillManager.fillReport(template, parameters, connection); LOGGER.debug("Merging document"); JasperPrint jasperPrint2 = JasperFillManager.fillReport(template2, parameters, connection); JRPdfExporter exp = new JRPdfExporter(); List list = new ArrayList(); list.add( jasperPrint1 ); list.add( jasperPrint2 ); exp.setParameter(JRPdfExporterParameter.JASPER_PRINT_LIST, list); exp.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, response.getOutputStream()); exp.exportReport(); |
Вот что должно получиться:
PS: Если нужно соединить несколько отчетов с одинаковой ориентацией, можно воспользоваться этим примером:
1 2 3 4 5 6 7 |
List pages = jasperPrint2.getPages(); for (int j = 0; j < pages.size(); j++) { JRPrintPage object = (JRPrintPage)pages.get(j); jasperPrint1.addPage(object); } data = JasperExportManager.exportReportToPdf(jasperPrint1); out.write(data); |
Код просто берёт страницы из второго отчета и помещает в первый. Удачи!
помогли, ответ оказался у своих…