2010-07-28 51 views
5

我正在編寫一個應用程序,讓用戶使用Raphael.JS生成圖像。我想要的一個輔助功能是生成Raphael畫布的PNG。以編程方式從Raphael.JS生成PNG圖像

這裏是在我的頭上一般管道:

  1. 用戶輸入的參數
  2. 我們產生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比Node更有價值的DOM支持。

所以...所有這三種選項都很吸引人。我認爲。我錯了什麼?有另一種方法嗎?

回答

3

用wkhtmltoimage解決了這個問題。醜陋的解決方案,但它的作品。

0

在通過ImageMagick運行之前,您可以嘗試transforming the VML to SVG on the server。我知道項目本身就是PHP,但是轉換是通過XSL完成的(文件位於下載檔案中),因此應該可以移植到任何服務器平臺。

+0

很酷...謝謝。這可能實際上是有效的 - 儘管我的Spidey感覺在依賴用戶的瀏覽器輸出的想法中感到刺痛。我無法指責風險,但依靠那種跑步的客戶端讓我感到困惑。你怎麼看 - 我只是偏執狂?沒有辦法讓用戶創建一個Raphael圖片而不加載它所呈現的頁面,而且我認爲我們希望我們的用戶使用JS ... – rfrankel 2010-07-30 04:13:32

+0

@rfrankel您當然可以永遠不會相信瀏覽器的輸入並且總會有可能的利用(例如在XSLT引擎中),即使輸入格式良好,但我應該認爲驗證您的輸入實際上是SVG是一個好的開始。 – robertc 2010-07-30 09:59:40

+0

當然 - 我甚至沒有真正考慮安全風險(我知道該如何處理),以至於我們成功創建Raphael圖像而不是PNG的邊緣情況,因爲用戶的瀏覽器做了一些奇怪或崩潰的事情管他呢。 – rfrankel 2010-08-01 09:25:37

1

將SVG文檔序列化到客戶端後,您只需要在服務器上運行SVG渲染器和/或光柵化器來生成PNG。我不清楚你認爲JS包裝器會做什麼,或者爲什麼它需要。由於您發送的SVG文檔不包含動態內容,所以您只需將序列化的SVG文檔發送到服務器上的光柵化器,以將其柵格化爲PNG。

SVG渲染器/光柵化器可能只是一個調用ImageMagick的CGI腳本,或者可能更復雜一些。就個人而言,我建議設置一個運行Apache Batik的servlet,其中包含一個SVG Rasterizer,並且可以通過編程方式調用。快速谷歌搜索表明,這是一個蠟染相當普遍的任務:http://www.mail-archive.com/[email protected]/msg06116.html