【问题标题】:How/Can I use base64 as image source in a Jasper Report template?如何/我可以在 Jasper 报告模板中使用 base64 作为图像源吗?
【发布时间】:2015-11-06 16:40:07
【问题描述】:

所以在我的 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 字符串
  • 在模板上
    • 设置参数:&lt;parameter name="smileyfaceimage" class="java.lang.String"/&gt;
  • 然后将图片数据添加到页面中:

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

我错过了一步吗?

【问题讨论】:

标签: java image jasper-reports base64


【解决方案1】:

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

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

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

java 代码是:

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

是时候将它传递到jasper报告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(cmets)的问题是,对于旧的jasper报告库(3.0),您需要在imageExpression@seeclass="java.io.InputStream"帖子中指定类因此更新,因为这也适用于 6.0。

【讨论】:

  • 不(希望我有),我正在修复一些旧的旧代码库,所以我什至不知道如何为它获取堆栈跟踪,哈哈...
  • whelp,猜它一定是我的烂代码库哈哈。我会用你给我看的东西工作,希望它能奏效!谢谢!
  • 它以“iVBORw0KGgoAAAAANS”开头,以“ywAAAASUVORK5CYII=" 结尾
  • 是的。就是这样。我确定代码中有一些东西在做一些愚蠢的事情导致它不起作用。我在网上浏览了其他解决方案,它们看起来和你的差不多。
【解决方案2】:

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

我正在使用它来嵌入图像,但它也应该与变量、字段或参数一起使用。

【讨论】:

  • 这对我不起作用,任何帮助将不胜感激。
【解决方案3】:

没有外部库的 Java 8+:

<imageExpression><![CDATA[javax.imageio.ImageIO.read(new java.io.ByteArrayInputStream(Base64.getDecoder().decode($P{barcodeHeader})))]]></imageExpression>

如果这不起作用,这绝对应该:

<imageExpression><![CDATA[javax.imageio.ImageIO.read(new java.io.ByteArrayInputStream(java.util.Base64.getDecoder().decode($P{barcodeHeader})))]]></imageExpression>

【讨论】:

    【解决方案4】:

    在我的 oracle 数据库中,我有 base64 图像的 clob 数据类型,但 Jaspersoft Studio 仅支持字符串格式,所以我添加了如下图像表达式, 图像表达:

    new java.io.ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64(new String($F{IMAGE_FRONT}).getBytes("UTF-8"))) 
    

    来源:

      <image>
        <reportElement x="60" y="60" width="510" height="230" uuid="a06352ef-7ebf-4691-91a1-c8bc1371f90b">
        <property name="com.jaspersoft.studio.unit.x" value="pixel"/>
        </reportElement>
        <imageExpression>
        <![CDATA[new java.io.ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64(new String($F{CLOB_DATA_FIELD}).getBytes("UTF-8")))]]></imageExpression>
        </image>
    

    Base64 未定义问题在将 jar 文件添加到我的报告 -> 属性 -> JAVA 构建路径 -> 添加外部 JAR ->jasperreports-6.1.0.jar 后清除 从下载的jar文件 https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports/6.1.0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多