Java 合并两份Jasper报告

Java 合并两份Jasper报告,java,pdf,jasper-reports,Java,Pdf,Jasper Reports,我有一个带有下拉菜单的web应用程序,用户可以从中选择报告的类型,即。报告1、报告2、报告3等 根据选择的报告,Jasper报告将在服务器上编译,并以PDF格式的弹出窗口打开 在服务器端,我使用以下代码(例如report1)以单独的方法实现每个报告: JRBeanCollectionDataSource report1DataSource=新的JRBeanCollectionDataSource(resultSetBeanListReport1); InputStream inputStream

我有一个带有下拉菜单的web应用程序,用户可以从中选择报告的类型,即。报告1、报告2、报告3等

根据选择的报告,Jasper报告将在服务器上编译,并以PDF格式的弹出窗口打开

在服务器端,我使用以下代码(例如report1)以单独的方法实现每个报告:

JRBeanCollectionDataSource report1DataSource=新的JRBeanCollectionDataSource(resultSetBeanListReport1);
InputStream inputStreamReport1=新文件InputStream(request.getSession().getServletContext().getRealPath(jrxmlFilePath+“report1.jrxml”);
JasperDesign jasperDesignReport1=JRXmlLoader.load(inputStreamReport1);
JasperReport jasperReportReport1=JasperCompileManager.compileReport(jasperDesignReport1);

bytes=JasperRunManager.runReportToPdf(jasperReportReport1,titleMapReport1,report1DataSource);
类似地,report2位于单独的方法中,代码如下:

JRBeanCollectionDataSource invstsummadatasource=新的JRBeanCollectionDataSource(resultSetBeanListInvstOfSumm);
InputStream inputStreamInvstSumm=新文件InputStream(request.getSession().getServletContext().getRealPath(jrxmlFilePath+“investSummary.jrxml”);
JasperDesign jasperDesignInvstSumm=JRXmlLoader.load(inputStreamInvstSumm);
JasperReport jasperReportInvstSumm=JasperCompileManager.compileReport(jasperDesignInvstSumm);

bytes=JasperRunManager.runReportToPdf(jasperreportinvstssumm,titlemapinvstssumm,invstsummadatasource);
现在我有一个要求,如果从下拉列表中选择report1,那么生成的PDF应该在同一个PDF中逐个包含所有报告


如何合并以上两行代码以最终生成单个PDF?

您可以在使用
JasperPrint
生成PDF之前或在使用iText生成PDF之后合并报告

对于
JasperPrint
解决方案:您将生成2个(或更多)
JasperPrint
s,然后获取内容页并对其进行压缩

JasperPrint jp1=JasperFillManager.fillReport(url.openStream(),参数,
新的JRBeanCollectionDataSource(inspBean));
JasperPrint jp2=JasperFillManager.fillReport(url.openStream(),参数,
新的JRBeanCollectionDataSource(inspBean));
List pages=jp2.getPages();
对于(int j=0;j
对于生成PDF后的iText解决方案:

void concatPDFs(列出流PDF文件、输出流OutputStream、布尔分页){
文档=新文档();
试一试{
列出PDF=StreamofPDF文件;
列表读取器=新的ArrayList();
int totalPages=0;
迭代器迭代器DFS=pdfs.Iterator();
//为PDF创建读卡器。
while(iteratorPDFs.hasNext()){
InputStream pdf=iteratorPDFs.next();
PdfReader PdfReader=新PdfReader(pdf);
readers.add(pdfReader);
totalPages+=pdfReader.getNumberOfPages();
}
//为outputstream创建写入程序
PdfWriter writer=PdfWriter.getInstance(文档,outputStream);
document.open();
BaseFont bf=BaseFont.createFont(BaseFont.HELVETICA、BaseFont.CP1252、BaseFont.NOT_EMBEDDED);
PdfContentByte cb=writer.getDirectContent();//保存PDF文件
//资料
PDF导入页面;
int currentPageNumber=0;
int pageOfCurrentReaderPDF=0;
Iterator IteratorPDReader=readers.Iterator();
//循环浏览PDF文件并添加到输出中。
while(iteratorPDReader.hasNext()){
PdfReader PdfReader=iteratorpdfreeader.next();
//在目标中为每个源页面创建一个新页面。
而(pageOfCurrentReaderPDF
以下是组合多个jasper打印的示例代码

List<JasperPrint> jasperPrints = new ArrayList<JasperPrint>();
// Your code to get Jasperreport objects
JasperReport jasperReportReport1 = JasperCompileManager.compileReport(jasperDesignReport1);
jasperPrints.add(jasperReportReport1);
JasperReport jasperReportReport2 = JasperCompileManager.compileReport(jasperDesignReport2);
jasperPrints.add(jasperReportReport2);
JasperReport jasperReportReport3 = JasperCompileManager.compileReport(jasperDesignReport3);
jasperPrints.add(jasperReportReport3);

JRPdfExporter exporter = new JRPdfExporter();
//Create new FileOutputStream or you can use Http Servlet Response.getOutputStream() to get Servlet output stream
// Or if you want bytes create ByteArrayOutputStream
ByteArrayOutputStream out = new ByteArrayOutputStream();
exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrints);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
exporter.exportReport();
byte[] bytes = out.toByteArray();
List jasperPrints=new ArrayList();
//获取Jasperreport对象的代码
JasperReport jasperReportReport1=JasperCompileManager.compileReport(jasperDesignReport1);
jasperPrints.add(JasperReport1);
JasperReport jasperReportReport2=JasperCompileManager.compileReport(jasperDesignReport2);
jasperPrints.add(JasperReport2);
JasperReport jasperReportReport3=JasperCompileManager.compileReport(jasperDesignReport3);
jasperPrints.add(JasperReport3);
JRPdfExporter exporter=新的JRPdfExporter();
//创建新的FileOutputStream,或者您可以使用Http Servlet Response.getOutputStream()获取Servlet输出流
//或者,如果需要字节,请创建ByteArrayOutputStream
ByteArrayOutputStream out=新建ByteArrayOutputStream();
exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST,jasperPrints);
exporter.setParameter(JRExporterParameter.OUTPUT_流,out);
出口商。出口报告();
byte[]bytes=out.toByteArray();

此答案旨在帮助用户使用最新版本的Jasper Report。在里面 接受答案 已弃用
Map<String, Object> paramMap = new HashMap<String, Object>();
List<JasperPrint> jasperPrintList = new ArrayList<JasperPrint>();
JasperPrint jasperPrint1 = JasperFillManager.fillReport(report1, paramMap);
jasperPrintList.add(jasperPrint1);
JasperPrint jasperPrint2 = JasperFillManager.fillReport(report2, paramMap);
jasperPrintList.add(jasperPrint2);

JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList)); //Set as export input my list with JasperPrint s
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("pdf/output.pdf")); //or any other out streaam
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
configuration.setCreatingBatchModeBookmarks(true); //add this so your bookmarks work, you may set other parameters
exporter.setConfiguration(configuration);
exporter.exportReport();
String reportDir = Util.getReportDirectory() // my report directory
Map reportParams = new LinkedHashMap()
Map reportParams1 = new LinkedHashMap()

String outputReportName="Test_Output_copy"

reportParams.put('parameter name',"parameter")
reportParams1.put('copy',"Customer's Copy")

JasperReportDef reportDef1 = new JasperReportDef(name: 'testBillReport.jasper', fileFormat: JasperExportFormat.PDF_FORMAT,
            parameters: reportParams, folder: reportDir)
JasperReportDef reportDef2 = new JasperReportDef(name: 'testBillReport.jasper', fileFormat: JasperExportFormat.PDF_FORMAT,
            parameters: reportParams1, folder: reportDir)

List<JasperReportDef> jasperPrintList = new ArrayList<JasperReportDef>();
    jasperPrintList.add(reportDef1);
    jasperPrintList.add(reportDef2);

ByteArrayOutputStream report1 = jasperService.generateReport(jasperPrintList);
    response.setHeader("Content-disposition", "inline;filename="+outputReportName+'.pdf')
    response.contentType = "application/pdf"
    response.outputStream << report1.toByteArray()
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));  
}