我从这个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静态模板文件的信息。但我认为现在不需要这样做。如果你不这么认为可以做到
请帮助我,并提前致谢
答案 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>
感谢您的帮助