如何将多个jrxml jasper报告整理为单个pdf输出文件

我必须使用五种不同的SQL查询来准备报告。 每个查询都会给出一个报告表。

所以我写了5个jrxml文件,每个文件对应一个上面的查询,带有自己的标题,标题设置,页脚,页面编号等。

现在,我能够将上述每个jrxmls编译,打印并导出为5个不同的pdf。

但是,客户希望将所有报告整理成一个单独的pdf。 那是在最后的pdf中,前四页将是报告一,接下来的五页报告两页,然后报告三页,依此类推。

1)如何实现这一目标?

2)每个报告的页码为1 / 4,2 / 4,3 / 4等。其中第二部分即完整页码用评估时间作为报告进行评估。 因此,当我将单个pdf(如果可能)整理所有报告时,是否还可以将页面重新编号为最终pdf?

根据下面的答案,我在我的java类中做了以下工作,它可以工作:

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 jprintlist = new ArrayList(); 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(); } 

上图:input1,input2,input3是输入jrxmls的字符串路径

我的JRXML文件只打印三条消息:Hello World 1,Hello World 2,Hello World 3。

              

谢谢阅读!

您可以利用导出整个jasperprint列表:

 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(); 

这个答案是为了帮助用户使用JASPER REPORT VERSION> 5.6 (最新版本),因此删除了已弃用的代码。

由于不推荐使用 jasper-report 5.6 JRPdfExporterParameter.JASPER_PRINT_LIST ,因此Wojtek Owczarczyk的当前代码答案如下:

 List 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(); 

没有itext的页码…

 private void drawPageNumbers(List 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; } 

(iReport示例)

第一部分:

  • 创建一个新的空白jasper报告,作为不同报告的包装报告
  • data adapter =一个空记录 – Empty Rows
  • 点击“新…”
  • 选择“空行”
  • 点击下一步”
  • 空记录数= 1(因此您将在记录中进行模拟,并且只打印一个细节带)
  • 所以空白报告已准备好当您从JAVA程序中调用此报告时,首先打开与数据库的数据连接并在后台交换此连接。 我们的包装器报告的子报告可以通过参数inheritance此连接!

第2部分)

  • 为要嵌入新细节带的每个报告添加。
  • 每个细节带包含一个子报告(当然链接到另一个独立报告)
  • 在包装器报告的子报表定义中将属性“run to bottom”设置为“True”

这个概念对我有用。 当然,根据参数,您可以打开或关闭不同的波段。