web-dev-qa-db-ja.com

Jasper Reportテンプレートの画像ソースとしてbase64を使用するにはどうすればよいですか?

したがって、私の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,

これが私が使っている画像です

just a random screenshot

次に、 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>
      

私は一歩を逃していますか?

8

パラメータをStringとして渡すと、jasper reportはその絶対ファイルパスを信じるようになるため、別のクラスが必要になります。最も明白なのはJava.awt.ImageまたはJava.io.InputStreamです。

必要なコードが少なくなるため、Java.io.InputStreamを選択します。そのため、最初に行う必要があるのは、decodebase64 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>

最高のものを期待し、プレビューを押します:

Result

重要なお知らせsmileyfaceimageなしである必要があります:data:image/png;base64,

[〜#〜] edit [〜#〜]:OP(コメント)の問題は、古いjasper report lib(3.0)では必要なことでしたimageExpression @see class="Java.io.InputStream"でクラスを指定するには、これが6.0でも機能するため、投稿が更新されました。

12
Petter Friberg

なんらかの方法で画像をデコードする必要があります。 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>

これを使用して画像を埋め込みますが、変数、フィールド、またはパラメーターでも機能するはずです。

6
Durandal

外部ライブラリなしの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>
1
Rok T.