如何在网页上显示动态生成的图像(条形码)?

时间:2011-01-20 21:02:00

标签: java html grails

我有一个我动态生成的条形码,并希望传递给后来成为pdf的gsp。我不需要为了我自己的目的而坚持使用条形码,并且只想将图像从控制器传递给gsp。

有没有办法渲染作为变量传递的图像而不是指定src?

提前致谢。

编辑:

由于我是从gsp生成pdf的,因此我正在刷新响应的输出流,因此也无法对图像执行此操作,或者我收到错误。

此外,使用javascript / jQuery不起作用,因为页面永远不会被浏览器直接呈现。

看起来我唯一的选择就是暂时将图片保存在某处,然后将其删除......

3 个答案:

答案 0 :(得分:2)

我最近回答了similar question,也许它的答案对你有用。我会把它的一部分贴在这里。这基本上是Oded的“在......之外......”的建议。

class BarcodeController {
    def index = {
        def img // byte array, set this to the binary contents of your image

        response.setHeader('Content-length', img.length)
        response.contentType = 'image/png' // or the appropriate image content type
        response.outputStream << img
        response.outputStream.flush()
    }
}

然后,您可以在标签的src中访问您的图像,如下所示:

<img src="${g.link(controller: 'barcode', action: 'index')}"/>

这个答案似乎符合您对该问题的最后评论(关于使用PHP的类似解决方案)。

答案 1 :(得分:0)

您可以使用data URI scheme作为src属性。

  

数据URI方案是一种URI方案,它提供了一种在网页中包含数据的方法,就好像它们是外部资源一样。

以下是wikipeida文章的一个例子:

<img src="data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP
C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA
AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J
REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq
ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0
vr4MkhoXe0rZigAAAABJRU5ErkJggg==" alt="Red dot" />

除此之外,如果您使用的是服务器端技术,则可以从脚本(使用正确的mime类型)流式传输图像数据,并将src属性指向它。

Here是关于Grails的相关SO问题。

答案 2 :(得分:0)

只想为这个古老的问题做出贡献。我通过在BuildConfig.groovy中添加以下行来实现此目的:

plugins部分:

 plugins {
     // other plugins here
     // ...
     compile ":barcode4j:0.3"
     compile ":rendering:1.0.0"
 } 

dependencies部分:

 dependencies {
     // other dependencies here
     // ...
     compile 'avalon-framework:avalon-framework:4.1.5'
 }

然后我根据网上找到的代码示例添加了一个控制器。我特别需要一个DataMatrix生成器,但添加其他生成器应该很容易,只需向控制器添加方法即可。抱歉质量不好的代码(我是一个Groovy新手):

package myproject

import org.krysalis.barcode4j.impl.datamatrix.DataMatrix
import java.awt.Dimension

class BarcodeController {

    //  a valid PNG image, base64 encoded  
    static invalidBarcodeImgBase64 = """iVBORw0KGgoAA...=="""

    // Needs index.gsp for testing
    def index() {
        ['uuid': UUID.randomUUID(), 'fecha': new Date()]
    }

    def dataMatrix(String value) {

        if ((null == value) || (value.length() < 1) || (value.length() > 2000)) {
            def img = invalidBarcodeImgBase64.decodeBase64()
            response.setHeader('Content-length', new Integer(img.length).toString())
            response.contentType = 'image/png'
            response.outputStream << img
            response.outputStream.flush()

        } else {
            def generator = new DataMatrix()
            generator.dataMatrixBean.setMinSize(new Dimension(16, 16))
            renderBarcodePng(generator, value, [antiAlias: false])
        }
    }

    def datamatrix(String value) {
        dataMatrix(value)
    }
}

最后在条形码视图中的index.gsp进行测试:

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
  <head>
    <title>DataMatrix</title>
  </head>

  <body>
    <g:img dir="barcode" file="dataMatrix?value=${uuid}"/>
    <br />
    <br />
    <g:img dir="barcode" file="dataMatrix?value=${fecha}"/>
    <br />
    <br />
    <g:img dir="barcode" file="dataMatrix?value=Nothing to see here"/>
  </body>
</html>