【问题标题】:Implement Batch Export in the Jasper reports server to get the landscape and portrait in a single report在 Jasper 报表服务器中实现批量导出以在单个报表中获取横向和纵向
【发布时间】:2013-10-09 15:31:40
【问题描述】:

我正在尝试在 jasper 报告中实现类似于 here(如链接中所示)的批量导出。 请指点。

我有什么: 1. 肖像模板 2.景观模板 3. 我需要生成报告的顺序 4. 相同的 Bean 数据源,每个模板都有过滤查询来填充

我需要什么: 分别生成报告并合并所有生成的 JasperPrint 对象并调整页码

【问题讨论】:

    标签: java jasper-reports report


    【解决方案1】:

    由于您正在生成报告然后将其合并,因此当前页码和总页数仅在导出期间可用,具体取决于您合并的报告数量。我们使用generic elements 解决了类似的问题。您需要编写自定义逻辑来处理您创建的处理程序中的页码。

    【讨论】:

    • 感谢指针。我已经覆盖了 JRPdfExporter 的 exportGenericElement() 方法并添加了一个 JRPrintText,它显示了合并后的碧玉打印对象的总页面大小。
    • 嗨 Cid..我有同样的问题..你能发布伪代码来添加 JRPrintText。
    • Balaji Paulrajan:请给我发送伪代码以了解如何使用通用元素实现...
    • 嗨 TP_JAVA,我现在没有代码。您的邮件 ID 不在个人资料中。所以给我发邮件。我会告诉你我们采取的方法。
    【解决方案2】:

    我的报告第 1 页 (jr1) 是纵向的,第 2 页 (jr2) 是横向的。

    JasperReport jr1 = (JasperReport) JRLoader.loadObject(...);
    JasperReport jr2 = (JasperReport) JRLoader.loadObject(...);
    
    JREmptyDataSource ds = new JREmptyDataSource(1);
    JasperPrint print1 = JasperFillManager.fillReport(jr1, new HashMap(), ds);
    
    ds.moveFirst();
    
    JasperPrint print2 = JasperFillManager.fillReport(jr2, new HashMap(), ds);
    List l = new ArrayList();
    
    l.add(print1);
    l.add(print2);
    
    JRPdfExporter exp = new JRPdfExporter();
    exp.setParameter(JRExporterParameter.JASPER_PRINT_LIST, l);
    exp.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, SAVE_LOCATION);
    exp.exportReport();
    

    【讨论】:

    • 谢谢,但这种方法存在问题。页码将不按顺序排列。例如,如果第一个模板中有 12 页,则第二页的第一页不会显示第 13 页,而是显示第 1 页
    【解决方案3】:

    这可能适用于页码问题:

    private static void mergeAndNumber() 抛出 IOException、DocumentException {

        PdfReader readerOne = new PdfReader("c:\file_one.pdf"«»);
    
    
    
        // we retrieve the total number of pages
    
        int nOne = readerOne.getNumberOfPages();
    
    
    
        PdfReader readerTwo = new PdfReader("c:\file_two.pdf"«»);
    
    
    
        // we retrieve the total number of pages
    
        int nTwo = readerTwo.getNumberOfPages();
    
    
    
        int totalPages = (nOne + nTwo);
    
        System.out.println("Total number of pages: " + (nOne + nTwo));
    
    
    
        Rectangle psize = readerOne.getPageSize(1);
    
        float widthPort = psize.width();
    
        float heightPort = psize.height();
    
    
    
        // step 1: creation of a document-object
    
        Document document = new Document(psize, 50, 50, 50, 50);
    
        // step 2: we create a writer that listens to the document
    
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("c:\file_combined.pdf"«»));
    
    
    
        document.open();
    
        // step 4: we add content
    
        PdfContentByte cb = writer.getDirectContent();
    
    
    
        PdfImportedPage importPage = null;
    
    
    
        BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
    
        float pageNumXPos = widthPort;
    
        float pageNumYPos = heightPort;
    
        for (int i = 1; i <= nOne; i++) {
    
            document.newPage();
    
            importPage = writer.getImportedPage(readerOne, i);
    
            cb.addTemplate(importPage, 0,0);
    
    
    
            cb.moveTo(400, 40);         
    
            cb.beginText();
    
            cb.setFontAndSize(bf, 10);
    
            //cb.showText("Page " + i  + " of " + totalPages);          
    
            cb.showTextAligned(PdfContentByte.ALIGN_RIGHT, "Page " + i  + " of " + totalPages, pageNumXPos - 45, pageNumYPos - 55, 0);
    
            cb.endText();
    
        }
    
    
    
        document.setPageSize(PageSize.A4.rotate());
    
    
    
        for (int i = 1; i <= nTwo; i++) {
    
            document.newPage();
    
            importPage = writer.getImportedPage(readerTwo, i);
    
            cb.addTemplate(importPage, 0,0);
    
    
    
            cb.moveTo(400, 40);        
    
            cb.beginText();
    
            cb.setFontAndSize(bf, 10);
    
            cb.showTextAligned(PdfContentByte.ALIGN_RIGHT, "Page " + (nOne + i)  + " of " + totalPages, pageNumYPos - 20, pageNumXPos - 60, 0);         
    
            cb.endText();
    
        }
    
    
    
        document.close();        
    
    }
    

    【讨论】:

    • 我不想在 iText 级别进行操作。谢谢你的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多