17
votes

I have to prepare reports using five different sql queries. Each query will give out one report table.

So I wrote 5 jrxml files each corresponding to one of the above query with their own headings, title settings, footers, pagenumbers, etc.

Now, I am able to compile, print and export each of the above jrxmls into 5 different pdfs.

However, client wants all the reports collated into one single pdf. That is in the final pdf, first four pages will be say report one, next five pages report two, then report three and so on and so forth.

1) How to achieve this ?

2) Each report has page number as 1/4, 2/4, 3/4 etc. Where the second part i.e. the complete page number is evaluated with evaluation time as report. So when I will collate all reports in single pdf (if possible), will it also be possible to re-number the pages in justification to final pdf ?

Based on the answer below, I did the following in my java class and it works:

 try
            {
            JasperReport jreport1 = JasperCompileManager.compileReport(input1);
            JasperPrint jprint1 = JasperFillManager.fillReport(jreport1, new HashMap(), new JREmptyDataSource());
            //JasperExportManager.exportReportToPdfFile(jprint, "/home/ashutosh/Desktop/desktop/nikunj/JasperTestApp/output/mytest.pdf");

            JasperReport jreport2 = JasperCompileManager.compileReport(input2);
            JasperPrint jprint2 = JasperFillManager.fillReport(jreport2, new HashMap(), new JREmptyDataSource());

            JasperReport jreport3 = JasperCompileManager.compileReport(input3);
            JasperPrint jprint3 = JasperFillManager.fillReport(jreport3, new HashMap(), new JREmptyDataSource());

            List<JasperPrint> jprintlist = new ArrayList<JasperPrint>();

            jprintlist.add(jprint1);
            jprintlist.add(jprint2);
            jprintlist.add(jprint3);

            JRExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT_LIST, jprintlist);

            OutputStream output = new FileOutputStream(new File("/home/ashutosh/Desktop/desktop/nikunj/JasperTestApp/output/mytestbatch.pdf"));

            exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, output);
            exporter.exportReport();

            }catch(Exception e)
            {
                e.printStackTrace();
            }

Above: input1, input2, input3 are string paths to input jrxmls

Where my JRXML files just print three messages: Hello World 1, Hello World 2, Hello World 3.

 <?xml version="1.0"?>
<!DOCTYPE jasperReport
  PUBLIC "-//JasperReports//DTD Report Design//EN"
  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<jasperReport name="Simple_Report">
 <detail>
    <band height="20">
      <staticText>
        <reportElement x="180" y="0" width="200" height="20"/>
        <text><![CDATA[Hello World One!]]></text>
      </staticText>
    </band>
  </detail>
</jasperReport>

Thanks for reading!

5
Alex K's answer is good. You should also be able to get what you want by putting the individual reports into subreports of one master report. It will be more work, but it would allow you to handle the page numbering requirement. You should definitely vote for this as well. It would cover exactly what you are describing: jasperforge.org/projects/jasperreports/tracker/view.php?id=4178mdahlman

5 Answers

13
votes

You can take advantage of exporting the whole jasperprint list:

List jpList = new ArrayList();
jpList.add(JRLoader.loadObjectFromFile("build/reports/Report1.jrprint")); 
...
JRExporter exporter = new JRPdfExporter(); 
exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT_LIST, jpList); 
exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, stream); 
exporter.exportReport();
6
votes

This answer is to help users with JASPER REPORT VERSION >5.6 (latest versions), hence remove the deprecated code.

Since jasper-report 5.6 JRPdfExporterParameter.JASPER_PRINT_LIST is deprecated the current code of Wojtek Owczarczyk answer is:

List<JasperPrint> jpList = new ArrayList<>();
//add your JasperPrint's from loading jrprint or more 
//commonly filling report with JasperFillManager.fillReport 

JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(SimpleExporterInput.getInstance(jpList)); //Set as export input
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(stream)); //Set output stream
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
//set your configuration
exporter.setConfiguration(configuration);
exporter.exportReport();
1
votes

Page numbers without itext...

private void drawPageNumbers(List<JasperPrint> listJasperPrint, int totalPages) throws JRException {

    int pageCount = 0;
    int posY = 0;
    int posX = 0;

    for (JasperPrint jasperPrint : listJasperPrint) {

        if (jasperPrint.getOrientation() == JRReport.ORIENTATION_PORTRAIT) {
            posY = 805;
            posX = 472;
        }

        if (jasperPrint.getOrientation() == JRReport.ORIENTATION_LANDSCAPE) {
            posY = 558;
            posX = 717;
        }

        for (Object obj : jasperPrint.getPages()) {

            pageCount++;
            JRPrintPage page = (JRPrintPage) obj;

            JRPrintText textTotalPages = new JRTemplatePrintText(new JRTemplateText(
                    jasperPrint.getOrigins()[0], jasperPrint.getDefaultStyleProvider()));
            textTotalPages.setX(posX + 54);
            textTotalPages.setY(posY);
            textTotalPages.setWidth(40);
            textTotalPages.setHeight(16);
            textTotalPages.setText(" " + totalPages);
            page.addElement(textTotalPages);

            JRPrintText textPageNumber = new JRTemplatePrintText(new JRTemplateText(
                    jasperPrint.getOrigins()[0], jasperPrint.getDefaultStyleProvider()));
            textPageNumber.setX(posX);
            textPageNumber.setY(posY);
            textPageNumber.setWidth(80);
            textPageNumber.setHeight(16);
            textPageNumber.setText("Página " + pageCount + " de");
            page.addElement(textPageNumber);
        }
    }

    return;
}
0
votes

(iReport example)

Part I:

  • create a new blank jasper report as a wrapper report for different reports
  • data adapter = One empty record - Empty Rows
  • click "New..."
  • choose "empty rows"
  • click "next"
  • number of empty records = 1 (so you will simulate on record and only ONE detail band will be printed)
  • so the blank report is ready When you call this report out of your JAVA program, first open a data connection to the database and exchange this connection in the background. SubReports of our wrapper report can inherit this connection via parameters!

Part 2)

  • add for every report you want to embed a new detail band.
  • each detail band contains a subreport (link to the other standalone report of course)
  • set the property "run to bottom" to "True" in the subreport definition of our wrapper report

this concept works for me. depending on parameters, you can switch different bands on or off, of course.

0
votes

you can try this one

JasperPrint jp1 = JasperFillManager.fillReport(reportFile1,reportParams,Connection);  
JasperPrint jp2 = JasperFillManager.fillReport(reportFile2,reportParams,Connection);  
for (int j = 0; j < jp1.getPages().size(); j++) {  
    //Add First report to second report
    jp2.addPage((JRPrintPage) jp1.getPages().get(j));  
}