2012-06-14 37 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