Javaプリントサービス(JPS)について

株式会社クレス

 

 

Java Print Servicejavaの新しいプリント・サービスのAPIです。このAPIの日本語の紹介が比較的少ないので、簡単な紹介を試みます。参考としたのはSunのガイド:http://java.sun.com/j2se/1.4.1/docs/guide/jps/spec/JPSTOC.fm.htmlです。なお日本語の解説はhttp://www-6.ibm.com/jp/developerworks/java/020531/j_j-mer0322.htmlが良いと思います。

内容

Javaプリントサービス(JPS)について

1.      Java Print ServiceAPIの特徴

2.      Java Print Serviceの概念

3.      プリントの手順

a)      プリント・サービスの発見

b)      プリント・ジョブの生成

4.      Java Print Serviceをアプリケーションがどう使うのか

基本的なJavaプリント・サービスの実験

1.      準備(デフォルトのプリント・サービスを知る)

2.      イメージファイルの印刷

3.      イメージをバイト列として直接印刷するサンプル

4.     2Dグラフィックスを直接印刷するサンプル

 

サンプル・プログラムのダウンロード

 

 

 

1.         Java Print ServiceAPIの特徴

 

-     アプリケーション・プログラムから印刷に関する完全な制御が出来るAPIです

-     非デフォルトのプリンタやそのオプションを選択するのにユーザ・ダイヤログを必要としません

-     これはまたサーバ・サイドの印刷において有利です

-     クライアントのアプリケーションの為の強化されたユーザ・ダイヤログ(アプリケーションはユーザ・ダイヤログによる選択を検査したりオーバライドしたり出来ます)

 

JPSの基本構成は次のようになっています

機能

クラス(インターフェイス)

プリンタの発見

PrintServiceLookup class

プリンタのオブジェクト

PrintService interface

プリンタの記述

Attribute interface

プリント要求の仕様

Attribute interface

プリントデータの書式

DocFlavor class

プリントデータ、属性、入力等のカプセル化

Doc interface

プリントジョブの提出

DocPrintJob interface

プリントジョブの監視

PrintJobEvent class

 

パッケージ構成は次のようになっています

名称

内容

javax.print

コア

-   プリントサービスの発見

-   プリントデータの書式の指定

-   プリントサービスに基づきプリントジョブを生成

-   プリントデータをプリンタまたはストリームに送信

javax.print.attribute

プリンタの属性を記述しまた包含

javax.print.attribute.standard

共通のプリンタ属性

javax.print.event

ジョブとプリンタのイベントの通知用

 

 

 


2.         Java Print Serviceの概念

JPSの概念が掴みやすいように図示すると次のようになります。


 


この図から判るように、このシステムは大きくドキュメント、プリント・サービス、そしてドキュメント・プリント・ジョブの3つのオブジェクト群で構成されています。

 

ドキュメントは印刷しようとするドキュメントで、これには実際のテキスト(プレイン・テキストやHTMLテキスト)や画像データ(GIF/JPEG/PNG)及びアプリケーション出力データのオブジェクト以外に後で説明するフレーバ(MIMEタイプやオブジェクトの表現クラス名)が包含されています。Java Print Serviceはこれらのドキュメントのオブジェクト群を印刷します。言い換えればドキュメントのオブジェクトはプリント用データの一部を提供するものといえます。、なおSimpleDocは一般的な多くの印刷要求で使用可能な Doc インタフェースの実装で、アプリケーションは通常このクラスをインスタンス化します。

 

一方Java Print Serviceは分散されたプリンタに対応できるようになっています。これをプリント・サービスというオブジェクトで表現しています。各プリンタは各々異なる機能を有しており、アプリケーションはそのなかから目的のフレーバや属性に合ったプリント・サービスを探し出します。そのためのツールとしてプリント・サービス・ルックアップという抽象クラスの実装が用意されています。なおデフォルトのプリント・サービスは、通常皆さんのPCで設定されているデフォルト・プリンタです。

 

実際の印刷の仕事を請け負うのはドキュメント・プリント・ジョブなるインターフェイスを実装したオブジェクトです。このオブジェクトはプリント・サービスがファクトリとなって生成します(具体的にはcreatePrintJobというメソッドが生成する)。印刷に際しては、このオブジェクトはドキュメントだけでなく、印刷に対する指示事項、例えば用紙サイズや印刷枚数などを印刷要求の属性のセットとして与えます(具体的にはprintというメソッドを呼ぶ)。

 

