如何在服务器端Java中使用像D3.js或Raphaël这样的JavaScript图表库

时间:2012-07-04 14:31:47

标签: java javascript raphael d3.js

我想将D3.js(或者Raphaël)用于使用XSL-FO和Java的后端生成的报告。应该使用这些JavaScript库有以下几个原因:

  1. 它们呈现的图表比我从Java库(IMO)中看到的图表更漂亮
  2. 他们支持SVG和PNG(据我所知),这是XSL-FO所需要的
  3. 它们也将用于应用程序的前端部分。使用Java在后端重用它们可以减少开发人员的学习曲线和代码库占用空间。
  4. 因此,使用任何类似的Java库是一个不太有利的选择。

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

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

2 个答案:

答案 0 :(得分:4)

您可以使用phantom.js。它是一个基于webkit的无头浏览器,允许您在不需要浏览器的情况下运行JavaScript。

使用此功能,您只需执行系统调用即可为您的JavaScript代码和输入运行phantom.js。然后它会相应地创建您的输出。请参阅this example

答案 1 :(得分:3)

我大约一年前就开始研究了这个问题。我设法使用Rhino的部分HighCharts(javascript中的SVG图形)。我不得不将env.js插入其中并遇到很多关于canvas Element的问题,尤其是在Bounding Boxes计算方面。 Rhino中的对象没有实现getBBox(),它不容易被伪造。

我的目标是最终用Batik以PDF格式呈现它...花了太多时间,我们决定转用另一种技术。

所以,今天,我们使用的是wkhtmltopdf,它不是Java,但是它是一个静态可执行文件,可以嵌入到jar中并从java端轻松启动。顺便说一句,如果你想渲染一些东西,xvfb在Linux上是强制性的。这与PhantomJS非常相似