繁体   English   中英

如何将两个 jrxml jasper 报告合并为一个 pdf output 文件

[英]How to merge two jrxml jasper reports into a one single pdf output file

我有两个具有两个不同数据源的 JRXML 文件。 第一个 jasper 报告数据源是 JRXmlDataSource,第二个 jasper 报告数据源是 JRResultSetDataSource

try
{
            conn= objConnector.getConnection();
            conn.setAutoCommit(false);

            PreparedStatement ps = conn.prepareCall("{ call Sp_DEMO(?) }");
            ps.setString(1,condition);
            ResultSet rs = ps.executeQuery();

            JasperReport jreport1 = JasperCompileManager.compileReport("d:\\JRXML\\ECGImage.jrxml");
            JasperPrint jprint1 = JasperFillManager.fillReport(jreport1, new HashMap(), new JRResultSetDataSource(rs));
            jprintlist.add(jprint1);
            JasperReport jasperReport = JasperCompileManager.compileReport("d:\\JRXML\\RadiologyReport.jrxml");

                JRXmlDataSource xmlDataSource = new JRXmlDataSource("d:\\abc.xml"+, "/X-RayReport/Type");
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(),xmlDataSource);
                jprintlist.add(jasperPrint);


            File file = new File("d:\\demo.pdf");
            if(file.exists())
            {
                file.delete();
            }
            JRExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT_LIST, jprintlist);
            OutputStream output = new FileOutputStream(new File("d:\\demo.pdf"));
            exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, output);
            exporter.exportReport();

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

我想从两个 jrxml 文件创建单个 pdf 文件作为 output。

你可以像这样合并上面两个pdf

List pages = jasperPrint.getPages();
for (int j = 0; j < pages.size(); j++) {
   JRPrintPage object = (JRPrintPage)pages.get(j);
   jprint1.addPage(object);
}

jprint1将是您的单一输出。

嗯,这就是JasperReport Subreports的目的。 您必须创建另一个.jrxml作为主报告,并将其他现有的两个包含在这个报告中作为“子报告”。 所以你会有一个输出。

要创建子报表(如果您不知道),请参阅这些教程: JasperReports - 创建子报表子报表

由于您有两个不同的数据源,我认为您也可能需要阅读以下内容:将参数传递给子报表

您可能需要它来将不同的数据源作为参数传递给子报表,因此不在您的JasperPrint对象实例中。

我没有关于我通常如何做的事实辩护或争论,所有这些只是个人喜好的问题,以及我在合并和后处理阶段为合并报告添加一些一般性附加内容的轻松程度,即页码, header、页脚等

正确的 jasper-report 方法是避免在 Java 中加入报告,而是创建一个主报告,然后向其中添加子报告。 但是,如果您真的想在 Java 中这样做,您可以使用标记,然后再次对所有内容进行后处理,请查看此处

不过,我只是不那样做。

大多数时候,我更喜欢首先在 pdf 中分别生成和导出最终报告的不同部分,然后使用PDFBox将它们合并在一起。 通过不遵循 jasper 报告的方式,通常我会避免大量的子报告层次结构,因为通常最终报告的每个部分都包含几个其他子报告。 所以,我发现最好分别关注每个部分,然后再进行最后的合并。

我通常做这样的事情:

public final class Report
{
    List<File> MergingFiles;
    ReportData data;

    public Report(ReportData data)
    {
        // I prefer to pack all the data like, jrxml files path or 
        // the data that fills the report in a separate object -> ReportData
        this.data = data;
        MergingFiles = new ArrayList<>();
    }

    private void generateCoverPage() throws JRException
    {
        /* Setting up the data which needs to be passed to cover page
           reading the cover page jrxml file
           compiling the report */
        // and Exporting - I normally use JRPdfExporter for that
       exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(data.getCoverPageExportPath()));
       exporter.exportReport();
       MergingFiles.add(new File(data.getCoverPageExportPath()));
    }

    private void generateSecondPart() throws JRException
    {
        /* similar to generateCoverPage() to create another part of the report */
    }
    
    public void generateReport()
    {
        generateCoverPage();
        generateSecondPart();
        mergePDFFiles(MergingFiles, data.getPrintFileName());
        /* Do additional general post process i.e. page numbers, header, footer, etc. here 
           and then clean up temp files */ 
    }

    private void mergePDFFiles(List<File> files, String mergedFileName) 
    {
        // all classes are imported from "org.apache.pdfbox"
        try 
        {
            PDFMergerUtility pdfmerger = new PDFMergerUtility();
            for (File file : files) 
            {
                PDDocument document;
                document = PDDocument.load(file);
                pdfmerger.setDestinationFileName(mergedFileName);
                pdfmerger.addSource(file);
                pdfmerger.mergeDocuments(MemoryUsageSetting.setupTempFileOnly());
                document.close();
            }
        } 
        catch (IOException e) 
        {
            System.out.println("Error to merge files. Error: " + e.getMessage());
        }
    }

}

//只是我的旁注,但是带有/* */的注释是您必须处理的部分,以防您想使用我的方法。

暂无
暂无

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

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