如何移动整个布局以适应不同打印机上的预打印表格
How can I move the whole layout to adapt to pre-printed form on different printers
我们使用 Java、Hibernate、Spring 和 Jasper Report 5.6 开发了美国医疗保健医疗计费产品。使用 CMS 1500 和 UB04 表格打印。
我们想要打印预打印表格中的值,即用户将把这个预打印表格保存在打印机中,我们需要从应用程序中打印值盒子。
所以我们附上了 Jasper Report 中的图像,并在每个框中放置了文本框。它打印正确,但是如果用户更换打印机,那么对齐就会变成问题。作为替代的脏选项,我们获取副本并为该打印机进行对齐,因此现在对于每台打印机,我们都有单独的 jasper 报告文件,即使打印的值相同。
我的客户要求为他们提供一个选项,以以单独的形式设置 X 和 Y 值,然后使用这些值正确打印。
所以问题是我们可以在 jasper 报告中这样做吗?
移动所有 报告元素的最简单方法是修改报告边距
将 jrxml
加载到 JasperDesign
对象中并根据需要切换页边距。您可以在 x 中移动的最小值是原始报告边距,最大值取决于您的报告(自然 columWidth 不能变为 0,但检查这个更好地定义最大值没有真正意义)
示例:
JasperDesign design = JRXmlLoader.load("YourReport.jrxml");
moveDesign(design,x,y);
JasperReport report = JasperCompileManager.compileReport(design);
private void moveDesign(JasperDesign design, int x, int y) {
int maxX = 100; //I define it so that elements is not out of report
int maxY = 100;
int pageWidth = design.getPageWidth();
int intitalLeftMargin = design.getLeftMargin();
int intitalRightMargin = design.getRightMargin();
int intitalTopMargin= design.getTopMargin();
//Check that not less then 0 and not more then my max
int newLeftMargin = Math.min(Math.max(intitalLeftMargin+x,0),maxX);
int newTopMargin = Math.min(Math.max(intitalTopMargin+y,0),maxY);
//set our new margins
int newColumWidth = pageWidth - newLeftMargin - intitalRightMargin;
design.setLeftMargin(newLeftMargin);
design.setTopMargin(newTopMargin);
design.setColumnWidth(newColumWidth);
}
down-side 是您需要重新编译 您的报告(这需要几毫秒)。
如果执行速度至关重要,另一个解决方案(更复杂但可能更快)是移动 JasperPrint
中每个页面中的所有元素
我会将完整的代码留给 OP,但它与此类似
List<JRPrintPage> pages = jasperPrint.getPages();
for (JRPrintPage jrPrintPage : pages) {
List<JRPrintElement> elements = jrPrintPage.getElements();
for (JRPrintElement jjpe : elements) {
jjpe.setX(newX);
jjpe.setY(newX);
}
}
我们使用 Java、Hibernate、Spring 和 Jasper Report 5.6 开发了美国医疗保健医疗计费产品。使用 CMS 1500 和 UB04 表格打印。
我们想要打印预打印表格中的值,即用户将把这个预打印表格保存在打印机中,我们需要从应用程序中打印值盒子。
所以我们附上了 Jasper Report 中的图像,并在每个框中放置了文本框。它打印正确,但是如果用户更换打印机,那么对齐就会变成问题。作为替代的脏选项,我们获取副本并为该打印机进行对齐,因此现在对于每台打印机,我们都有单独的 jasper 报告文件,即使打印的值相同。
我的客户要求为他们提供一个选项,以以单独的形式设置 X 和 Y 值,然后使用这些值正确打印。
所以问题是我们可以在 jasper 报告中这样做吗?
移动所有 报告元素的最简单方法是修改报告边距
将 jrxml
加载到 JasperDesign
对象中并根据需要切换页边距。您可以在 x 中移动的最小值是原始报告边距,最大值取决于您的报告(自然 columWidth 不能变为 0,但检查这个更好地定义最大值没有真正意义)
示例:
JasperDesign design = JRXmlLoader.load("YourReport.jrxml");
moveDesign(design,x,y);
JasperReport report = JasperCompileManager.compileReport(design);
private void moveDesign(JasperDesign design, int x, int y) {
int maxX = 100; //I define it so that elements is not out of report
int maxY = 100;
int pageWidth = design.getPageWidth();
int intitalLeftMargin = design.getLeftMargin();
int intitalRightMargin = design.getRightMargin();
int intitalTopMargin= design.getTopMargin();
//Check that not less then 0 and not more then my max
int newLeftMargin = Math.min(Math.max(intitalLeftMargin+x,0),maxX);
int newTopMargin = Math.min(Math.max(intitalTopMargin+y,0),maxY);
//set our new margins
int newColumWidth = pageWidth - newLeftMargin - intitalRightMargin;
design.setLeftMargin(newLeftMargin);
design.setTopMargin(newTopMargin);
design.setColumnWidth(newColumWidth);
}
down-side 是您需要重新编译 您的报告(这需要几毫秒)。
如果执行速度至关重要,另一个解决方案(更复杂但可能更快)是移动 JasperPrint
我会将完整的代码留给 OP,但它与此类似
List<JRPrintPage> pages = jasperPrint.getPages();
for (JRPrintPage jrPrintPage : pages) {
List<JRPrintElement> elements = jrPrintPage.getElements();
for (JRPrintElement jjpe : elements) {
jjpe.setX(newX);
jjpe.setY(newX);
}
}