comparison 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
comparison
equal deleted inserted replaced
9004:4635872e7117 9005:460fcc128794
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
2 * Software engineering by
3 * Björnsen Beratende Ingenieure GmbH
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
5 *
6 * This file is Free Software under the GNU AGPL (>=v3)
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
8 * documentation coming with Dive4Elements River for details.
9 */
10 package org.dive4elements.river.artifacts.common;
11
12 import java.io.OutputStream;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.List;
16 import java.util.Map;
17
18 import org.dive4elements.artifacts.common.utils.Config;
19
20 import net.sf.jasperreports.engine.JRDataSource;
21 import net.sf.jasperreports.engine.JRException;
22 import net.sf.jasperreports.engine.JRExporterParameter;
23 import net.sf.jasperreports.engine.JasperCompileManager;
24 import net.sf.jasperreports.engine.JasperFillManager;
25 import net.sf.jasperreports.engine.JasperPrint;
26 import net.sf.jasperreports.engine.JasperReport;
27 import net.sf.jasperreports.engine.design.JasperDesign;
28 import net.sf.jasperreports.engine.export.JRPdfExporter;
29 import net.sf.jasperreports.engine.export.JRPdfExporterParameter;
30 import net.sf.jasperreports.engine.util.JRProperties;
31 import net.sf.jasperreports.engine.xml.JRSaxParserFactory;
32 import net.sf.jasperreports.engine.xml.JRXmlLoader;
33
34 /**
35 * @author Domenico Nardi Tironi
36 */
37 public class JasperReporter {
38
39 private final List<JasperDesigner> designs = new ArrayList<>();
40
41 private final Map<String, Object> parameters = new HashMap<>();
42
43 private final String confPath;
44
45 public JasperReporter() {
46 this.confPath = Config.getConfigDirectory().toString();
47
48 this.parameters.put("ReportTitle", "Exported Data");
49 }
50
51 public JasperDesigner addReport(final String jasperFile, final MetaAndTableJRDataSource source) throws JRException {
52
53 JRProperties.setProperty(JRSaxParserFactory.PROPERTY_REPORT_PARSER_FACTORY, JRReportSaxParserFactory.class.getName());
54
55 final String jasperPath = this.confPath + jasperFile;
56 final JasperDesign design = JRXmlLoader.load(jasperPath);
57
58 final JasperDesigner designer = new JasperDesigner(design, source);
59 this.designs.add(designer);
60
61 return designer;
62 }
63
64 public void exportPDF(final OutputStream out) throws JRException {
65
66 final List<JasperReport> compiledReports = new ArrayList<>();
67
68 final List<JRDataSource> sourcesWithPages = new ArrayList<>();
69
70 final List<JasperPrint> jasperPrintList = new ArrayList<>();
71
72 if (this.designs.size() == 1) {
73 final JasperDesigner designer = this.designs.get(0);
74 final JasperDesign jDesign = designer.getDesign();
75
76 final JasperReport compiled = JasperCompileManager.compileReport(jDesign);
77 compiledReports.add(compiled);
78 final MetaAndTableJRDataSource source = designer.getSource();
79 final JasperPrint print = JasperFillManager.fillReport(compiled, this.parameters, source);
80 jasperPrintList.add(print);
81 } else {
82
83 int totalpagesoffset = 0;
84 int pagesCount = 0;
85
86 // erstes Rendern, um Seitenzahl zu ermitteln
87 for (final JasperDesigner designer : this.designs) {
88
89 final JasperReport compiled = JasperCompileManager.compileReport(designer.getDesign());
90 compiledReports.add(compiled);
91 final MetaAndTableJRDataSource source = designer.getSource();
92 final JasperPrint print = JasperFillManager.fillReport(compiled, this.parameters, source);
93
94 pagesCount = print.getPages().size();
95 designer.setPagesCount(totalpagesoffset);
96
97 totalpagesoffset += pagesCount;
98 }
99 totalpagesoffset = totalpagesoffset - pagesCount; // offset darf die letzten Seiten nicht beinhalten!
100
101 // Sources mit pages machen
102 for (final JasperDesigner designer : this.designs) {
103 final JRDataSource sourceWithPages = designer.getSource().withPagePageOffsets(designer.getPagesCount(), totalpagesoffset);
104 sourcesWithPages.add(sourceWithPages);
105 }
106
107 for (int i = 0; i < compiledReports.size(); i++) {
108 final JasperReport compiledReport = compiledReports.get(i);
109 final JRDataSource source = sourcesWithPages.get(i);
110 final JasperPrint print = JasperFillManager.fillReport(compiledReport, this.parameters, source);
111 jasperPrintList.add(print);
112 }
113 }
114 doExport(jasperPrintList, out);
115 }
116
117 private void doExport(final List<JasperPrint> jasperPrintList, final OutputStream out) throws JRException {
118 final JRPdfExporter exporter = new JRPdfExporter();
119 exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
120 exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
121 // this will make a bookmark in the exported PDF for each of the reports
122 exporter.setParameter(JRPdfExporterParameter.IS_CREATING_BATCH_MODE_BOOKMARKS, Boolean.TRUE);
123
124 exporter.exportReport();
125
126 }
127
128 }

http://dive4elements.wald.intevation.org