WebRendererとは?

JadeLiquid Softwareが販売しているWebRendererは、JavaでHTMLレンダリングを行うためのライブラリである。WebRendererは、ページのレンダリングのみならず、HTTPに則ったキャッシュ、「戻る」「進む」などのページナビゲーション、Webページの印刷などの機能も備えた、Webブラウザコンポーネントとも言えるものに仕上がっている。20日には、新しいエディションとして「Swingエディション」を発表している。

ところで、HTMLをJavaでレンダリングすることの利点は何であろうか。

まず思いつくのは、テキストデータやDOMとしてのHTMLではなく、レンダリングされた後のイメージをプログラムで取り扱うことができるという点である。これはつまり、最近はやりのWebページのサムネイル作成などが簡単に行えるということだ。

他にも、例えばJavaで作ったクライアントアプリにWebブラウザ機能をシームレスに統合できるという利点もすぐに思いつく。これにより、デスクトップアプリケーションの一部をHTML+Ajaxアプリケーションにすることも可能になる。例えば、Google Mapsとマッシュアップするクライアントアプリケーションの作成なども容易に行える。

ただし、不安もある。不安の中で最も大きなものは、HTMLレンダリング自体だろう。ご存じの通り、標準から著しく逸脱したHTMLリソースは世界中に多数あり、現在のWebブラウザはそうした「行儀の悪い」HTMLでも、エラーを発生させることなく、それほど表示を崩さずにレンダリングできるように作られている。こうした機能を新しいプロダクトがフォローできているのかと心配になる読者は少なくないはずだ。また、HTMLやCSSの解釈も重要だ。明示的な指定がない場合のフォントプロパティやマージンの幅などが一般的なブラウザとは全く異なっていたら、やはり敬遠されてしまうだろう。

しかし、WebRendererではそうした心配は一切無用だ。なぜかと言えば、WebRendererはMozilla(Firefox)、Internet Explorer、Safariといった現在主流となっているブラウザのレンダリングエンジンを透過的に扱うよう設計されているからだ。WebRendererはデフォルトでMozillaのレンダリングエンジンを内包している。

では、実際にWebRendererを動かしてみることとしよう。

ダウンロードできるエディション

WebRendererは、こちらのサイトからダウンロードすることができる。有償のプロダクトであるが、30日間のトライアル版を無償で利用可能だ。

ダウンロードできるのはzipやtar.gzといったアーカイブファイルなので、入手後に展開するだけで利用可能だ。

トライアル版で利用できるエディションは以下の3種類だ。

  • Desktop Edition: AWTベースのライブラリで、IEやSafariといったネイティブブラウザとも統合できる
  • Swing Edition: Swingベースのライブラリで、DOMレベル1と2をフルサポートする。他のアプリケーションへの組み込みも容易だ
  • Server Edition: サーバで行う処理に比重を置いたエディションで、サムネイル画像の保存、ヘッドレスモード(グラフィックカードがない状態でのイメージ処理)がサポートされる

WebRendererを用いたプログラミング

今回は、わかりやすい例として、Webページのサムネイル画像をファイルとして保存するサンプルを作ろう。こうした用途に最適なのはServer Editionである。今回は、同エディションをJDK 1.6.0_01、Windows XP上で動作させた。

Server Editionのアーカイブを展開したら、トップディレクトリに3つのJARファイルを確認できるはずだ(webrendererse.jar、webrendererse-win.jar、corecomponentsse-win.jar)。それらにクラスパスを通してコンパイル/実行を行うことでWebRendererを使用することができる。

サンプルのソースコードは以下のようになる(import文は省略)。

リスト1: クラスPageThumbnailFactory

public class PageThumbnailFactory {
    public static void main(String[] args) throws Exception {

        // ライセンスのセット   ……(1)
        BrowserFactory.setLicenseData( "30dtrial" , "BST04I0TB9031HJJ56RGECOS" );

        // レンダリングを行うキャンバスを取得   ……(2)
        final IBrowserCanvas browser = BrowserFactory.spawnMozilla();

        // イベントリスナを追加   ……(3)
        browser.addNetworkListener(new NetworkAdapter() {

            // ドキュメントの読み込みとレンダリングが完了したら呼び出される
            @Override
            public void onDocumentComplete(NetworkEvent e) {
                try {
                    System.out.println("ドキュメント読み込み完了");

                    // "thumbnail.jpg"というファイル名でJPEGイメージを保存   ……(4)
                    browser.savePageImageToDisk(new File("thumbnail.jpg"), IBrowserCanvas.IMAGE_FORMAT_JPEG);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
        // Webページの読み込み   ……(5)
        browser.loadURL("www.google.com");
    }
}

上のプログラムの中で括弧書きの数字を付けた部分は以下のようになる。

(1) com.webrenderer.se.BrowserFactory#setLicenseDataメソッドに、ライセンスキーを渡す。30日トライアル版のライセンスキーは、展開後のルートディレクトリにあるTestBrowser.javaファイル内に記載されている内容を参照のこと

(2) HTMLレンダリング用のキャンバスを取得する。spawnMozilla()メソッドにより、Mozillaレンダリングエンジンを使用するキャンバスを取得している。ここで取得できるIBrowserCanvasオブジェクトは、WebRendererの最も中心的なインタフェースだ。Desktop Editionであれば、ここでIEやSafari用のレンダリングエンジンを指定することもできる

(3) キャンバスにイベントリスナをセットしている。ここで指定しているのはネットワーク操作に関するリスナであるが、他にもマウスイベント、キーイベント、Javascriptイベントなど、多数のイベントをハンドリングすることが可能

(4) レンダリングしたイメージをJPEGで保存している。このメソッド(savePageImageToDisk)は、Server Editionにしか存在しないメソッドである

(5) IBrowserCanvas#loadURL()メソッドを使用し、インターネットからWebページをロードする。なんと、たった1行だけだ

このプログラムを実行すると、"thumbnail.jpg"というファイル名でWebページのイメージを保存できる。今回は使用していないが、イメージの最大サイズを指定するメソッドもあるので手軽にサムネイルを作ることが可能だ。ネットワークからHTMLやイメージファイルをダウンロードしてレンダリングしたうえ、さらにイメージをファイルに保存するという複雑なことをしている割には、コードは非常に単純である。

以上で見てきたように、WebRendererを使用すると非常に簡単にHTMLのレンダリングとそのイメージを処理することができる。

有償のプロダクトなのが多少残念なところではある。現在のところ、価格に関しては企業に対して直接メールでコンタクトをとる必要があるとのことだ。

とはいえ、これほどの複雑な処理をたった数行のコードで実現できるという生産性の高さはなかなか捨てがたい。Javaでブラウザ相当の処理が必要になった場合には、試してもよいだろう。