使用PostgreSql在Ireports中显示图像

时间:2011-12-08 11:30:02

标签: postgresql jasper-reports ireport

我正在尝试将图像从PostgreSQL数据库加载到jaspersoft ireports(4.0)中,但我收到错误。

在PostgreSQL中,图像存储为bytea对象。在ireports中,我将图像字段的属性更改为java.io.InputStream

将图像放入报告后,设置了以下属性:

表达式类:java.io.InputStream 图像表达式:image field

我还尝试了this教程在ireport中显示blob图像。

显示以下错误:

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 个答案:

答案 0 :(得分:2)

在PostgreSQL中,bytea类型不是BLOB,您不能使用流。在SQL标准术语中,它是一个字节字符串。它应该加载到Java中的字节数组。

如果要在PostgreSQL中使用BLOB技术,则必须使用大对象功能。

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

答案 1 :(得分:2)

花了差不多一天,终于找到了解决方案;

  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})) 中的
  4. 修改

    我的Postgresql版本是: 9.4

    感谢FiruzzZ他说postgresql 9.1中的 而不是转换函数,编码(bytea,'base64')可用。

答案 2 :(得分:1)

将图像从blob(postgresql)显示到 iReport 中的图像

在Postgresql中,图像存储为blob-oid
ReportController中的代码

  1. 从数据库中获取oid字符串将其转换为byte
  2. 转换 InputStream 值中的字节数组值
  3. 将其映射到将在 iReport
  4. 中使用的参数
  5. 将一个Image元素的类型更改为 java.io.InputStream
  6. 创建一个类型 java.io.InputStream 的参数(使用与 ReportController 中映射的名称相同的名称)
  7. 现在构建项目并运行