Отображение изображения в Ireports с использованием PostgreSql

Я пытаюсь загрузить изображение из базы данных PostgreSQL в jaspersoft ireports (4.0), но получаю сообщение об ошибке.

В PostgreSQL изображение хранится как объект bytea. В отчетах я изменил свойство поля изображения на java.io.InputStream.

После размещения изображения в отчете были установлены следующие свойства:

Класс выражения: java.io.InputStream Выражение изображения: image field

Я также попробовал этот учебник, чтобы показать blob-изображения в ireport.

Отображается следующая ошибка:

Error filling print... Image read failed. 
Setting up the file resolver... 
net.sf.jasperreports.engine.JRException: Image read failed. 
    at net.sf.jasperreports.engine.util.JRJdk14ImageReader.readImage(JRJdk14ImageReader.java:73) 
    at net.sf.jasperreports.engine.util.JRImageLoader.loadImage(JRImageLoader.java:245) 
    at net.sf.jasperreports.engine.JRImageRenderer.getImage(JRImageRenderer.java:476) 
    at net.sf.jasperreports.engine.JRImageRenderer.getDimension(JRImageRenderer.java:512) 
    at net.sf.jasperreports.engine.fill.JRFillImage.fitImage(JRFillImage.java:1251) 
    at net.sf.jasperreports.engine.fill.JRFillImage.prepare(JRFillImage.java:1173) 
    at net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:329) 
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:419) 
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:378) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2038) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:760) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:270) 
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:128) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946) 
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:845) 
    at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:58) 
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417) 
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247) 
    at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:877) 
    at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572) 
    at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997) 
Print not filled. Try to use an EmptyDataSource...

person 3502    schedule 08.12.2011    source источник
comment
Можете выложить код и шаблон отчета?   -  person Alex K    schedule 08.12.2011
comment
Я использую профессиональную версию ireports. Я создал таблицу в postgres со следующими столбцами: log -double lat -double image-bytea Template - пустой шаблон A4. Затем, после размещения элемента отчета изображения из палитры в отчете, настроил выражение изображения и класс выражения (java .io.InputStream) После запуска отчета отображается сообщение об ошибке. Ошибка отображения страницы отчета. Подробности смотрите в консоли. ошибки, которые я разместил выше в вопросе. Но когда я удаляю элемент изображения из отчета, он отлично работает   -  person 3502    schedule 08.12.2011
comment
Можете ли вы опубликовать выражение изображения?   -  person Alex K    schedule 08.12.2011


Ответы (3)


В PostgreSQL тип bytea не является BLOB, и вы не можете использовать поток. В стандартных терминах SQL это строка байтов. Он должен быть загружен в массив байтов в Java.

Если вы хотите использовать методы BLOB в PostgreSQL, вы должны использовать функцию большие объекты.

http://www.postgresql.org/docs/current/interactive/largeobjects.html

person kgrittn    schedule 27.04.2012

потратил почти один день, наконец нашел решение;

  1. в SQL-запросе select convert(your_image,'base64') as img from yourtable
  2. установить класс выражения изображения на java.io.InputStream
  3. в выражении изображения net.sf.jasperreports.engine.util.JRImageLoader.getInstance(new SimpleJasperReportsContext()).loadAwtImageFromBytes(javax.xml.bind.DatatypeConverter.parseBase64Binary($F{img}))

ИЗМЕНИТЬ:

Моя версия Postgresql: 9.4,

Благодаря FiruzzZ он заявил, что в postgresql 9.1 вместо функции преобразования доступно кодирование (bytea, 'base64').

person Ismail Sahin    schedule 26.07.2016
comment
convert (bytea, string) не работает, функция неизвестна для Postgres 9.1. Я использовал encode(bytea,'base64') и работал - person FiruzzZ; 29.08.2016

Отображение изображения из большого двоичного объекта (postgresql) в изображение в iReport

В Postgresql изображение хранится как blob-oid
Код внутри ReportController

  1. получить эту строку oid из базы данных, преобразовать ее в байт
  2. преобразовать значение массива байтов в значение InputStream
  3. сопоставьте его с параметром, который будет использоваться внутри iReport
  4. возьмите один элемент изображения, измените его тип на java.io.InputStream
  5. Создайте один параметр типа java.io.InputStream (используйте то же имя, что и в ReportController).
  6. Теперь создайте проект и запустите
person Pravin Yadav    schedule 20.07.2012