【发布时间】: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