How/Can 我在 Jasper Report 模板中使用 base64 作为图像源?
How/Can I use base64 as image source in a Jasper Report template?
所以在我的 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"/>
然后将图像数据添加到页面:
<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>
我是不是漏了一步?
您需要以某种方式解码图像,例如使用图像表达式:
<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>
我正在使用它来嵌入图像,但它也应该适用于变量、字段或参数。
将参数作为 String
传递使 jasper 报告相信它是绝对文件路径,因此您需要另一个 class。最明显的是 java.awt.Image
或 java.io.InputStream
.
我选择java.io.InputStream
,因为这样需要的代码更少,所以我们现在要做的第一件事就是decode
base64
图像String
。
有several Base64 class that will do the job, I choose the org.apache.commons.codec.binary.Base64
since apache commons-codec.jar
is already distributed with jasper report (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(评论)的问题是使用旧的jasper报告库(3.0)你需要在[=23中指定class =] @see class="java.io.InputStream"
post 已经更新,因为这也适用于 6.0.
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>
在我的oracle DB中,我有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>
将 jar 文件添加到我的报告 -> 属性 -> JAVA 构建路径 -> 添加外部 JAR ->jasperreports-6.1 后清除了 Base64 未定义问题。0.jar
下载的jar文件
https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports/6.1.0
所以在我的 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"/>
- 设置参数:
然后将图像数据添加到页面:
<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>
我是不是漏了一步?
您需要以某种方式解码图像,例如使用图像表达式:
<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>
我正在使用它来嵌入图像,但它也应该适用于变量、字段或参数。
将参数作为 String
传递使 jasper 报告相信它是绝对文件路径,因此您需要另一个 class。最明显的是 java.awt.Image
或 java.io.InputStream
.
我选择java.io.InputStream
,因为这样需要的代码更少,所以我们现在要做的第一件事就是decode
base64
图像String
。
有several Base64 class that will do the job, I choose the org.apache.commons.codec.binary.Base64
since apache commons-codec.jar
is already distributed with jasper report (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(评论)的问题是使用旧的jasper报告库(3.0)你需要在[=23中指定class =] @see class="java.io.InputStream"
post 已经更新,因为这也适用于 6.0.
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>
在我的oracle DB中,我有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>
将 jar 文件添加到我的报告 -> 属性 -> JAVA 构建路径 -> 添加外部 JAR ->jasperreports-6.1 后清除了 Base64 未定义问题。0.jar 下载的jar文件 https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports/6.1.0