如何在报告中设置图像的相对路径?

时间:2014-06-07 16:01:40

标签: java jasper-reports

所以我有一个显示jasper报告的java应用程序。我使用netbeans的 iReport 插件在报告中放置了一个图像。一切都在我当前的机器上显示正常但是当我尝试在另一台机器上运行编译的jar时,报告不会加载。

通过查看Windows控制台,我认为是因为图像的路径是绝对的,即引用开发机器硬盘驱动器上的特定文件夹。我需要相对于jar文件。我已将图像放入包中,并在已编译的jar中确认了它。但是当我改变"图像表达时#34; iReport 中的值为" /reports/Logo.jpg" (其中/ reports是包)并运行我得到的应用程序

EXCEPTION: Byte data not found at : /reports/Logo.jpgnet.sf.jasperreports.engine.JRException: Byte data not found at : reports/Logo.jpg

任何想法该怎么办?我非常困难,非常感谢任何帮助!

更新:明白了。必须在报表中创建一个参数并从图像表达式调用参数。然后我在 Java 代码中创建了一个HashMap和InputStream,并将输入流放入哈希映射中!如此简单的代码!

Java代码

        //to get images to display in report, pass their relative path as input stream and add to HashMap
        //there must be one stream and one HashMap per image
        InputStream imgInputStream = this.getClass().getResourceAsStream("/reports/omacLogo.jpg");
        InputStream imgInputStream2 = this.getClass().getResourceAsStream("/reports/omacLogo.jpg");
        parameters.put("omacLogo", imgInputStream);
        parameters2.put("omacLogo", imgInputStream2);

        InputStream jasper1 = this.getClass().getResourceAsStream("/reports/OmacYTDReportFinalpg1.jasper");
        InputStream jasper2 = this.getClass().getResourceAsStream("/reports/OmacYTDReportFinalpg2.jasper");

        JasperPrint jp1 = JasperFillManager.fillReport(jasper1, parameters,new JRBeanCollectionDataSource(ie.orderofmalta.BeanFactory.getCalcs()));
        JasperPrint jp2 = JasperFillManager.fillReport(jasper2, parameters2, new JRBeanCollectionDataSource(ie.orderofmalta.BeanFactory.getCalcs()));

希望这有助于其他人!请注意,您必须为要放置的每个图像创建单独的哈希映射和输入流,即使它们是相同的图像。

1 个答案:

答案 0 :(得分:4)

我个人没有用罐子试过这种方式,但我希望它有所帮助。正如您所说,问题来自文件路径。在iReport工具上,您可以使用相对路径,它可以在预览中使用,但是当报表生成集成在应用程序中时,它只能用于绝对路径。 我处理这个缺点的方法是在java应用程序中获取图像的绝对路径,并将其作为参数传递给报表。例如:

 String image = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/Cards_Template/front.jpg");

注意:我已经构建了一个JSF应用程序,这就是为什么我从它的上下文中获取路径的原因。如果你不这样做,Java的IO或NIO API确实有一些方法可以做到这一点。基本上,我从相对路径获得绝对路径。