【问题标题】:Render and Export FusionCharts on the Server在服务器上渲染和导出 FusionCharts
【发布时间】:2020-09-11 00:38:09
【问题描述】:

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

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

提前感谢所有帮助!

【问题讨论】:

    标签: java javascript fusioncharts


    【解决方案1】:

    更新:不需要 xserver 的解决方案:WebRenderer。自 2012 年 7 月 9 日起,Swing 版是唯一支持 HTML5 的版本。您可以使用 swing 版在没有 GUI 的情况下捕获图像。


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

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

    1. 您必须创建一个包含标题的 template.html 文件 (<html><head>), jquery.min.js, FusionCharts.js, FusionCharts.HC.js、FusionCharts.HC.Charts.js。确保每个 这些脚本在它们自己的脚本标签中 (<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 浏览器库的新类。实例化 Display、Shell 和 Browser(以此为指导帮助了解正在发生的事情: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); 
           }
        }
      }
      

    【讨论】:

      猜你喜欢
      • 2016-03-28
      • 2017-09-03
      • 2019-11-15
      • 1970-01-01
      • 2012-04-27
      • 2013-05-01
      • 2019-09-03
      • 1970-01-01
      • 2015-06-10
      相关资源
      最近更新 更多