如何在服务器端Java中使用类似于D3.js或Raphaël的JavaScript图表库?

10
我希望使用 D3.js(或者Raphaël)来生成与Java的XSL-FO报告相关的后端报告。出于以下几个原因,应该使用这些JavaScript库:
  1. 它们比我从Java库中看到的更美观的图表(以我的观点为基础)
  2. 它们支持SVG和PNG(据我所知),这在XSL-FO中是必需的
  3. 它们还将用于应用程序的前端部分。在Java的后端重复使用它们可以降低开发人员的学习曲线和代码库占用。

因此,使用任何类似的Java库都不是一个很好的选择。

现在,使用D3.js与Java最直接的方法是使用像selenium这样的重型工具,以便呈现虚拟HTML页面并在其中执行JavaScript。但对我来说,那似乎有些过度了。

有没有更简单的方式在同一个Java进程中直接执行这种JavaScript?我问这个问题是因为D3.js是设计用于在HTML文档的上下文中工作的。我不确定是否可以使用Rhino或其他Java脚本实现来完成这个任务。


嗨Lukas,你有找到在服务器端Java中呈现基于D3的图表的好解决方案吗?我现在也遇到了完全相同的问题,任何反馈或提示都将非常感激。 - Gábor Lipták
1
没有,我还没有找到任何解决方案。但是你可以在我的问题上设置赏金,以吸引更多读者并可能得到答案... - Lukas Eder
谢谢反馈。我可能会使用phantomjs。我们拭目以待。 - Gábor Lipták
你尝试过 JavaFx 的 Webview 吗? - Gábor Lipták
@GáborLipták:还没有。 - Lukas Eder
请参阅 https://dev59.com/ClbTa4cB1Zd3GeqP9EIU。 - Pino
3个回答

3
你可以使用phantom.js。它是一个基于webkit的无头浏览器,允许您在不需要浏览器的情况下运行JavaScript。
使用它,您只需执行系统调用以运行带有JavaScript代码和输入的phantom.js。然后它将相应地创建您的输出。请参见this example

看起来不错(而且很疯狂!)。使用Raphaël的极坐标时钟示例是令人鼓舞的。 - Lukas Eder
嗯,仔细看了一下,这不是Java / Javascript库。不幸的是,我将无法在系统上安装其他类型的程序... - Lukas Eder
我可以确认,使用PhantomJS可以导出NVD3图表(基于d3)。您需要使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind,因为PhantomJS没有“bind”,并且需要等待渲染图形后才能进行PhantomJS导出。我只是使用转换回调在窗口对象中设置了一个变量(https://dev59.com/cWgv5IYBdhLWcg3wTvLL#10692220),在PhantomJS中等待页面.evaluate说窗口属性已设置。像应该的那样工作。注意SVG的大小、cliprect和phantomjs的viewportsize。 - Gábor Lipták

3

大约一年前我开发了这个项目。我在Rhino中使用了HighCharts(用JavaScript进行SVG图形绘制)的部分功能。我必须将env.js插入其中,并遇到了很多关于canvas元素的问题,尤其是围绕边界框计算的问题。Rhino中的对象没有实现getBBox()方法,因此无法轻松地伪造它。

我的目标是最终使用Batik将其呈现为PDF格式...这花费了太多时间,我们决定转向另一种技术。

所以,今天我们使用的是wkhtmltopdf,它不是Java,但是它是一个静态可执行文件,可以嵌入到jar中,并且可以轻松地从Java端启动。顺便说一下,如果您想呈现某些内容,则在Linux上xvfb是必需的。这与PhantomJS几乎相同。


感谢这些提示。是的,如果需要这么多的补丁,那么整个事情更像是一个hack而不是解决方案... - Lukas Eder
请注意,使用Selenium(及其HtmlUnitDriver),同样需要进行大量的修补工作... - Lukas Eder
HTMLUnit使用Rhino引擎...因此,如果您不使用Firefox驱动程序,您将无法轻松地完成您想要的操作。 - Grooveek
我尝试了各种组合。Firefox驱动程序可以工作,或者通过一些严重的修补,Firefox DesiredCapabilities似乎也部分工作,因为HTMLUnit在某种程度上扩展了Rhino引擎。 - Lukas Eder
我没有提到wkhtmltopdf有一个wkhtmltoimage,它比全局的selenium安装更小。事实上,如果你不想让Firefox启动时间影响性能,你将不得不加强selenium网格。像wkhtmltoimage或phantom.js这样的Qt引擎比使用Selenium连续停止/启动的FF实例更具有反应性。 - Grooveek


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接