如何设置报表中图片的相对路径?

eoi*_*Dub 3 java jasper-reports

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

从Windows控制台来看,我认为这是因为图像的路径是绝对的,即引用开发机器硬盘上的特定文件夹。我需要使其与 jar 文件相关。我已将图像放入包中并确认它位于编译后的 jar 内。但是当我将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
Run Code Online (Sandbox Code Playgroud)

有什么想法要做什么吗?我很困惑,非常感谢任何帮助!

更新:明白了。必须在报表中创建一个参数并从图像表达式中调用该参数。然后我在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()));
Run Code Online (Sandbox Code Playgroud)

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

End*_*rik 5

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

 String image = FacesContext.getCurrentInstance().getExternalContext().getRealPath("/Cards_Template/front.jpg");
Run Code Online (Sandbox Code Playgroud)

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