【问题标题】:How to set relative path of images in report?如何在报告中设置图像的相对路径?
【发布时间】:2018-08-23 18:53:27
【问题描述】:

所以我有一个显示碧玉报告的 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

有什么想法吗?我非常卡住,不胜感激!

更新:知道了。必须在报告中创建一个参数并从图像表达式中调用该参数。然后我在 Java 代码中创建了一个 HashMap 和 InputStream,并将输入流放到了 hash map 中!这么简单的事情有这么多代码!

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

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

【问题讨论】:

    标签: java jasper-reports


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我最终做到了。在每个报告的 jrxml 中创建一个参数并将该参数传递到图像中。然后我创建了一个 HashMap 并将那里的参数设置为文件的 InputStream。我必须创建两个 Hashmap 实例和两个不同的输入流,才能在两个不同的报告上显示一个图像!请参阅上面的更新代码:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多