Comment puis-je utiliser base64 en tant que source de l'image dans une Jasper modèle de Rapport?
Donc dans mon fichier jrxml j'ai le texte suivant:
<parameter name="smileyfaceimage" class="java.lang.String"/>
Puis-je y faire référence dans:
<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>
N'est-ce pas exact?
J'ai essayé de la base64 à la fois avec et sans:
data:image/png;base64,
Voici l'image, je travaille avec
Ensuite, j'ai utilisé https://www.base64-image.de/ ou de tout site au hasard pour obtenir la chaîne base64. J'ai testé la chaîne qu'il produit et qu'il est valide.
Maintenant dans mon code;
- définir la valeur d'une variable à la based64 chaîne
- sur le modèle
- définir le paramètre:
<parameter name="smileyfaceimage" class="java.lang.String"/>
- définir le paramètre:
-
puis ajouter les données de l'image à la 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>
-
Ai-je raté une étape?
Voir aussi: stackoverflow.com/a/39320863/59087
OriginalL'auteur iCodeLikeImDrunk | 2015-11-06
Vous devez vous connecter pour publier un commentaire.
Passage de paramètre comme
String
rend jasper report crois que c'est un chemin absolu du fichier, de sorte que vous besoin d'une autre classe. Le plus évident seraitjava.awt.Image
oujava.io.InputStream
.- Je choisir
java.io.InputStream
, car cela nécessite moins de code, de sorte que la première chose que nous devons faire maintenant est dedecode
labase64
imageString
.Il y a plusieurs Base64 classe qui va faire le travail, je choisis le
org.apache.commons.codec.binary.Base64
depuis apachecommons-codec.jar
est déjà distribué avec jasper report (dépendances). Le décodage de nous donner un tableau d'octetsbyte[]
, alors maintenant nous avons seulement besoin d'ajouter unByteArrayInputStream
Le code java serait:
De temps à passer dans le jasper rapport
imageExpression
De l'espoir pour le meilleur et appuyez sur la aperçu:
Avis Important: Le
smileyfaceimage
doit être sans:data:image/png;base64,
MODIFIER: Le problème de l'OP (commentaires), avec de vieux jasper rapport lib (3.0), vous devez indiquer la classe dans le
imageExpression
@voirclass="java.io.InputStream"
le post a été mise à jour en conséquence puisque cela fonctionne aussi en 6.0.nope(j'avais), im la correction de certains vieux de la vieille de la base de code, donc je ne sais même pas comment faire pour obtenir une stacktrace pour elle lol...
dragonnet, suppose que ça doit être ma merde base de code lol. je vais travailler avec ce que tu me montrer et j'espère le faire fonctionner! merci!
Il commence avec "iVBORw0KGgoAAAANS" et se termine avec "ywAAAAASUVORK5CYII="
yep. c'est exactement. im sûr qu'il y a quelque chose dans le code c'est faire quelque chose de stupide à l'origine de ce pas travailler. ive regarder autour d'autres solutions en ligne et ils ont l'air sur la même que la vôtre.
OriginalL'auteur Petter Friberg
Vous avez besoin pour décoder l'image d'une certaine manière, par exemple l'utilisation d'un imageExpression:
Je suis en utilisant ce pour intégrer des images, mais il devrait fonctionner avec une variable, le champ de paramètre ou de trop.
OriginalL'auteur Durandal
Java 8+ sans bibliothèques externes:
Si cela ne fonctionne pas, cela devrait certainement:
OriginalL'auteur Rok T.