ところでフレーバとは一体なんでしょうか?ネットワーク上にあるプリンタなど分散されたプリンタへのプリントデータはユニコードまたはバイト形式でプリンタに送信されます。したがってどういう形式(バイト、ストリーム、URL、文字、アプリケーション)でどんなデータ(JPEGGIFPNG、テキスト)をプリンタに送信するかを指定することになります。バイト形式で送信する場合は、インターネットと同じくMIMEタイプが使われます。例えば"TEXT_PLAIN_US_ASCII "というフレーバは"text/plain; charset=us-ascii"に変換され、これは文字セットUS_ASCIIのプレーンテキストを意味することになります。なお、ドキュメント・プリント・ジョブへは所望のフレーバとドキュメントを与えて印刷する場合と(クライアント形式)、ドキュメント・プリント・ジョブのオブジェクトが印刷形式を判別する場合(サービス形式)が存在しますが、ここではその詳細は省略します。

 

 

 

3.         プリントの手順

 

 

a)        プリント・サービスの発見

 

あるアプリケーションがプリントを行う際、そのプリントの要求に合致した機能を有するプリント・サービスを探すのに、PrintServiceLookup抽象クラスにあるスタチックなメソッドを呼びます。例えば、両面のドキュメントを印刷する場合は、アプリケーションは先ず両面印刷の機能を持ったプリンタを探し出す必要があります。PrintServiceインターフェイスを実装すると言うことはPrintServiceLookupの実装(プラットフォームによって異なる)が返す実際のプリンタを意味する事になります。このPrintServiceはこのプリント・サービスがサポートする属性を返す多くのメソッドを呼ぶことでその能力を問い合わせることが出来ます。Java 2 SDKには標準のプラットフォームのプリンタを探し出す為にPrintServiceLookupの実装が含まれています。IPPプリンタやJINIプリンタといったその他の種類のプリンタを探し出すにようにするには、プリント・サービスのプロバイダはPrintServiceLookup抽象クラスの実装を書くことができます。プリント・サービスのプロバイダはSPI JARファイル仕様を使ってこれらのPrintServiceLookup実装を動的にインストールできます。

 

アプリケーションはデータをプリンタに送らないで、StreamPrintServiceを使って出力ストリームに印刷することも出来ます。これによりこのアプリケーションはデータを別の書式に変換することが出来ます。StreamPrintServiceを取得するには、アプリケーションはStreamPrintServiceFactory抽象クラスのルックアップのメソッドを使用します。StreamPrintServiceは出力ストリームに2Dグラフィックスを送信する為にも使えます。

 

PrintServiceLookupが提供する検索用メソッドを紹介すると:

デフォルトのプリント・サービスを戻す:

public static final PrintService lookupDefaultPrintService()

特定のフレバー(GIFなどの文書タイプ) を特定の属性セット (両面など) での印刷をサポートするプリンタのセットを戻す:

public static final PrintService[] lookupPrintServices(DocFlavor flavor, AttributeSet attributes)

一度に複数の文書の印刷をサポート:

public static final MultiDocPrintService[] lookupMultiDocPrintServices(DocFlavor[] flavors, AttributeSet attributes)

 

 

 

b)        プリント・ジョブの生成

 

しかるべきプリント・サービスが見つかったら、アプリケーションはそれからプリント・ジョブを生成します(PrintServiceインターフェイスのcreatePrintJobメソッドを呼ぶ)。このプリント・ジョブは実際のプリント方法を提供してくれるDocPrintJobクラスで示されます。プリントを呼ぶ前にこのアプリケーションはDocオブジェクトを生成し、このオブジェクトにプリント・データ、及びjavax.print.attributejavax.print.attribute.standardパッケージで定義されているプリント要求の属性をカプセル化します。2Dグラフィックスを印刷するにはjava.awt.print.PrinterJobクラスあるいはjavax.ptint.DocPrintJobクラスのどちらかを使う事が可能です。アプリケーションはこのDocオブジェクトをプリント・ジョブに渡します(Docオブジェクトをパラメタにしてプリント・ジョブのprintメソッドを呼ぶ)。

 

javax.print.attribute及びjavax.print.attribute.standardパッケージはプリント・サービスの能力、ドキュメントの特性、ドキュメント処理またはプリント・ジョブ全部の指示、プリント・ジョブまたはプリンタの状態、を記述するプリント属性を定義しています。javax.print.attributeパッケージは属性の形式とそれがどのようにセットとして集められるかを記述しています。Attributeインターフェイスは全ての属性のスーパー・インターフェイスです。javax.print.attributeパッケージにはクラス群と属性を定義した5種のインターフェイスが含まれます。例えば、PrintRequestAttributeインターフェイスはクライアントがプリントすべき枚数を含むプリント・ジョブの特性を記述するのに使う属性を定義します。javax.print.attribute.standardパッケージはこのAPIがサポートする全ての標準的属性を列記したもので、その殆どがIPP仕様で定められている属性の実装です。

 

The javax.print.event パッケージはアプリケーションがプリント・ジョブとプリント・サービスにイベントを登録出来るものです。

 

 

 

4.         Java Print Serviceをアプリケーションがどう使うのか

 

 

Java Print Service APIを使った一般的なアプリケーションではプリントの要求を処理するのに以下のステップを踏みます:

 

1   プリント・データの形式を定めたクラスであるDocFlavorのしかるべきオブジェクトを取得する

2   5部コピー、綴じ目つき、両面印刷などの能力があるかといった必要なプリント・サービスの能力を記述した属性のセットをカプセル化したAttributeSetの集まりを作る

3   DocFlavorと属性のセットで指定されたプリント要求が処理できるプリント・サービスを検索する

4   そのプリント・サービスからプリント・ジョブを生成する

5   そのプリント・ジョブのprintメソッドを呼ぶ

 

アプリケーションは何をどのように印刷するかによってこれらのステップを別々に実行します。アプリケーションはプリント・データをプリンタあるいは出力ストリームのどちらかに送信可能です。プリント・データはテキスト形式、イメージ形式、あるいは2Dグラフィックスをカプセル化したjavaオブジェクトの形式であっても構いません。プリント・データが2Dグラフィックスの場合は、プリント・ジョブはDocPrintJobあるいはPrinterJobのいずれかの型で表現できます。プリント・データがドキュメントの場合はDocPrintJobを使用しなければなりません。プリント方法とプリント・データ形式の組合せで6つのプリント・メカニズムの選択肢が生じます:

 

データ

出力手段

組合せ

ドキュメント

プリント

DocPrintJob

PrintService実装

ドキュメント

ストリーム

DocPrintJob

StreamPrintService実装

2Dグラフィックス

プリント

DocPrintJob

PrintService実装

2Dグラフィックス

ストリーム

DocPrintJob

StreamPrintService実装

2Dグラフィックス

プリント

java.awt.print.PrinterJob

PrintService

2Dグラフィックス

ストリーム

java.awt.print.PrinterJob

StreamPrintService

注:終りのふたつは従来のjava.awt.printのシステムとの互換性をもたせたものである

 

 

基本的な例

 

Java Print Service APIを使う殆どのアプリケーションはドキュメントを直接プリンタに送信することになると思われますが、その場合は以下のサンプル・コードのようなものになります。

 

// 取り出しファイルを作る

FileInputStream textStream;

try {

                   textstream = new FileInputStream("file.TXT");

} catch (FileNotFoundException ffne) {

}

if (textstream == null) {

                   return;

}

// ドキュメントの形式を設定

DocFlavor myFormat = DocFlavor.INPUT_STREAM.TEXT_PLAIN_ASCII;

// Docオブジェクトの生成

Doc myDoc = new SimpleDoc(texttream, myFormat, null);

// 属性のセットを構築

PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();

aset.add(new Copies(5));

aset.add(MediaSize.ISO_A4);

aset.add(Sides.DUPLEX);

// 属性セットに従って印刷ができるプリンタを発見する

PrintService[] services =

                   PrintServiceLookup.lookupPrintServices(myFormat, aset);

// そのプリントサービスの一つからプリント・ジョブを生成し、印刷を行う

if (services.length > 0) {

                   DocPrintJob job = services[0].createPrintJob();

                   try {

                                     job.print(myDoc, aset);

                   } catch (PrintException pe) {}

}

 

このサンプルは6通りのプリント法の一つのみを示すものではありますが、他のプリント方法もこれに類似したものとなります。

 

 

 

基本的なJavaプリント・サービスの実験

 

 

1.         準備(デフォルトのプリント・サービスを知る)

 

実験は基本的な環境、すなわちJ2SDK1.4以上)の開発環境で行います。

 

a) J2sdk/demoのフォルダのなかに”jps”のフォルダを作る

b) そのフォルダに”MyPrintService.java”を作成する

c) PATHの設定

                   2000のときはスタート>設定>コントロールパネル>システム>詳細環境設定で

                                     PATHE:j2sdk141b2\bin(これは例、貴方のSDKbinのディレクトリを設定)

                   98のときはDOSプロンプト画面で

                                     E:\j2sdk141b2\demo\jps>set path=e:\j2sdk141b2\bin(これも例)を実行

d) DOSプロンプトのウィンドウでディレクトリをdemoのディレクトリに移る

e) コンパイル

                   E:\j2sdk141b2\demo\jps>javac myprintservice.java

f)        CLASSPATHの設定

                   2000のときはスタート>設定>コントロールパネル>システム>詳細環境設定で

                                     CLASSPATHE:j2sdk141b2\demo\jps

(これは例、貴方のSDKbinのディレクトリを設定)

                   98のときはDOSプロンプト画面で

                                     E:\j2sdk141b2\demo\jps>set classpath=e:\j2sdk141b2\demo\jps(これも例)を実行

g)        実行

E:\j2sdk141b2\demo\jps>java MyPrintService

 

MyPrintServiceは皆さんのコンピュータのデフォルトのプリントサービスの属性とサポートしているフレバーを出力するものです。実行結果は以下のようになります(皆さんの環境によって異なる)。このようにデフォルトのプリント・サービスはどのような形式の情報をどのオブジェクトを介してプリント可能なのかを知ることが出来ます。

Default Print service is Win32 Printer : RICOH IPSiO NX600

My Attributes set:

   RICOH IPSiO NX600

   accepting-jobs

   not-supported

   0

 

toString:     image/gif; class="[B"

toString:     image/gif; class="java.io.InputStream"

toString:     image/gif; class="java.net.URL"

toString:     image/jpeg; class="[B"

toString:     image/jpeg; class="java.io.InputStream"

toString:     image/jpeg; class="java.net.URL"

toString:     image/png; class="[B"

toString:     image/png; class="java.io.InputStream"

toString:     image/png; class="java.net.URL"

toString:     application/x-java-jvm-local-objectref; class="java.awt.print.Pageable"

toString:     application/x-java-jvm-local-objectref; class="java.awt.print.Printable"

toString:     application/octet-stream; class="[B"

toString:     application/octet-stream; class="java.net.URL"

toString:     application/octet-stream; class="java.io.InputStream"

 

この結果から、この場合のデフォルト・プリント・サービスは:

-     イメージとしてGIFJPEGPNGが処理できる

-     イメージはバイト配列、java.io.InputStreamjava.net.URLを介して送りこめる

-     アプリケーションはjava.awt.print.Pageableまたはjava.awt.print.Printableを実装したオブジェクトを送りこめる(つまり従来プリント用に使われているjava.awt.printパッケージが使える)

-     アプリケーションはバイトストリームをバイト配列、java.io.InputStreamjava.net.URL介して送りこめる

ことが判ります。

 

MyPrintService.javaのプログラムは次のようなものです。

 

/** 自分のPC環境のデフォルトプリントサービスを表示する

  * MyPrintService.java

  * Date: February 2003

  * Author: Terry

  * Coryright: Cresc Corp

  */

import java.io.*;

import java.util.*;

import java.util.Properties;

import javax.print.*;

import javax.print.attribute.*;

import javax.print.attribute.standard.*;

import javax.print.event.*;

 

/**

 *MyPrintServiceクラス

 */

public class MyPrintService{

 

 

/**

 *メイン・メソッド

 */

public static void main(String args[]) {

 

//デフォルトのプリントサービスを探す

PrintService myDefService = PrintServiceLookup.lookupDefaultPrintService();

    System.out.println("Default Print service is " + myDefService);

//そのプリントサービスの属性を出力

PrintServiceAttributeSet myAset = myDefService.getAttributes();

Attribute[] attr = myAset.toArray();

int loop = attr.length;

System.out.println("My Attributes set:");

for (int i = 0; i < attr.length; i++) {

    System.out.println("   " + attr[i]);

}

System.out.println();

//そのプリントサービスがサポートするフレバーを出力

DocFlavor[] myFlavors = myDefService.getSupportedDocFlavors();

loop = myFlavors.length;

DocFlavor flavor;

for (int i = 0; i < myFlavors.length; i++) {

    flavor = myFlavors[i];

//  System.out.println("MediaSubtype: " + flavor.getMediaSubtype());

//  System.out.println("MediaType:    " + flavor.getMediaType());

//  System.out.println("MimeType:     " + flavor.getMimeType());

    System.out.println("toString:     " + flavor.toString());

 

}

}

}

 

 

 

2.         イメージファイルの印刷

 

それではJPEGの簡単な矩形のイメージファイルをプリントするサンプルを試してみましょう。このサンプル・プログラムはJpsSample0.javaというファイルとなっています。このファイルを前記のサンプルMyPrintService.javaと同じようにe:\j2sdk141b2\demo\jps(皆さんの環境によって異なる)のフォルダに置き、コンパイル後実行します。なお注意して頂きたいのはJDK1.4.1以降のバージョンでないとJPEGエンコードに問題があることで、必ず最新のバージョンで確認されることをお薦めします。

 

このプログラムのリストは以下のようになっています。イメージの作成はBufferedImageを使い、これをJPEGに変換するのはImageIOのメソッドを使用しています。GIFPNG形式での出力でも試して見ることをお薦めします。

/** JPEGイメージファイルを印刷するサンプル

 * JpsSample0.java

 * Date: February 2003

 * Author: Terry

 * Coryright: Cresc Corp

 */

import java.io.*;

import java.util.*;

import javax.print.*;

import javax.print.attribute.*;

import javax.print.attribute.standard.*;

import javax.print.event.*;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.File;

import javax.imageio.ImageIO;

public class JpsSample0 {

 

public static void main(String[] args) {

    try {

        BufferedImage image = new BufferedImage(

            100, 100, BufferedImage.TYPE_INT_RGB);

        //BufferedImageにグラフィック書き込み

        Graphics g = image.createGraphics();

        g.setColor(Color.red);

        g.fillRect(25, 25, 50, 50);

        String s = "JPSのテスト0";

        g.setColor(Color.yellow);

        g.drawString(s, 15,20);

        //ファイルにJPEGとして書き出し(JDK 1.4.1以降のこと、1.4.0にはバグあり)

        ImageIO.write(image, "jpeg", new File("jpgsample.jpg"));

        //このJPGファイルをプリントするのにInputStreamを使う

        FileInputStream jpegStream;

        jpegStream = new FileInputStream("jpgsample.jpg");

        if (jpegStream == null){

            System.exit(1);

        }

        System.out.println("Image size: "+ jpegStream.available());

        // ドキュメントの形式を設定

        DocFlavor myFormat = DocFlavor.INPUT_STREAM.JPEG;

        // Docオブジェクトの生成

        Doc myDoc = new SimpleDoc(jpegStream, myFormat, null);

        // 属性のセットを構築

        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();

        aset.add(new Copies(1));

//      aset.add(MediaName.ISO_A4_WHITE);

//      aset.add(Sides.ONE_SIDED);

        // 属性セットに従って印刷ができるプリンタを発見する

        PrintService[] services = PrintServiceLookup.lookupPrintServices(

            myFormat, aset);

        // そのプリントサービスの一つからプリント・ジョブを生成し、印刷を行う

        if (services.length > 0) {

            System.out.println("Print service: "+services[0].toString());

            DocPrintJob job = services[0].createPrintJob();

            try {

                job.print(myDoc, aset);

            } catch (PrintException pe) {

                System.out.println(pe);

            }

        }

    } catch (Exception ex) {

         ex.printStackTrace();

    }

}

}

 

 

 

3.         イメージをバイト列として直接印刷するサンプル

 

これはjava 2Dなどで作成したJPEGなどのイメージを、ファイルを経由しないで直接プリントするもので、ファイルの変わりにByteArrayOutputStreamを、Docオブジェクトの生成にはこの出力ストリームから得たバイト配列を使っています。プログラムリストを見ればすぐ理解できると思います。

 

/** JPEGイメージを印刷するサンプル

 * JpsSample1.java

 * Date: February 2003

 * Author: Terry

 * Coryright: Cresc Corp

 */

import java.io.*;

import java.util.*;

import javax.print.*;

import javax.print.attribute.*;

import javax.print.attribute.standard.*;

import javax.print.event.*;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.File;

import javax.imageio.ImageIO;

public class JpsSample1 {

 

public static void main(String[] args) {

    try {

        BufferedImage image = new BufferedImage(

            100, 100, BufferedImage.TYPE_INT_RGB);

        //BufferedImageにグラフィック書き込み

        Graphics g = image.createGraphics();

        g.setColor(Color.red);

        g.fillRect(25, 25, 50, 50);

        String s = "JPSのテスト1";

        g.setColor(Color.yellow);

        g.drawString(s, 15,20);

        //ByteArrayOutputStreamJPEGとして書き出し

        //(JDK 1.4.1以降のこと、1.4.0にはバグあり)

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        ImageIO.write(image, "jpeg", baos);

        System.out.println("Image size: "+ baos.size());

        byte[] bytearray = baos.toByteArray();

        // ドキュメントの形式を設定

        DocFlavor myFormat = DocFlavor.BYTE_ARRAY.JPEG;

        // Docオブジェクトの生成

        Doc myDoc = new SimpleDoc(bytearray, myFormat, null);

        // 属性のセットを構築

        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();

        aset.add(new Copies(1));

//      aset.add(MediaName.ISO_A4_WHITE);

//      aset.add(Sides.ONE_SIDED);

        // 属性セットに従って印刷ができるプリンタを発見する

        PrintService[] services = PrintServiceLookup.lookupPrintServices(

            myFormat, aset);

        // そのプリントサービスの一つからプリント・ジョブを生成し、印刷を行う

        if (services.length > 0) {

            System.out.println("Print service: "+services[0].toString());

            DocPrintJob job = services[0].createPrintJob();

            try {

                job.print(myDoc, aset);

            } catch (PrintException pe) {

                System.out.println(pe);

            }

        }

    } catch (Exception ex) {

         ex.printStackTrace();

    }

}

}

 

 

 

4.         2Dグラフィックスを直接印刷するサンプル

 

JPSにはこれまでのjava.awt.printが使えるようになっています。つまりJava 2DのイメージをJPSを使ってプリントできます。この場合、java.awt.printjavax.printを併用するので混乱しないよう注意してください。Java 2DAPIのなかからJPSを使ってプリントするやり方は4通りあります。

 

1.    2Dグラフィックスをjava.awt.print.PrinterJobを使ってプリントする

2.    2Dグラフィックスをjava.awt.print.PrinterJobを使ってストリーム出力する

3.    2Dグラフィックスをjavax.print.Print.DocPrintJobとサービス・フォーマットされたjavax.print.Print. DocFlavorを使ってプリントする

4.    2Dグラフィックスをjavax.print.Print.DocPrintJobとサービス・フォーマットされたjavax.print.Print. DocFlavorを使ってストリーム出力する

 

このサンプルは1番目のjava.awt.print.PrinterJobを使う方法を示すものです。皆さんの実験環境のデフォルトプリントサービスにはapplication/x-java-jvm-local-objectref; class="java.awt.print.Pageable"application/x-java-jvm-local-objectref; class="java.awt.print.Printable"のふたつが受理可能となっているはずです。

 

java.awt.printjava.awt.print.PrinterJobがベースとなっていますが、JPSのためにJDK1.4から新しく幾つかのメソッドがjava.awt.print.PrinterJobに追加されています:

-     2Dグラフィックスのイメージを処理できるプリント・サービスを探し出す為のスタティックなメソッドで、これはPrintServiceまたはStreamPrintServiceFactoryのオブジェクトの配列を返す

-     PrinterJobPrintServiceをセットまたはゲットするメソッド

-     PrintRequestAttributeSetのパラメタを受理するpageDialogメソッド

-     PrintRequestAttributeSetのパラメタを受理するprintDialogメソッド

-     PrintRequestAttributeSetのパラメタを受理するprintメソッド

 

新しいprintDialogpageDialogのふたつのメソッドは属性のセット(attribute set)を使うので、ユーザはこのダイヤログを使って初期の属性の設定を変更することが出来ます。

 

プリントの手順は次のようになります。

// 初期印刷設定

PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();

// プリント・ジョブの取得

PrinterJob pj = PrinterJob.getPrinterJob();

// プリント・サービスを探し出す

PrintService []services = PrinterJob.lookupPrintServices();

if (services.length > 0) {

                   System.out.println("selected printer: " + services[0]);

                   try {

                   pj.setPrintService(service[0]);

                   // この設定をページ・ダイヤログとプリント・ダイヤログに渡す

                   pj.pageDialog(aset);

                   if (pj.printDialog(aset)) {

                                     // ダイヤログでユーザが設定した値に更新する

                                     // 最終設定をプリント要求に渡す

                                     pj.print(aset);

                   }

                   } catch (PrinterException(pe)) {

                                     System.err.println(pe):

                   }

}

 

PrinterJobprint(PrintRequestAttrbuteSet)メソッドは今回のようにPrintableインターフェイスを実装したオブジェクトを印刷するときは、そのオブジェクトのprint()メソッドを呼び出します。setPrintable(Printable painter)はそのようなオブジェクトをPrinterJobにリンクさせます。

 

実際にJpsSample2というプログラムを実験してみましょう。このプログラムを実行すると最初に下図のようなページの設定が出来るページ・ダイヤログが表示されます。「了解」のボタンを押すと次に印刷に関するダイヤログ(プリント・ダイヤログ)が表示されます。

 



 


「印刷」のボタンを押すとプリンタにデータが出力されます。

 

JpsSample2のプログラムは次のようになっています。

/* 2Dグラフィックスを印刷するサンプル

 * JpsSample2.java

 * Date: February 2003

 * Author: Terry

 * Coryright: Cresc Corp

 */

import java.io.*;

import java.awt.*;

import java.net.*;

import java.awt.image.*;

import java.awt.print.*;

import javax.print.*;

import javax.print.attribute.*;

import javax.print.attribute.standard.*;

 

/* このクラスにPrintableインターフェイスを実装させる */

public class JpsSample2 implements Printable {

/* コンストラクタのなかでプリント */

    public JpsSample2() {

 

        /* プリント要求仕様をここで構築

        * プリントするデータはPrintableなオブジェクトのこと

        * ここでは要求仕様に印刷枚数やジョブ名などを追加している

        */

        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();

//      aset.add(OrientationRequested.LANDSCAPE);

        aset.add(new Copies(1));

        aset.add(new JobName("JpsSample2", null));

 

        /* プリントジョブの生成 */

        PrinterJob pj = PrinterJob.getPrinterJob();

        /* このプリントジョブにデータをリンク */

        pj.setPrintable(this);

        /* この要求が処理できるプリントサービスを検索する */

        PrintService[] services =

            PrinterJob.lookupPrintServices();

 

        if (services.length > 0) {

            System.out.println("selected printer: " + services[0].getName());

            try {

                /* このプリントジョブにプリントサービスをリンク */

                pj.setPrintService(services[0]);

                /* ページ・ダイヤログを開く */

                pj.pageDialog(aset);

                /* プリント・ダイヤログを開く */

                if(pj.printDialog(aset)) {

                    /* 印刷 */

                    pj.print(aset);

                }

            } catch (PrinterException pe) {

                System.err.println(pe);

            }

        }

        System.exit(1);

    }

 

 

    /* プリントデータを印刷する(Printableインターフェイスのメソッド) */

    public int print(Graphics g,PageFormat pf,int pageIndex) {

 

        if (pageIndex == 0) {

            Graphics2D g2d= (Graphics2D)g;

            g2d.translate(pf.getImageableX(), pf.getImageableY());

            g2d.setColor(Color.red);

            g2d.fillRect(25, 25, 50, 50);

            String s = "JPSのテスト2";

            g2d.setColor(Color.black);

            g2d.drawString(s, 15,20);

            return Printable.PAGE_EXISTS;

        } else {

            return Printable.NO_SUCH_PAGE;

        }

    }

 

    /* mainはこのクラスのコンストラクタを呼ぶだけ */

    public static void main(String arg[]) {

 

        JpsSample2 sample2 = new JpsSample2();

    }

}

 

簡単なプログラムなので、特に説明する必要もありません。ただ、System.exit(1);という行が入っていますが、これがないと印刷が終了してもJVMは終了せず、DOSプロンプトに戻ってこないことに注意してください。そのような場合に終了させる時はDOSプロンプトでCtrlキーとCキーを同時に押して強制的に戻します。

 

以上