5

我正在编写一个应用程序,让用户使用 Raphael.JS 生成图像。我想要的次要功能之一是生成 Raphael 画布的 PNG。

这是我脑海中的一般管道:

  1. 用户输入参数
  2. 我们使用 Raphael 调用生成 JS
  3. 我们生成一个执行上述操作的 JS 包装器,并在包含的 div 上调用 .innerHTML,为我们提供 SVG(然后我们将其发送到某个地方)
  4. 我们执行 JS 包装器
  5. SVG 被发送到 ImageMagick 并弹出一个 PNG

第 4 步是我需要一些指导的步骤。用户可能正在使用 IE;我们不能保证 JS 曾经在 SVG 浏览器中执行过。在任何情况下,我们都需要它在服务器端运行以使其可靠。所以这是我到目前为止提出的三种可能性:

  • 在服务器上安装 Firefox 并在 Firefox 中运行(3)的结果。这个选项很糟糕,因为安装 FF 意味着在我们的服务器上安装一堆 X 东西,运行 FF 会带来很多开销,而且我真的不想在跟踪进程并在完成后将其杀死。
  • 使用 Node.js + jsdom ( http://github.com/tmpvar/jsdom )。这里的缺点是尚不清楚 jsdom 的支持程度——所谓的站点 jsdom.org 并不真正存在。另外,我找不到任何文档。
  • 也许和犀牛做点什么?据我所知,Rhino 对 DOM 的支持比 Node.js 还要少。

所以......所有这三个选项都很糟糕。我认为。我错了吗?还有其他方法吗?

4

3 回答 3

3

Solved this with wkhtmltoimage. Ugly solution, but it works.

于 2010-11-22T23:42:35.807 回答
1

在客户端上序列化 SVG 文档后,您只需要在服务器上运行 SVG 渲染器和/或光栅器来生成 PNG。我不清楚您认为 JS 包装器会做什么,或者为什么需要它。由于您发送的 SVG 文档不包含动态内容,您只需将序列化的 SVG 文档发送到服务器上的光栅化器,以便将其光栅化为 PNG。

SVG 渲染器/光栅器可以只是一个调用 ImageMagick 的 CGI 脚本,或者可以是更复杂的东西。就个人而言,我建议设置一个运行 Apache Batik 的 servlet,其中包括一个SVG Rasterizer,并且可以通过编程方式调用。快速的谷歌搜索表明这是 Batik 的一项非常常见的任务:http: //www.mail-archive.com/batik-users@xml.apache.org/msg06116.html

于 2010-08-05T16:11:57.653 回答
0

在通过 ImageMagick 运行之前,您可以尝试在服务器上将 VML 转换为 SVG 。我知道项目本身是 PHP,但转换是使用 XSL 完成的(文件在下载存档中),因此应该可以移植到任何服务器平台。

于 2010-07-29T18:32:11.080 回答