如何/我可以在Jasper报告模板中使用base64作为图像源吗?

iCo*_*unk 8 java base64 image jasper-reports

所以在我的jrxml文件中,我有以下内容:

<parameter name="smileyfaceimage" class="java.lang.String"/>
Run Code Online (Sandbox Code Playgroud)

然后我参考:

<image scaleImage="FillFrame" onErrorType="Blank">
    <reportElement x="167" y="62" width="363" height="171" backcolor="#333333"/>
    <imageExpression class="java.lang.String"><![CDATA[$P{smileyfaceimage}]]></imageExpression>
</image>
Run Code Online (Sandbox Code Playgroud)

这不正确吗?

无论有没有,我都尝试过base64:

data:image/png;base64,
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的图像

只是随机截图

然后我使用https://www.base64-image.de/或任何随机网站来获取base64字符串.我测试了它产生的字符串,它是有效的.

现在在我的代码中;

  • 将变量的值设置为based64字符串
  • 在模板上
    • 设置参数: <parameter name="smileyfaceimage" class="java.lang.String"/>
  • 然后将图像数据添加到页面:

    • <image scaleImage="FillFrame" onErrorType="Blank">
          <reportElement x="167" y="62" width="363" height="171" backcolor="#333333"/>
          <imageExpression><![CDATA[new java.io.ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64($P{smileyfaceimage}.getBytes()))]]></imageExpression>
      </image>
      
      Run Code Online (Sandbox Code Playgroud)

我错过了一步吗?

Pet*_*erg 12

传递参数String使得jasper报告认为它是一个绝对文件路径,因此您需要另一个类.最明显的是java.awt.Image或java.io.InputStream.

我选择java.io.InputStream,因为这将需要更少的代码,所以我们现在需要做的第一件事就是到decode了base64图像String.

有几个 Base64类可以完成这项工作,我选择了org.apache.commons.codec.binary.Base64因为apache commons-codec.jar已经分发了jasper报告(依赖项).解码将给我们一个字节数组byte[],所以现在我们只需要添加一个ByteArrayInputStream

java代码将是:

InputStream stream = new ByteArrayInputStream(Base64.decodeBase64(smileyfaceimage.getBytes()));
Run Code Online (Sandbox Code Playgroud)

是时候将它传递给碧玉报告了 imageExpression

<image scaleImage="FillFrame" onErrorType="Blank">
<reportElement x="167" y="62" width="363" height="171" backcolor="#333333"/>
    <imageExpression class="java.io.InputStream"><![CDATA[new java.io.ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64($P{smileyfaceimage}.getBytes()))]]></imageExpression>
</image>
Run Code Online (Sandbox Code Playgroud)

希望最好并按预览:

结果

重要提示:本smileyfaceimage需求是没有:data:image/png;base64,

编辑:OP(评论)的问题是,使用旧的jasper报告lib(3.0),你需要在imageExpression@see中指定类,class="java.io.InputStream"因为这个工作也在6.0中.


Dur*_*dal 6

你需要以某种方式解码图像,例如使用imageExpression:

<image scaleImage="RetainShape" hAlign="Center" vAlign="Bottom" isUsingCache="false">
  <reportElement uuid="53a340b3-7d64-4104-9e9f-0f603059579a" key="Logo_Footer" x="55" y="760" width="370" height="42"/>
    <imageExpression><![CDATA[new java.io.StringBufferInputStream(new org.w3c.tools.codec.Base64Decoder(" Base 64 String Data ").processString())]]>
  </imageExpression>
</image>
Run Code Online (Sandbox Code Playgroud)

我正在使用它来嵌入图像,但它也应该使用变量,字段或参数.