XHTML文字列から画像を作成するのにFlying Saucerを使用しています。いくつかの例を読んだ後、私はJava2DRendererというクラスを使ってこれを行うことができることを発見しました。これには、ファイル、URI、およびDOMドキュメントを受け入れるコンストラクタがあります。したがって、DOMドキュメントはStringから作成できるため、使用することにしました。一方、そのような型を受け入れるすべてのコンストラクタは、widthとheightという2つの他のパラメータを必要とします。例えばXHTML文字列からJava2DRendererを作成するには?
:
// Creates DOM document from String
Document doc = DocumentBuilderFactory.newInstance()
.parse(new ByteArrayInputStream(xhtmlString.getBytes()));
//See constructor parameters: DOM document, width and height
Java2DRenderer imageRenderer = new Java2DRenderer(doc,
1024, 768);
imageRenderer.setBufferedImageType(BufferedImage.TYPE_INT_RGB);
BufferedImage image = imageRenderer.getImage();
は残念ながら、時にはxhtmlString
が大きすぎるとXHTMLの内容は、画像768の高さには収まりません。この場合、切り捨てられたイメージが生成されます。私はそれを予測する方法がなく、より高い値をハードコーディングするとほとんどのイメージ(小さなもの)が膨らんでしまいます。
Java2DRendererのconstructorの一つはjava.io.Fileを受け入れ、ちょうど(高さはAPIによって決定される)の幅を提供するために私達に尋ねると、私は選択肢を持っていると思う:ファイル
- 保存XHTML文字列メモリ内での作成XHTML文字列からのファイル
いずれも良い選択肢ではないようです。最初のものは余分なIOオーバーヘッドを追加しますが、2番目のものは受け入れ可能です(可能な場合)。私はApache VFS FileObject(それはRAMファイルシステムをサポートしています)を使用してメモリファイルを作成できると考えましたが、Java IO Fileクラスと互換性がないようです。 java.io.File
を受け入れるコンストラクタにorg.apache.commons.vfs2.FileObject
を渡すことはできません。
私の問題を解決するために他にどのようなオプションを提案できますか?