繁体   English   中英

如何将多个jrxml jasper报告整理到一个pdf输出文件中

[英]How to collate multiple jrxml jasper reports into a one single pdf output file

我必须使用五个不同的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<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();
            }

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

我的JRXML文件仅打印三个消息: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>

谢谢阅读!

您可以利用导出整个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<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();

没有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;
}

(iReport示例)

第一部分:

  • 创建一个新的空白碧玉报告作为不同报告的包装报告
  • 数据适配器=一个空记录-空行
  • 点击“新建...”
  • 选择“空行”
  • 点击下一步”
  • 空记录数= 1(因此您将在记录中进行模拟,并且仅打印一个明细带)
  • 因此,空白报告已准备就绪当您从JAVA程序中调用此报告时,请首先打开与数据库的数据连接,然后在后台交换该连接。 包装报告的SubReports可以通过参数继承此连接!

第2部分)

  • 为每个要嵌入新明细带的报告添加。
  • 每个详细信息带均包含一个子报告(当然也链接到其他独立报告)
  • 在包装报告的子报表定义中将属性“运行到底部”设置为“真”

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

你可以试试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM