如何在Birt中显示图像输入流中的图像?

时间:2015-07-16 03:26:11

标签: jfreechart birt

我正在使用开发一些报告,我想在 pdf报告中显示一些饼图,我发现birt图表功能不是很灵活,所以我想使用{ {3}}生成图片并在报告中显示。现在我有一个问题:我们可以使用图像输入流在中显示图像,这样图像就不需要生成并存储在某个地方了吗? 我知道我可以将图像生成为jpg文件并将其存储在某个地方,然后我可以通过此图像文件的位置访问它birt报告。但是如果我这样做,每次我们查看birt报告时,它将生成一个新的图像文件,我不想生成这么多文件。

有什么好主意吗?

1 个答案:

答案 0 :(得分:1)

有两种可能的解决方案。

正如您所说,您可以将图表保存为文件。 我在一份报告中这样做,我生成了几十个控制图(德语:" Regelkarten")。要在报告完成后整理,我将生成的文件名添加到列表中,然后删除报告的afterRender脚本中列表中的文件。

var images = vars["images"];
for (var i=0; i<images.size(); i++) {
    var fname = images.get(i);
    if (new java.io.File(fname)['delete']()) {
        log.debug("Temp. image file removed: " + fname);
    } else {
        log.error("Could not delete temp. image file " + fname);
    }
}

注意:这对于生成PDF或Word是可以的,但可能它不适用于HTML。

在我的情况下,我这样做是因为我可以通过评论清理例程来检查BIRT之外生成的图表。

另一种选择是生成byte[]。然后BIRT在日志文件中抱怨(Rhino,关于未知类型映射Java&lt; - &gt; Javascript),但它可以工作。 我从来没有在JFreeChart中使用它,但这就是我们如何使用来自一家名为&#34; ID Automation&#的公司的古老商业Java库来生成DataMatrix(&#34; 2D-Barcode&#34;) 34。

图片项引用row["dataMatrix_AuftID"],其定义为类型:Java Object,表达式:barcode.dataMatrix(row["AUFT_ID"],70,70,80,0.03)

Java库的Javascript包装器库中的函数barcode.dataMatrix调用Java库。它的最后几行看起来像这样,它可以让你了解你的情况:

    var image = new java.awt.image.BufferedImage(siz.width, siz.height, t);

    // get graphic context of image
    var imgGraphics = image.createGraphics();

    // paint DataMatrix in graphics context of image
    bc.paint(imgGraphics);

    // get the image's bytes in PNG format
    var baos = new java.io.ByteArrayOutputStream();
    javax.imageio.ImageIO.write(image, "png", baos);
    var bytes = baos.toByteArray();

    return bytes;

作为旁注,为了概念验证,我展示了在内存中生成SVG并将其与BIRT一起使用也是可能的。但是,从未在生产中使用过它。