3

我正在尝试在服务器上完全渲染和导出 FusionCharts。我知道诸如 FCimg 和 FusionCharts .NET 解决方案之类的解决方案。我还实现了一个使用 Process 类来运行 wkhtmltoimage 的 Java 解决方案。

但是,我正在尝试找到一个纯 Java 解决方案来执行此操作。我有一个 html 文件,其中包含 FusionCharts JS 库和生成融合图表的代码。我发现 JxBrowser 可以正确呈现图表,但它需要 X-Server 才能在 Linux 上运行。我也尝试过 Cobra/Lobo 浏览器,但它并不完全支持 JavaScript。有没有其他方法可以在服务器上渲染和导出融合图表,或者至少渲染一个包含 JavaScript 的 html 文件(并且不需要 xserver)?

提前感谢所有帮助!

4

1 回答 1

1

更新:不需要 xserver: WebRenderer的解决方案。Swing 版是截至 2012 年 7 月 9 日唯一支持 HTML5 的版本。您可以使用 swing 版来捕获图像而无需 GUI。


我找到了一种使用 Eclipse 的 SWT 浏览器的方法。但是,这不能在无头模式下运行。您将不得不使用 xserver 来实现它。看到这个问题

由于这需要 xserver 并且不能在无头模式下运行,我建议使用 JxBrowser。它要简单得多,您只需要生成一个包含所有融合图表脚本的 html 文件。见#1、#2、#3

  1. 您必须创建一个包含标题 ( <html><head>)、jquery.min.js、FusionCharts.js、FusionCharts.HC.js、FusionCharts.HC.Charts.js 的 template.html 文件。确保这些脚本中的每一个都在它们自己的脚本标签中 ( <script type="text/javascript"> [js code] </script>)

  2. 现在添加另一个 JavaScript 函数,它有自己的脚本标签,其中包含渲染图表的步骤。例如:

function load() { FusionCharts.setCurrentRenderer('javascript'); var chart = new FusionCharts("swf", 'chart0', "width", "height", "0", "1"); chart.setXMLData("XML DATA HERE"); chart.render("divNAMEHere"); }

  1. 现在您需要调用 load() 函数 onload,创建一个 div 来呈现图表,并结束 html 文件。例如:

    `

测试`
  1. 创建一个导入 eclipse swt 浏览器库的新类。实例化显示、Shell 和浏览器(以此为指导帮助了解正在发生的事情:http ://www.roseindia.net/tutorials/swt/swt-browser.shtml )。

  2. 将浏览器的文本 ( browser.setText("htmlcode")) 设置为来自 template.html 的 html 代码。最好的方法是使用 BufferedReader 读取文件。

  3. 最后,图像需要一些时间来渲染。现在可能有更好的方法来做到这一点,但如果你想让它正常工作,我会设置一个计数,它会在一定数量后捕获图像。这是您需要添加到最后的内容:

    int i = 0;
    while (!shell.isDisposed())
    {
      if (!display.readAndDispatch())
      {
         display.sleep();
         i++;
       //  System.out.println(i);
         if(i==100)
         {
             GC source = new GC (shell);  
             Image image = new Image(display, browser.getClientArea()); 
             source.copyArea(image, 0, 0);
             ImageLoader io = new ImageLoader ();
             io.data = new ImageData[] { image.getImageData() };
             File f = new File (currentDir+"/workpng.png");
             io.save (f.getAbsolutePath(), SWT.IMAGE_PNG); 
         }
      }
    }
    
于 2012-06-22T14:18:10.360 回答