Reputation: 17375
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!
Upvotes: 17
Views: 27721
Reputation: 1416
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));
}
Upvotes: 1
Reputation: 21710
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();
Upvotes: 8
Reputation: 1
(iReport example)
Part I:
Part 2)
this concept works for me. depending on parameters, you can switch different bands on or off, of course.
Upvotes: 0
Reputation: 29
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;
}
Upvotes: 1
Reputation: 5735
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();
Upvotes: 13