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

http://dive4elements.wald.intevation.org