So in my jrxml file I have the following:
<parameter name="smileyfaceimage" class="java.lang.String"/>
Then I reference it in:
<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>
Is this not correct?
I've tried the base64 both with and without:
data:image/png;base64,
Here's the image im working with
Then I used https://www.base64-image.de/ or any random site to get the base64 string. I tested the string it produces and it's valid.
Now in my code;
<parameter name="smileyfaceimage" class="java.lang.String"/>
then add the image data to the page:
<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>
Am I missing a step?
Base64 images are primarily used to embed image data within other formats like HTML, CSS, or JSON. By including image data within an HTML document, the browser doesn't need to make an additional web request to fetch the file, since the image is already embedded in the HTML document.
Passing parameter as String
makes jasper report believe its a absolute file path, so you need another class. The most obvious would be java.awt.Image
or java.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
.
There are 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). The decode will give us a byte array byte[]
, so now we need only to add a ByteArrayInputStream
The java code would be:
InputStream stream = new ByteArrayInputStream(Base64.decodeBase64(smileyfaceimage.getBytes()));
Time to pass it into the jasper report 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>
Hope for the best and press the preview:
Important notice: The smileyfaceimage
needs to be without:data:image/png;base64,
EDIT: The problem of the OP (comments) was that with old jasper report lib (3.0) you need to specify the class in the imageExpression
@see class="java.io.InputStream"
the post has been update consequently since this works also in 6.0.
Java 8+ without external libraries:
<imageExpression><![CDATA[javax.imageio.ImageIO.read(new java.io.ByteArrayInputStream(Base64.getDecoder().decode($P{barcodeHeader})))]]></imageExpression>
If that doesn't work, this should definitely:
<imageExpression><![CDATA[javax.imageio.ImageIO.read(new java.io.ByteArrayInputStream(java.util.Base64.getDecoder().decode($P{barcodeHeader})))]]></imageExpression>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With