如何在将现有模板加载到 JasperDesign 中然后更改页面时更改页面 sizing/format?

How to change page sizing/format when load and existing template into JasperDesign and then changed it?

我从这个 post 提出这个问题。我不确定是否应该创建一个新问题,因为我似乎已经在创建一个新主题了?对此深表歉意。

所以这是我的问题:

我正在尝试动态更改我的报告格式(读书报告,有多个页面或部分或子报告)。我正在做的是首先将它从现有模板加载到 JasperDesign Object holder 中。然后,修改页面本身的大小和其他参数。稍后,我将编译并尝试使用编译文件打印PDF格式的报告。最终,我想用我可以指定的格式为每个单独的页面打印不同页面和不同模板的漏洞报告。

这是我所做的。我能够将主报告指向其他单独的页面格式。所以,当我将报告导出为 PDF 时,一切看起来都很好(就像你可能想象的那样,到达那里并不那么简单。但现在正在工作)。所以现在我想在运行时为读书报告的每一页参数化格式(A4、LETTER 等)。

这可能吗?我的意思是动态地执行此操作,而不是为每个页面和格式创建一个新的静态模板,然后创建维护问题?如果是这样,这样做的方式是什么?

这是我用于检索 JasperDesing 对象模板的代码:

private static JasperDesign getTemplateDesign(String templatePath) throws JRException{

    JasperDesign design = JRXmlLoader.load(templatePath);

    logger.info("Setting Page Dimessions Format to: " + pageFormat);
    if(JRDriver.pageFormat.equals("A3")){
    JRDriver.pageWidth=842; 
    JRDriver.pageHeight=1190;
    JRDriver.columnCount=1;
    JRDriver.columnWidth=802;
    JRDriver.columnSpacing=0;
    JRDriver.leftMargin=20;
    JRDriver.rightMargin=20;
    JRDriver.topMargin=30;
    JRDriver.bottomMargin=30;
    }
    else if (JRDriver.pageFormat.equals("A4")) {
        JRDriver.pageWidth=842; 
        JRDriver.pageHeight=1190;
        JRDriver.columnCount=1;
        JRDriver.columnWidth=555;
        JRDriver.columnSpacing=0;
        JRDriver.leftMargin=20;
        JRDriver.rightMargin=20;
        JRDriver.topMargin=30;
        JRDriver.bottomMargin=30;
    }
    else if (JRDriver.pageFormat.equals("LETTER")) {            
        JRDriver.pageWidth=612; 
        JRDriver.pageHeight=792;
        JRDriver.columnCount=1;
        JRDriver.columnWidth=517;
        JRDriver.columnSpacing=0;
        JRDriver.leftMargin=20;
        JRDriver.rightMargin=20;
        JRDriver.topMargin=30;
        JRDriver.bottomMargin=30;
    }
    //Setting twmplate dimesions
    design.setPageWidth(JRDriver.pageWidth);
    design.setPageHeight(JRDriver.pageHeight);

    design.setColumnCount(JRDriver.columnCount);
    design.setColumnWidth(JRDriver.columnWidth);
    design.setColumnSpacing(JRDriver.columnSpacing);

    design.setLeftMargin(JRDriver.leftMargin);
    design.setRightMargin(JRDriver.rightMargin);
    design.setTopMargin(JRDriver.topMargin);
    design.setBottomMargin(JRDriver.bottomMargin);

    return design;
}

这是我生成 PDF 报告的代码片段:

...

logger.info("Retrieving Design Template..." + reportTemplatePath);
    JasperDesign design= getTemplateDesign(reportTemplatePath);

    //jasperReport = JasperCompileManager.compileReport(reportTemplatePath);
    jasperReport = JasperCompileManager.compileReport(design);

    logger.info("Filling Report...");
    jasperPrint = JasperFillManager.fillReport(jasperReport, jasperParameter,new JREmptyDataSource() );//new JREmptyDataSource()


    jasperPrint.setPageWidth(JRDriver.pageWidth);
    jasperPrint.setPageHeight(JRDriver.pageHeight);

    //Create the file dir
    File file = new File(reportOuputPath);
    file.getParentFile().mkdirs();
    //file.delete();

    logger.info("Writing PDF..." + reportOuputPath);
    JasperExportManager.exportReportToPdfFile(jasperPrint, reportOuputPath);

...

我可以包含我的 JRXML 静态模板文件的信息。但我认为目前没有必要。如果你不这么想也可以做

请帮助我并提前致谢

您好,感谢您的快速回答。我找不到如何对您的回答发表评论,所以我想我必须将其包含在 post.

首先,您关于不能保证整个页面布局调整大小的说法是正确的,仅通过更改页面尺寸即可。但是,我要更改的格式非常相似(A4 和 LETTER),因此对组件和字段大小本身的影响并不大。

此外,我必须做的是,要实际更改书籍格式的每一页,首先将每一页加载到 JasperDesing Object holder 中,然后将修改后的大小保存到 jasper 字段中,将在填​​充过程中使用。而不是仅仅为报告书页面本身这样做。

代码如下:

    private static JasperDesign getPageTemplateDesign(String templatePath) throws JRException{

    logger.info("Setting format page desing for Template: " + templatePath);

    JasperDesign design = JRXmlLoader.load(templatePath);

    logger.info("Setting Page Dimessions Format to: " + pageFormat);
    if (JRDriver.pageFormat.equals("A4")) {
        JRDriver.pageWidth=595; 
        JRDriver.pageHeight=842;
        JRDriver.columnCount=1;
        JRDriver.columnWidth=555;
        JRDriver.columnSpacing=0;
        JRDriver.leftMargin=20;
        JRDriver.rightMargin=20;
        JRDriver.topMargin=20;
        JRDriver.bottomMargin=20;
    }
    else if (JRDriver.pageFormat.equals("LETTER")) {
        JRDriver.pageWidth=612; 
        JRDriver.pageHeight=792;
        JRDriver.columnCount=1;
        JRDriver.columnWidth=517;
        JRDriver.columnSpacing=0;
        JRDriver.leftMargin=20;
        JRDriver.rightMargin=20;
        JRDriver.topMargin=20;
        JRDriver.bottomMargin=20;
    }
    //Setting twmplate dimesions
    design.setPageWidth(JRDriver.pageWidth);
    design.setPageHeight(JRDriver.pageHeight);

    design.setColumnCount(JRDriver.columnCount);
    design.setColumnWidth(JRDriver.columnWidth);
    design.setColumnSpacing(JRDriver.columnSpacing);

    design.setLeftMargin(JRDriver.leftMargin);
    design.setRightMargin(JRDriver.rightMargin);
    design.setTopMargin(JRDriver.topMargin);
    design.setBottomMargin(JRDriver.bottomMargin);      

    return design;
}

private static void reformattingPageTemplate(String path) throws JRException{

    logger.info("Getting Design Template from: " + path);
    JasperDesign design= getPageTemplateDesign(path);

    String destFile=path.replaceAll("jrxml", "jasper");     
    logger.info("Compiling Re-formated Design Template to: " + destFile);
    JasperCompileManager.compileReportToFile(design, destFile); 
}

private static void formattingALLPage() throws JRException{

    reformattingPageTemplate(reportBookPagesDir + "/FrontCover.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/Copyright.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/TableOfContent.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/Summary.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/Content.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/AppendixWarnings.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/Index.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/BackCover.jrxml");
    //reformattingPageTemplate(reportTemplatePath);
}

感谢帮助