如何在碧玉报告上显示图像?

2022-09-01 07:17:00

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

<image>
  <reportElement x="181" y="0" width="209" height="74"/>
  <imageExpression class="java.lang.String"><![CDATA["logo.jpg"]]></imageExpression>
</image>

图像徽标.jpg与 .jrxml 位于同一目录中。只是说它不适合我。我用谷歌搜索了一下,发现jasper报告将我放在.jrxml上的内容视为JVM目录的相对路径,并且要更改它,我需要将返回文件的FileResolver作为“REPORT_FILE_RESOLVER”参数传递。因此,我在.java中做了以下操作(与.jrxml和图像位于同一位置)

FileResolver fileResolver = new FileResolver() {

 @Override
 public File resolveFile(String fileName) {
  return new File(fileName);
 }
};
HashMap<String, Object> parameters = new HashMap<String, Object>();

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)
...

我做错了什么?

谢谢!


答案 1

我这样做 - 图像是通过路径传递的:

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

.jrxml

<parameter name="logo" class="java.lang.String"/>
...
<image>
    <reportElement x="0" y="1" width="100" height="37"/>
    <imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image>

...或者图像被传递为(我不知道为什么,但需要将属性设置为,否则它不起作用 - 抛出异常):InputStream<image>onErrorType"Blank"

HashMap<String, Object> params = new HashMap<String, Object>();
params.put("logo", ClassLoader.getSystemResourceAsStream("logo.jpg"));

.jrxml

<parameter name="logo" class="java.io.InputStream"/>
...
<image onErrorType="Blank">
    <reportElement x="0" y="1" width="100" height="37"/>
    <imageExpression><![CDATA[$P{logo}]]></imageExpression>
</image>

答案 2

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

<imageExpression class="java.lang.String">
      <![CDATA[$P{REPORTS_DIR} + "/images/logo.jpg"]]>
</imageExpression>

推荐