如何在Jasper报表模板中使用Base64作为图像源?

13

所以在我的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字符串。我测试了它生成的字符串,它是有效的。

现在,在我的代码中:

  • 将变量的值设置为base64字符串;
  • 在模板上:
    • 设置参数:<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>
      

我是否漏掉了一个步骤?


参见:https://dev59.com/6JDea4cB1Zd3GeqPgs1Q#39320863 - Dave Jarvis
6个回答

21

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

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

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

最好的希望并点击预览:

结果

重要通知:笑脸图片需要:data:image/png;base64,

编辑: 用户评论中的问题是,对于旧版jasper报表库(3.0),您需要在imageExpression中指定类@see class="java.io.InputStream",因为在6.0中也有效。该帖子已经相应地更新。


不行(希望我能),我正在修复一些非常老的代码库,所以我甚至不知道如何为它获取堆栈跟踪信息,哈哈... - iCodeLikeImDrunk
嗨,看来这肯定是我的糟糕代码库了哈哈。我会根据你展示的内容进行调试,希望能让它正常工作!谢谢! - iCodeLikeImDrunk
它以"iVBORw0KGgoAAAANS"开头,并以"ywAAAAASUVORK5CYII="结尾。 - Petter Friberg
是的,完全正确。我确定代码中有些愚蠢的东西导致它无法工作。我在网上找了其他解决方案,它们看起来和你的差不多。 - iCodeLikeImDrunk
让我们在聊天中继续这个讨论 - iCodeLikeImDrunk

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>

我使用这个来嵌入图片,但它也可以与变量、字段或参数一起使用。


这对我不起作用,任何帮助将不胜感激。 - Shelly

2

没有外部库的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>

0
在我的Oracle数据库中,我有CLOB数据类型用于Base64图像,但是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>

在我的报告 -> 属性 -> Java构建路径 -> 添加外部JAR -> jasperreports-6.1.0.jar 中添加jar文件后,Base64未定义问题已得到解决。 该jar文件可从以下链接下载: https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports/6.1.0

0

我尝试了上面的解决方案,但对我无效。 我目前正在使用Jasper Reports版本6.19.1,并在net.sf.jasperreports.util中找到了这个Base64Util类。您可以查看它并检查方法 可以帮助解决您的问题

<image evaluationTime="Report">
                <reportElement x="400" y="50" width="154" height="84" uuid="fa0e76f4-ffe9-4090-8a5c-68683b97ac38"/>
                <imageExpression><![CDATA[net.sf.jasperreports.util.Base64Util.decode($P{photo})]]></imageExpression>
            </image>

$P{photo} 是我的变量,其中包含了 base64 字符串

解码方法会将一个 byte[] 数组返回给你的 ImageExpression

public static byte[] decode(String data) throws IOException {
        ByteArrayInputStream input = new ByteArrayInputStream(data.getBytes(StandardCharsets.US_ASCII));
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        decode(input, out);
        return out.toByteArray();
    }

0
我正在使用Jasper 6.20.6版本。 我尝试了所有我找到的类似解决方案(在Stackoverflow和Jasper论坛上)。 都没有起作用。 我发现唯一的方法是完全删除字符串参数,然后直接将base64编码的图像放入decodeBase64()调用中。
这是完整的报告代码。 有两张图片,第一张使用字符串参数,但不起作用,它被渲染为空白框。 第二张图片直接在decodeBase64()调用中使用base64编码的图像,似乎可以工作。
报告jrxml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.20.6.final utlizzo versione della libreria JasperReports6.20.6-5c96b6aa8a39ac1dc6b6bea4b81168e16dd39231  -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="test001" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="1a700ddc-bfd8-437f-9138-b41487cbe1ea">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <variable name="myImg1" class="java.lang.String">
        <variableExpression><![CDATA["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"]]></variableExpression>
    </variable>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="240" splitType="Stretch">
            <staticText>
                <reportElement x="10" y="0" width="100" height="30" uuid="1c61fd46-226e-491b-9891-6050014f68f6"/>
                <text><![CDATA[test texte, test text]]></text>
            </staticText>
            <image>
                <reportElement mode="Transparent" x="70" y="10" width="190" height="210" uuid="21e88b95-1d09-4108-8cbf-dcf8b4b2ed9e"/>
                <box padding="1">
                    <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
                    <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
                    <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
                    <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
                </box>
                <imageExpression><![CDATA[new ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64($V{myImg1}.getBytes()))]]></imageExpression>
            </image>
            <image>
                <reportElement mode="Transparent" x="310" y="10" width="190" height="210" uuid="28050615-9a40-48c3-b64b-1e6271ee9a95"/>
                <box padding="1">
                    <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
                    <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
                    <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
                    <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/>
                </box>
                <imageExpression><![CDATA[new ByteArrayInputStream(org.apache.commons.codec.binary.Base64.decodeBase64("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".getBytes()))]]></imageExpression>
            </image>
        </band>
    </title>
    <pageHeader>
        <band height="35" splitType="Stretch"/>
    </pageHeader>
    <columnHeader>
        <band height="61" splitType="Stretch"/>
    </columnHeader>
    <detail>
        <band height="125" splitType="Stretch">
            <staticText>
                <reportElement x="150" y="20" width="100" height="30" uuid="d00ab4fa-eb41-47c8-9bb0-0c7884b5c36a"/>
                <text><![CDATA[test text 2, test text 2, ]]></text>
            </staticText>
        </band>
    </detail>
    <columnFooter>
        <band height="45" splitType="Stretch"/>
    </columnFooter>
    <pageFooter>
        <band height="54" splitType="Stretch"/>
    </pageFooter>
    <summary>
        <band height="42" splitType="Stretch"/>
    </summary>
</jasperReport>

这份报告的呈现方式如下:

enter image description here

有没有想法为什么使用字符串参数的图像框会呈现为白色框?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接