view 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 source
/** 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();

    }

}

http://dive4elements.wald.intevation.org