如何在jasper报告上显示图像?

我想在碧玉报告上显示图像。 我在.jrxml上有以下内容:

    

图像logo.jpg与.jrxml位于同一目录中。 只是说它不适合我。 我google了一下,发现jasper报告考虑我放在.jrxml上作为JVM目录的相对路径,并且为了改变这一点,我需要传递一个返回文件的FileResolver作为“REPORT_FILE_RESOLVER”参数。 所以,我在.java中做了以下内容(位于与.jrxml和图像相同的位置)

 FileResolver fileResolver = new FileResolver() { @Override public File resolveFile(String fileName) { return new File(fileName); } }; HashMap parameters = new HashMap(); parameters.put("REPORT_FILE_RESOLVER", fileResolver); ... 

哪个应该返回预期的文件,但我仍然得到一个

 net.sf.jasperreports.engine.JRException: Error loading byte data : logo.jpg at net.sf.jasperreports.engine.util.JRLoader.loadBytes(JRLoader.java:301) at net.sf.jasperreports.engine.util.JRLoader.loadBytesFromLocation(JRLoader.java:479) at net.sf.jasperreports.engine.JRImageRenderer.getInstance(JRImageRenderer.java:180) ... 

我究竟做错了什么?

谢谢!

我通过传递一个指定文件绝对位置的参数来完成这项工作:

    

我这样做 – 图像通过路径传递:

 HashMap params = new HashMap(); params.put("logo", ClassLoader.getSystemResource("logo.jpg").getPath()); 

的.jrxml

  ...     

…或者图像作为InputStream传递(我不知道为什么,但需要将onErrorType属性设置为"Blank" ,否则它不起作用 – 抛出exception):

 HashMap params = new HashMap(); params.put("logo", ClassLoader.getSystemResourceAsStream("logo.jpg")); 

的.jrxml

  ...     

这是问题所在:

正如我之前所说,我在同一目录中有.jrxml,logo.jpg和使用.jrxml的.java。

问题是fileResolver

 FileResolver fileResolver = new FileResolver() { @Override public File resolveFile(String fileName) { return new File(fileName); } }; 

没有返回图像文件。 我发现它映射到一个不同的目录而不是我期待的目录。 所以,我把它改为:

 FileResolver fileResolver = new FileResolver() { @Override public File resolveFile(String fileName) { URI uri; try { uri = new URI(this.getClass().getResource(fileName).getPath()); return new File(uri.getPath()); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } }; 

这就成功了。 我忘记了这样一个事实:

相反,相对路径名必须根据从其他路径名获取的信息来解释。 默认情况下,java.io包中的类始终解析当前用户目录的相对路径名。 此目录由系统属性user.dir命名,通常是调用Java虚拟机的目录。

(取自java api – File(Java Platform SE 6) )

调用JVM的目录不是我拥有所有这些数据的目录。

谢谢!

尝试在报告页面中声明一个类型为InputIream的myImg的参数。 在页面上为param和image占位符声明此类型。 然后,使用类似的东西从类路径中获取图像(假设图像名称为’imgName.ext’,它位于名为’your.package’的包中)

InputStream imgInputStream = this.getClass().getResourceAsStream("/your/package/imgName.ext"); parameters.put("myImg", imgInputStream);