Concatenating many reports in a single one (eg: a single PDF) can be a hard task. Using DynamicJasper it is really easy get reports of different nature in a single one.
Useful examples:
Test | Sample PDF |
ar.com.fdvs.dj.test.subreport.ConcatenatedReportTest Creates a single PDF that concatenates 3 reports |
download |
DynamicReport dynamicReport = createSubreport1(); drb.addConcatenatedReport( dynamicReport, new ClassicLayoutManager(), "statistics", DJConstants.SUBREPORT_DATA_SOURCE_ORIGIN_PARAMETER, DJConstants.DATA_SOURCE_TYPE_COLLECTION); params.put("statistics", getStatisticsList() );
dynamicReport: A DynamicReport object to use as a subreport. In this example we create it in the call to createHeaderSubreport()
LayOutManager: Since the subreport is going to be a DynamicReport, a LayOutManager is needed
path to the data source: A string that points to the data source.
origin of the data source: A constant from DJConstants class which can be: SUBREPORT_DATA_SOURCE_ORIGIN_FIELD or SUBREPORT_DATA_SOURCE_ORIGIN_PARAMETER, it just tells the subreport where to look for the data source (the parameters map, or if its a property of the current row)
For example, if path to the data source is “statistics” and origin of the data source is SUBREPORT_DATA_SOURCE_ORIGIN_PARAMETER, then it will look in the parameters map for an object under the key of “statistics”, on the other hand if we pass SUBREPORT_DATA_SOURCE_ORIGIN_FIELD, in the current row, there must be a property with the name “statistics” that returns an object of the type DATA_SOURCE_TYPE_<XXX>
type of the data source: A constant from DJConstants class, all types constants has a name like DATA_SOURCE_TYPE_<XXX>, where <XXX> represents the type. Most known types are java.sql.ResultSet, Collection, Array, Xml, etc.
There are other flavors for the concatenated reports, like passing an already compiled jasperReport object