Отображение изображения в Ireports с использованием PostgreSql - PullRequest
5 голосов
/ 08 декабря 2011

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

В PostgreSQL изображение хранится как объект bytea. В ireports я изменил свойство поля изображения на 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...

Ответы [ 3 ]

2 голосов
/ 27 июля 2016

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

  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').

2 голосов
/ 27 апреля 2012

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

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

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

1 голос
/ 20 июля 2012

Отображение изображения из BLOB-объекта (postgresql) в изображение в iReport

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

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