0

我能够将我的图表呈现为不同的文件类型:

 dRenderer = ce.getRenderer("dv.SVG");//or dv.PNG
 dRenderer.setProperty(IDeviceRenderer.FILE_IDENTIFIER, path);

但是如何将二进制数据作为流获取?图表很可能会在某些人的浏览器中结束。所以磁盘上的文件我相对没用。

(在再次阅读之前将许多图表保存在磁盘上会很愚蠢,不是吗?)

简而言之:

可以将输出流而不是路径字符串作为“FILE_IDENTIFIER”(适用于“dv.SVG”和“dv.PNG”)

4

3 回答 3

1

我不太了解 BIRT,但您可以设置渲染器以在 a 中渲染图像BufferedImage并从中获取字节。

dRenderer = ce.getRenderer("dv.PNG");

BufferedImage img = new BufferedImage(size1, size2, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D)img.getGraphics();
dRenderer.setProperty(IDeviceRenderer.GRAPHICS_CONTEXT, g2d);
dRenderer.setProperty(IDeviceRenderer.CACHED_IMAGE, img);

// render

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
baos.flush();
byte[] imgBytes = baos.toByteArray();

我认为它不适用于 SVG。但是似乎有一个更新的 API 可以使用 BIRT 生成报告,您可以在其中将渲染选项传递给渲染器,尤其是设置一个选项OutputStream,您将给它一个ByteArrayOutputStream,然后您就可以将它提供给您的 Web 客户端。

于 2012-09-07T09:32:51.170 回答
1

如果您使用 SVG,请将文件标识符设置为输出流并确保设置内容类型(response.setContentType("image/svg+xml");

    try
    {   
        RunTimeContext rtc = new RunTimeContext( );
        rtc.setULocale( ULocale.getDefault( ) );

        Generator gr = Generator.instance( );
        GeneratedChartState gcs = null;
        Bounds bo = BoundsImpl.create( 0, 0, 600, 400 );
        gcs = gr.build( idr.getDisplayServer( ), chart, bo, null, rtc, null );

        idr.setProperty( IDeviceRenderer.FILE_IDENTIFIER, out ); 
        idr.setProperty(
                IDeviceRenderer.UPDATE_NOTIFIER,
                new EmptyUpdateNotifier( chart, gcs.getChartModel( ) ) );

        gr.render( idr, gcs );
    }

看到这个链接

于 2012-09-07T17:36:38.710 回答
0

如果要将 PNG 直接返回到浏览器,则需要某种服务器端机器。在这里,您可以看到如何使用 REST 服务进行操作

于 2012-09-07T09:40:19.670 回答