したがって、私の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文字列を取得しました。私はそれが生成する文字列をテストしました、そしてそれは有効です。
今私のコードで;
<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>
私は一歩を逃していますか?
パラメータをString
として渡すと、jasper reportはその絶対ファイルパスを信じるようになるため、別のクラスが必要になります。最も明白なのはJava.awt.Image
またはJava.io.InputStream
です。
必要なコードが少なくなるため、Java.io.InputStream
を選択します。そのため、最初に行う必要があるのは、decode
base64
image String
です。
仕事をする いくつか Base64クラスがあります。Apacheorg.Apache.commons.codec.binary.Base64
はすでにjasperレポートで配布されているのでcommons-codec.jar
を選択します( 依存関係 )。デコードするとバイト配列byte[]
が得られるので、ByteArrayInputStream
を追加するだけで済みます。
Javaコードは次のようになります:
InputStream stream = new ByteArrayInputStream(Base64.decodeBase64(smileyfaceimage.getBytes()));
それをジャスパーレポートに渡す時間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,
[〜#〜] edit [〜#〜]:OP(コメント)の問題は、古いjasper report lib(3.0)では必要なことでしたimageExpression
@see class="Java.io.InputStream"
でクラスを指定するには、これが6.0でも機能するため、投稿が更新されました。
なんらかの方法で画像をデコードする必要があります。 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>
これを使用して画像を埋め込みますが、変数、フィールド、またはパラメーターでも機能するはずです。
外部ライブラリなしのJava8 +:
<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>