2016年10月11日火曜日

Jasperで画像データ(Imageデータ)をDBから表示する方法

JapserReportでは、画像データ(Imageデータ)を出力することができるが、
DBに格納された画像データを出力する場合、少し工夫が必要のようだ。

ここでは、Postgresのbytea型に画像データが入っているとする。
そのデータをJasperReportで画像として出力する。

ここで、ポイントとなるのが、JasperReportからbytea列をSQLで取得したときに
果たして、どういう型で取得されるのかということである。

結論から言うと、実はbytea列がどの型で取得されるかが、DB接続に使用しているAPIによって、違うということだ。

そのため、ADempiereなどのアプリケーションからはうまく画像表示できるのに、
iReport上で実行してみると画像表示できないといったことが発生する。
これは、ADempiereのアプリから実行されるAPIとiReportから実行されるAPIで
bytea列型の扱い方法が違うから発生していると思われる。

これを解決するためには、byteaの列をBase64エンコードして、テキストデータとして扱うことがポイントである。

こうすることで、APIの仕様にかかわらず画像データをテキストデータとして扱うことが可能であり、iReport上からも、ADempiereなどのアプリケーションからも画像データを出力することが可能となる。



以下が設定方法である。

■SQLでバイナリデータ取得
☆byteaの列をBase64でエンコードして、テキストデータとして取り出す。
 
 以下のSMB_QRCode_DocNoは、bytea型でPostgresに定義されている。
 以下のSQLで、Base64でエンコードしてテキストデータとしている。

 SELECT encode(cf.SMB_QRCode_DocNo::bytea, 'base64') AS SMB_QRCode_DocNo
 FROM M_InOutConfirm cf
 ・・・・

 ※Edit Queryダイアログで、表示される該当バイナリ列(SMB_QRCode_DocNo)のDataTypeが「java.lang.String」であることを確認しておく。




■イメージオブジェクトの設定
 ①ImageExpressionプロパティに以下を設定。

new java.io.ByteArrayInputStream(javax.xml.bind.DatatypeConverter.parseBase64Binary((String)$F{smb_qrcode_docno}))

 ※DBから取得したBase64のテキストをByte配列にコンバートし、それを引数にInputStreamを作成している。




②Expressionクラス
  java.io.InputStreamを選択する。
  ※①の戻り値の型のため
 
③以下は念のため設定しておく
  UsingCacheプロパティ:チェックしておく。
  On Error Type:Blank







0 件のコメント:

コメントを投稿