【问题标题】:Displaying image in Ireports using PostgreSql使用 PostgreSql 在 Ireports 中显示图像
【发布时间】:2011-12-08 11:30:01
【问题描述】:

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

在 PostgreSQL 中,图像被存储为 bytea 对象。在 ireports 中,我已将 image 字段的属性更改为 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...

【问题讨论】:

  • 你能把代码和报告的模板贴出来吗?
  • 我正在使用 ireports 专业版 我在 postgres 中创建了一个表格,其中包含以下列 log -double lat -double image-bytea 模板 - 空白 A4 模板 然后将调色板中的图像报告元素放置在配置的报告上图像表达式和表达式类(java.io.InputStream)运行后显示报告错误消息。“显示报告页面时出错。有关详细信息,请参见控制台'。错误我已经在上面的问题中发布。但是当我删除图像元素时从报告它工作正常
  • 可以发图片表达吗?

标签: postgresql jasper-reports ireport


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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}))

    编辑:

    我的 Postgresql 版本是:9.4,

    感谢 FiruzzZ,他说在 postgresql 9.1 中可以使用 encode(bytea,'base64') 而不是 convert 函数。

    【讨论】:

    • convert (bytea, string) 不起作用,该函数对于 Postgres 9.1 是未知的。我使用了 encode(bytea,'base64') 并且工作了
    【解决方案3】:

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

    中的图像

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 2018-02-26
      相关资源
      最近更新 更多