Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/common/JasperReporter.java @ 9005:460fcc128794
jasper multiple
author | gernotbelger |
---|---|
date | Tue, 17 Apr 2018 13:19:56 +0200 |
parents | |
children | 23945061daec |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/JasperReporter.java Tue Apr 17 13:19:56 2018 +0200 @@ -0,0 +1,128 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * Software engineering by + * Björnsen Beratende Ingenieure GmbH + * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.artifacts.common; + +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dive4elements.artifacts.common.utils.Config; + +import net.sf.jasperreports.engine.JRDataSource; +import net.sf.jasperreports.engine.JRException; +import net.sf.jasperreports.engine.JRExporterParameter; +import net.sf.jasperreports.engine.JasperCompileManager; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; +import net.sf.jasperreports.engine.JasperReport; +import net.sf.jasperreports.engine.design.JasperDesign; +import net.sf.jasperreports.engine.export.JRPdfExporter; +import net.sf.jasperreports.engine.export.JRPdfExporterParameter; +import net.sf.jasperreports.engine.util.JRProperties; +import net.sf.jasperreports.engine.xml.JRSaxParserFactory; +import net.sf.jasperreports.engine.xml.JRXmlLoader; + +/** + * @author Domenico Nardi Tironi + */ +public class JasperReporter { + + private final List<JasperDesigner> designs = new ArrayList<>(); + + private final Map<String, Object> parameters = new HashMap<>(); + + private final String confPath; + + public JasperReporter() { + this.confPath = Config.getConfigDirectory().toString(); + + this.parameters.put("ReportTitle", "Exported Data"); + } + + public JasperDesigner addReport(final String jasperFile, final MetaAndTableJRDataSource source) throws JRException { + + JRProperties.setProperty(JRSaxParserFactory.PROPERTY_REPORT_PARSER_FACTORY, JRReportSaxParserFactory.class.getName()); + + final String jasperPath = this.confPath + jasperFile; + final JasperDesign design = JRXmlLoader.load(jasperPath); + + final JasperDesigner designer = new JasperDesigner(design, source); + this.designs.add(designer); + + return designer; + } + + public void exportPDF(final OutputStream out) throws JRException { + + final List<JasperReport> compiledReports = new ArrayList<>(); + + final List<JRDataSource> sourcesWithPages = new ArrayList<>(); + + final List<JasperPrint> jasperPrintList = new ArrayList<>(); + + if (this.designs.size() == 1) { + final JasperDesigner designer = this.designs.get(0); + final JasperDesign jDesign = designer.getDesign(); + + final JasperReport compiled = JasperCompileManager.compileReport(jDesign); + compiledReports.add(compiled); + final MetaAndTableJRDataSource source = designer.getSource(); + final JasperPrint print = JasperFillManager.fillReport(compiled, this.parameters, source); + jasperPrintList.add(print); + } else { + + int totalpagesoffset = 0; + int pagesCount = 0; + + // erstes Rendern, um Seitenzahl zu ermitteln + for (final JasperDesigner designer : this.designs) { + + final JasperReport compiled = JasperCompileManager.compileReport(designer.getDesign()); + compiledReports.add(compiled); + final MetaAndTableJRDataSource source = designer.getSource(); + final JasperPrint print = JasperFillManager.fillReport(compiled, this.parameters, source); + + pagesCount = print.getPages().size(); + designer.setPagesCount(totalpagesoffset); + + totalpagesoffset += pagesCount; + } + totalpagesoffset = totalpagesoffset - pagesCount; // offset darf die letzten Seiten nicht beinhalten! + + // Sources mit pages machen + for (final JasperDesigner designer : this.designs) { + final JRDataSource sourceWithPages = designer.getSource().withPagePageOffsets(designer.getPagesCount(), totalpagesoffset); + sourcesWithPages.add(sourceWithPages); + } + + for (int i = 0; i < compiledReports.size(); i++) { + final JasperReport compiledReport = compiledReports.get(i); + final JRDataSource source = sourcesWithPages.get(i); + final JasperPrint print = JasperFillManager.fillReport(compiledReport, this.parameters, source); + jasperPrintList.add(print); + } + } + doExport(jasperPrintList, out); + } + + private void doExport(final List<JasperPrint> jasperPrintList, final OutputStream out) throws JRException { + final JRPdfExporter exporter = new JRPdfExporter(); + exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList); + exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out); + // this will make a bookmark in the exported PDF for each of the reports + exporter.setParameter(JRPdfExporterParameter.IS_CREATING_BATCH_MODE_BOOKMARKS, Boolean.TRUE); + + exporter.exportReport(); + + } + +} \ No newline at end of file