gernotbelger@9005: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9005: * Software engineering by gernotbelger@9005: * Björnsen Beratende Ingenieure GmbH gernotbelger@9005: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9005: * gernotbelger@9005: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9005: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9005: * documentation coming with Dive4Elements River for details. gernotbelger@9005: */ gernotbelger@9005: package org.dive4elements.river.artifacts.common; gernotbelger@9005: gernotbelger@9005: import java.io.OutputStream; gernotbelger@9005: import java.util.ArrayList; gernotbelger@9005: import java.util.HashMap; gernotbelger@9005: import java.util.List; gernotbelger@9005: import java.util.Map; gernotbelger@9005: gernotbelger@9005: import org.dive4elements.artifacts.common.utils.Config; gernotbelger@9005: gernotbelger@9005: import net.sf.jasperreports.engine.JRDataSource; gernotbelger@9005: import net.sf.jasperreports.engine.JRException; gernotbelger@9005: import net.sf.jasperreports.engine.JRExporterParameter; gernotbelger@9005: import net.sf.jasperreports.engine.JasperCompileManager; gernotbelger@9005: import net.sf.jasperreports.engine.JasperFillManager; gernotbelger@9005: import net.sf.jasperreports.engine.JasperPrint; gernotbelger@9005: import net.sf.jasperreports.engine.JasperReport; gernotbelger@9005: import net.sf.jasperreports.engine.design.JasperDesign; gernotbelger@9005: import net.sf.jasperreports.engine.export.JRPdfExporter; gernotbelger@9005: import net.sf.jasperreports.engine.export.JRPdfExporterParameter; gernotbelger@9005: import net.sf.jasperreports.engine.util.JRProperties; gernotbelger@9005: import net.sf.jasperreports.engine.xml.JRSaxParserFactory; gernotbelger@9005: import net.sf.jasperreports.engine.xml.JRXmlLoader; gernotbelger@9005: gernotbelger@9005: /** gernotbelger@9005: * @author Domenico Nardi Tironi gernotbelger@9005: */ gernotbelger@9005: public class JasperReporter { gernotbelger@9005: gernotbelger@9005: private final List designs = new ArrayList<>(); gernotbelger@9005: gernotbelger@9005: private final Map parameters = new HashMap<>(); gernotbelger@9005: gernotbelger@9005: private final String confPath; gernotbelger@9005: gernotbelger@9005: public JasperReporter() { gernotbelger@9005: this.confPath = Config.getConfigDirectory().toString(); gernotbelger@9005: gernotbelger@9005: this.parameters.put("ReportTitle", "Exported Data"); gernotbelger@9005: } gernotbelger@9005: gernotbelger@9005: public JasperDesigner addReport(final String jasperFile, final MetaAndTableJRDataSource source) throws JRException { gernotbelger@9005: gernotbelger@9005: JRProperties.setProperty(JRSaxParserFactory.PROPERTY_REPORT_PARSER_FACTORY, JRReportSaxParserFactory.class.getName()); gernotbelger@9005: gernotbelger@9005: final String jasperPath = this.confPath + jasperFile; gernotbelger@9005: final JasperDesign design = JRXmlLoader.load(jasperPath); gernotbelger@9005: gernotbelger@9005: final JasperDesigner designer = new JasperDesigner(design, source); gernotbelger@9005: this.designs.add(designer); gernotbelger@9005: gernotbelger@9005: return designer; gernotbelger@9005: } gernotbelger@9005: gernotbelger@9005: public void exportPDF(final OutputStream out) throws JRException { gernotbelger@9005: final List compiledReports = new ArrayList<>(); gernotbelger@9005: final List sourcesWithPages = new ArrayList<>(); gernotbelger@9005: final List jasperPrintList = new ArrayList<>(); gernotbelger@9005: if (this.designs.size() == 1) { gernotbelger@9005: final JasperDesigner designer = this.designs.get(0); gernotbelger@9005: final JasperDesign jDesign = designer.getDesign(); gernotbelger@9005: gernotbelger@9005: final JasperReport compiled = JasperCompileManager.compileReport(jDesign); gernotbelger@9005: compiledReports.add(compiled); gernotbelger@9005: final MetaAndTableJRDataSource source = designer.getSource(); gernotbelger@9005: final JasperPrint print = JasperFillManager.fillReport(compiled, this.parameters, source); gernotbelger@9005: jasperPrintList.add(print); gernotbelger@9005: } else { gernotbelger@9150: Integer totalpages = 0; gernotbelger@9005: gernotbelger@9005: // erstes Rendern, um Seitenzahl zu ermitteln gernotbelger@9005: for (final JasperDesigner designer : this.designs) { gernotbelger@9005: gernotbelger@9005: final JasperReport compiled = JasperCompileManager.compileReport(designer.getDesign()); gernotbelger@9005: compiledReports.add(compiled); gernotbelger@9005: final MetaAndTableJRDataSource source = designer.getSource(); gernotbelger@9005: final JasperPrint print = JasperFillManager.fillReport(compiled, this.parameters, source); gernotbelger@9005: gernotbelger@9150: final Integer pagesCount = print.getPages().size(); gernotbelger@9150: designer.setPagesCount(totalpages); gernotbelger@9005: gernotbelger@9150: totalpages += pagesCount; gernotbelger@9005: } gernotbelger@9005: gernotbelger@9005: // Sources mit pages machen gernotbelger@9005: for (final JasperDesigner designer : this.designs) { gernotbelger@9150: final JRDataSource sourceWithPages = designer.getSource().withPagePageOffsets(designer.getPagesCount(), totalpages); gernotbelger@9005: sourcesWithPages.add(sourceWithPages); gernotbelger@9005: } gernotbelger@9005: gernotbelger@9005: for (int i = 0; i < compiledReports.size(); i++) { gernotbelger@9005: final JasperReport compiledReport = compiledReports.get(i); gernotbelger@9005: final JRDataSource source = sourcesWithPages.get(i); gernotbelger@9005: final JasperPrint print = JasperFillManager.fillReport(compiledReport, this.parameters, source); gernotbelger@9005: jasperPrintList.add(print); gernotbelger@9005: } gernotbelger@9005: } gernotbelger@9005: doExport(jasperPrintList, out); gernotbelger@9005: } gernotbelger@9005: gernotbelger@9005: private void doExport(final List jasperPrintList, final OutputStream out) throws JRException { gernotbelger@9005: final JRPdfExporter exporter = new JRPdfExporter(); gernotbelger@9005: exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList); gernotbelger@9005: exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out); gernotbelger@9005: // this will make a bookmark in the exported PDF for each of the reports gernotbelger@9005: exporter.setParameter(JRPdfExporterParameter.IS_CREATING_BATCH_MODE_BOOKMARKS, Boolean.TRUE); gernotbelger@9005: gernotbelger@9005: exporter.exportReport(); gernotbelger@9005: gernotbelger@9005: } gernotbelger@9005: gernotbelger@9005: }