2012-06-14 34 views
2

我知道如何使用Swing的有限內置HTML支持(請參閱http://www.java.net/node/680674)將HTML繪製到Graphics2D對象,但我需要更好的渲染。最重要的是,對於這個特定的化學圖繪製應用程序,Swing的HTML支持不會擴展到嵌套的子/上標。更好的CSS支持也不錯。我不需要圖像嵌入或交互功能,如Javascript或熱鏈接。繪製高質量的HTML到Graphics2D(類似於drawString())

HTML文本被縮放和旋轉,然後繪製到一個圖表中,該圖表可能包含額外的文本和圖形。 Graphics2D目標可能是屏幕,打印機或(通過iText)PDF文件。我懷疑在生成出版質量的PDF文件時,任何涉及通過BufferedImage等進行轉換的解決方案都可以充分緊湊。

我的(可能是不正確的)印象是,JavaFX 2.0還沒有解決這個問題,儘管它可能最終。 (如果早期版本可以做到這一點,那可能是一個解決方案。)將整個應用程序從Swing重寫爲JavaFX是不現實的。

此應用程序是免費且開源的,所以它使用的任何工具可能也需要可以自由分發。否則,我相信JWebEngine可能適合這個法案。

任何幫助,將不勝感激。

回答

1

您可以使用JavaFX WebView節點 - 它具有非常好的HTML標記和CSS支持。您可以使用JavaFX基元的和scale WebView節點。可以在WebView中使用MathJax以獲得高質量的公式呈現(如果僅僅是簡單的html和css不會爲您完成這項工作)。使用JavaFX 2.2,可以拍攝WebView節點的快照並將其呈現爲JavaFX圖像。您可以使用JavaFX 2.2 SwingFXUtils將該JavaFX圖像轉換爲awt BufferedImage,然後使用ImageIO以多種格式將其寫出到文件中。

這是example of rendering a piechart node to a png。根據你html的複雜程度,有時候高質量的圖像會壓縮到(例如)一個PNG文件。在pichart樣本中,具有文本和彩色漸變的2000x2000像素餅圖保存到168kb的png文件中。

將整個應用程序從Swing重寫爲JavaFX不是必需的,因爲JavaFX包含用於在現有Swing應用程序中嵌入JavaFX應用程序的JFXPanel。節點快照步驟甚至不需要將節點渲染到屏幕(它們都可以通過內存緩衝區來完成) - 儘管JavaFX系統可能需要先在JavaFX應用程序或JFXPanel中啓動並啓動。

以上所有可能或不可能最終給你你想要的結果,但它似乎是一個有前途的考察大道。

更新

我跑這幾個測試,雖然我可以快照的的WebView在這個崗位解釋,由於JavaFX的2.2的一些限制,顯示在屏幕上,我無法進行快照的WebView顯示爲屏幕外場景的一部分。這意味着此答案中的信息是準確的,但僅適用於可在WebView中顯示在屏幕上的HTML部分;例如該技術目前不適用於像素大小超過屏幕像素大小的大型文檔。有關示例代碼,請參閱https://forums.oracle.com/forums/thread.jspa?threadID=2456191