【问题标题】:How can I move the whole layout to adapt to pre-printed form on different printers如何移动整个布局以适应不同打印机上的预打印表单
【发布时间】:2016-01-12 07:07:05
【问题描述】:

我们有使用 Java、Hibernate、Spring 和 Jasper Report 5.6 开发的美国医疗保健计费产品。使用 CMS 1500 和 UB04 Form 打印。

我们希望在预打印表单中打印值,即用户将这个预打印表单保留在打印机中,我们需要从应用程序中打印框中的值。

所以我们在 Jasper 报告中附加了图像,并将文本框放在每个框中。它可以正确打印,但是如果用户更换打印机,那么对齐就会变成一个问题。作为替代的脏选项,我们获取了副本并为该打印机进行了对齐,因此现在对于每台打印机,我们都有单独的 jasper 报告文件,即使打印的值是相同的。

我的客户要求给他们一个选项,以单独的形式设置 X 和 Y 值,然后使用这些值正确打印。

那么问题是我们可以在 jasper 报告中做到这一点吗?

【问题讨论】:

  • 如果我声明您正在寻找移动所有具有用户提供的 X 和 Y 值的 JRElements,我是否正确理解了这个问题?.....您是否正在寻找 java 中的解决方案或在 jrxml? 中,X 和 Y 值可以是负数还是只有正数?
  • 是的,您的理解是正确的。我正在寻找java中的解决方案。 X 和 Y 可以是负数也可以是正数
  • 我编辑了您的帖子,反映了您的需求,因此它可能对其他人更有用。
  • 是的,我急于寻找解决方案。现在一切都很好。您的解决方案非常适合我。

标签: java jasper-reports


【解决方案1】:

移动所有报表元素的最简单方法是修改报表ma​​rgins

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);
}

这样做的缺点是您需要重新编译您的报告(这需要几毫秒)。

如果执行速度至关重要,另一种解决方案(更复杂但可能更快)是移动 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);    
    }   
}

【讨论】:

  • 最快的方法,不需要重新编译?
  • JasperDesign design = null;设计 = JRXmlLoader.load(reportPath); JRElement jasperelement = null; jasperelement = design.getPageHeader().getElementByKey('keyname'); if (jasperelement != null) { jasperelement.setX(tmp.getXpos());在这里我没有设置 jasperelement.setY 因为 JRElement 中没有方法。我们如何设置垂直位置?
  • 最快的方法,不,你不需要重新编译,jrxml到.jasper,但在你的情况下,用户打印几乎看不到任何差异(0.1-0.2秒),主要是我添加了更快如果有人需要执行此方法是批处理(生成 1000 个报告)
  • 如果您不知道哪个使用 JRBaseElement ((JRBaseElement)tmp).setY(...) ...
  • 是的,知道了。彼得小修正。从您的示例中,我们需要保存 JRML 文件,然后编译如下 JasperCompileManager.writeReportToXmlFile(design, reportPath); JasperCompileManager.compileReportToFile(design, outputFile);
猜你喜欢
  • 2012-01-10
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多