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

新手上路,请多包涵

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

 <parameter name="smileyfaceimage" class="java.lang.String"/>

然后我引用它:

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

这不对吗?

我已经尝试过使用和不使用 base64:

 data:image/png;base64,

这是我正在使用的图像

只是一个随机截图

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

现在在我的代码中;

  • 将变量的值设置为 based64 字符串

  • 在模板上

    • 设置参数: <parameter name="smileyfaceimage" class="java.lang.String"/>
  • 然后将图像数据添加到页面:

    • ”` <![CDATA[new java.io.ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64($P{smileyfaceimage}.getBytes()))]]>

    ”`

我错过了一步吗?

原文由 iCodeLikeImDrunk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

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

I choose java.io.InputStream since this will require less code, so the first thing we need to do now is to decode the base64 image String .

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

java代码将是:

 InputStream stream = new ByteArrayInputStream(Base64.decodeBase64(smileyfaceimage.getBytes()));

是时候将它传递到碧玉报告中了 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>

希望最好,然后按 预览

结果

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

编辑:OP(评论)的问题是,使用旧的 jasper 报告库(3.0),您需要在 imageExpression @see class="java.io.InputStream" 中指定类 --- 该帖子已因此更新因为这也适用于 6.0.

原文由 Petter Friberg 发布,翻译遵循 CC BY-SA 3.0 许可协议

您需要以某种方式解码图像,例如使用 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>

我用它来嵌入图像,但它也应该适用于变量、字段或参数。

原文由 Durandal 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题