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