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

How to show an image from an image inputstream in Birt?

我正在使用 to develop some reports,I want to display some pie charts in the pdf report,I found the birt chart function is not very flexiable,so I want to use to generate an image and show it in the report instead. Now I have a question: can we show image in 和图像输入流,这样就不需要生成图像并将其存储在某个地方? 我知道我可以将图像生成为 jpg 文件并将其存储在某个地方,然后我可以通过此图像的位置访问它 file.But 如果我这样做,每次我们查看 birt 报告时,会生成一个新的图片文件,我不想生成那么多文件。

有什么好主意吗?

有两种可能的解决方案。

如您所说,您可以将图表保存为文件。 我在生成数十个控制图的报告中执行此操作(德语:"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<->Javascript 的一些东西),但它有效。 我从来没有在 JFreeChart 中使用过它,但这就是我们使用一家名为 "ID Automation".

公司的古老商业 Java 库生成 DataMatrix(“二维条码”)的方法

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

Java 库的 Java 脚本包装器库中的函数 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 一起使用。然而,从未在生产中使用过它。