我正在尝试将图像从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...
答案 0 :(得分:2)
在PostgreSQL中,bytea
类型不是BLOB,您不能使用流。在SQL标准术语中,它是一个字节字符串。它应该加载到Java中的字节数组。
如果要在PostgreSQL中使用BLOB技术,则必须使用大对象功能。
http://www.postgresql.org/docs/current/interactive/largeobjects.html
答案 1 :(得分:2)
select convert(your_image,'base64') as img from yourtable
java.io.InputStream
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 :(得分:1)
将图像从blob(postgresql)显示到 iReport 中的图像
在Postgresql中,图像存储为blob-oid
ReportController中的代码