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