如何在加载和现有模板到JasperDesign后更改页面大小/格式然后更改它?

时间:2016-03-04 20:19:29

标签: java jasper-reports export-to-pdf

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

所以这是我的问题:

我正在尝试动态更改报告的格式(书籍报告,包含多个页面或部分或子报告)。我正在做的是首先加载它,从现有模板加载到JasperDesign对象持有者。然后,修改页面本身的其他参数的大小。稍后,我将编译并尝试使用编译的文件打印PDF格式报告。最后,我想打印一本孔书报告,其中包含不同的页面和不同的模板,每个页面都有我可以指定的格式。

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

这是真的吗?我的意思是动态地这样做,而不是为每个页面和格式创建一个新的静态模板,然后创建一个mantainence问题?如果是这样,这样做的方式是什么?

以下是我重新审阅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静态模板文件的信息。但我认为现在不需要这样做。如果你不这么认为可以做到

请帮助我,并提前致谢

1 个答案:

答案 0 :(得分:3)

您好,感谢您的快速解答。我找不到如何评论你的答案,所以我想我必须把它包含在这篇文章中。

首先,你只是通过更改de page维度来保证整个页面布局的大小调整是正确的。但是,我改变的格式非常相似(A4和LETTER),所以对组件和字段大小的影响不大,并不是那么大。

此外,我必须做的是,实际更改书籍格式的每个人的页面,首先将每个单独的页面加载到JasperDesing对象持有者中,然后将其保存,将修改后的大小放入jasper字段中,将用于填充过程。而不只是为报告书页面本身做这件事。

以下是代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="placeholder"></div>
<template id="signin">
  <h2>Sign In</h2>
  <form method="post">
    <label>
      Username
      <input id="signinUsername" />
    </label>
    <label>
      Password
      <input id="signinPassword" />
    </label>
    <a href="javascript:void(0)" id="btnGoToSignUp">Sign Up</a>
    <button type="button" id="btnSignIn">Sign In</button>
  </form>
</template>
<template id="signup">
  <h2>Sign Up</h2>
  <form method="post">
    <label>
      Username
      <input id="signupUsername" />
    </label>
    <label>
      Password
      <input id="signupPassword" />
    </label>
    <button type="button" id="btnSignUp">Sign In</button>
  </form>
</template>

感谢您的帮助