先月に引き続き,今月も次世代Java Plug-inのJNLPサポートについて解説していきます。今週は,アプレットからの印刷について取り上げます。

歴史的な経緯から,Javaでの印刷は複数の方法があります。もっとも初期に使用されたのが,java.awt.PrintJobクラス,そしてJ2SE 1.2で導入されたのがjava.awt.printパッケージです。

PrinterJobクラスはAWTの機能を使用して印刷を行うためAWT印刷と呼ばれることがあります。もう一方のjava.awt.printパッケージはJava 2Dを使用して印刷を行うため,Java 2D印刷と呼ばれます。

その後,J2SE 1.4にてJava Print Serviceが導入されました。Java PrintServiceはJava 2D印刷の機能を補完し,Javaだけでプリンタの検索や,プリンタのプロパティの設定を行うことができるようになりました。現在は,ほとんどのアプリケーションでJava Print Serviceが使われているはずです。

しかし,JNLP APIはJ2SE 1.2時に策定されたこともあり,残念ながらJava Print Serviceを使用することができません。JNLP APIが提供している印刷機能は,Java 2D印刷と同等の機能になります。

Java 2D印刷ではjava.awt.print.Printableインタフェースとjava.awt.print.Pageableインタフェースの二つのインタフェースを用いて印刷対象を表します。Printableインタフェースは同じフォーマットを使用したページの印刷に使用します。一方のPageableインタフェースは,フォーマットの異なる複数ページの印刷に使用します。

そして,実際にプリンタとやり取りを行い,印刷を行うのがjava.awt.print.PrinterJobクラスです。

Printableインタフェースはprintメソッドを定義しており,その第1引数はjava.awt.Graphicsオブジェクトです。つまり,このGraphicsオブジェクトを使用して描画を行うと,それがプリンタで印刷されるわけです。これが,Java 2D印刷と呼ばれる由縁です。

Pageableインタフェースは複数のページを扱うために,複数のPrintableオブジェクトを保持します。Printableインタフェースは実装クラスとしてjava.awt.print.Bookクラスが提供されているため,新たに実装クラスを作成する必要はありません。