株式会社クレス
Java Print Serviceはjavaの新しいプリント・サービスの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が良いと思います。 内容 4. Java Print Serviceをアプリケーションがどう使うのか |
- アプリケーション・プログラムから印刷に関する完全な制御が出来る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 |
ジョブとプリンタのイベントの通知用 |
JPSの概念が掴みやすいように図示すると次のようになります。
この図から判るように、このシステムは大きくドキュメント、プリント・サービス、そしてドキュメント・プリント・ジョブの3つのオブジェクト群で構成されています。
ドキュメントは印刷しようとするドキュメントで、これには実際のテキスト(プレイン・テキストやHTMLテキスト)や画像データ(GIF/JPEG/PNG)及びアプリケーション出力データのオブジェクト以外に後で説明するフレーバ(MIMEタイプやオブジェクトの表現クラス名)が包含されています。Java
Print Serviceはこれらのドキュメントのオブジェクト群を印刷します。言い換えればドキュメントのオブジェクトはプリント用データの一部を提供するものといえます。、なおSimpleDocは一般的な多くの印刷要求で使用可能な
Doc インタフェースの実装で、アプリケーションは通常このクラスをインスタンス化します。
一方Java
Print Serviceは分散されたプリンタに対応できるようになっています。これをプリント・サービスというオブジェクトで表現しています。各プリンタは各々異なる機能を有しており、アプリケーションはそのなかから目的のフレーバや属性に合ったプリント・サービスを探し出します。そのためのツールとしてプリント・サービス・ルックアップという抽象クラスの実装が用意されています。なおデフォルトのプリント・サービスは、通常皆さんのPCで設定されているデフォルト・プリンタです。
実際の印刷の仕事を請け負うのはドキュメント・プリント・ジョブなるインターフェイスを実装したオブジェクトです。このオブジェクトはプリント・サービスがファクトリとなって生成します(具体的にはcreatePrintJobというメソッドが生成する)。印刷に際しては、このオブジェクトはドキュメントだけでなく、印刷に対する指示事項、例えば用紙サイズや印刷枚数などを印刷要求の属性のセットとして与えます(具体的にはprintというメソッドを呼ぶ)。
ところでフレーバとは一体なんでしょうか?ネットワーク上にあるプリンタなど分散されたプリンタへのプリントデータはユニコードまたはバイト形式でプリンタに送信されます。したがってどういう形式(バイト、ストリーム、URL、文字、アプリケーション…)でどんなデータ(JPEG、GIF、PNG、テキスト…)をプリンタに送信するかを指定することになります。バイト形式で送信する場合は、インターネットと同じくMIMEタイプが使われます。例えば"TEXT_PLAIN_US_ASCII
"というフレーバは"text/plain;
charset=us-ascii"に変換され、これは文字セットUS_ASCIIのプレーンテキストを意味することになります。なお、ドキュメント・プリント・ジョブへは所望のフレーバとドキュメントを与えて印刷する場合と(クライアント形式)、ドキュメント・プリント・ジョブのオブジェクトが印刷形式を判別する場合(サービス形式)が存在しますが、ここではその詳細は省略します。
あるアプリケーションがプリントを行う際、そのプリントの要求に合致した機能を有するプリント・サービスを探すのに、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)
しかるべきプリント・サービスが見つかったら、アプリケーションはそれからプリント・ジョブを生成します(PrintServiceインターフェイスのcreatePrintJobメソッドを呼ぶ)。このプリント・ジョブは実際のプリント方法を提供してくれるDocPrintJobクラスで示されます。プリントを呼ぶ前にこのアプリケーションはDocオブジェクトを生成し、このオブジェクトにプリント・データ、及びjavax.print.attributeとjavax.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 パッケージはアプリケーションがプリント・ジョブとプリント・サービスにイベントを登録出来るものです。
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通りのプリント法の一つのみを示すものではありますが、他のプリント方法もこれに類似したものとなります。
実験は基本的な環境、すなわちJ2SDK(1.4以上)の開発環境で行います。
a) J2sdk/demoのフォルダのなかに”jps”のフォルダを作る
b) そのフォルダに”MyPrintService.java”を作成する
c) PATHの設定
2000のときはスタート>設定>コントロールパネル>システム>詳細環境設定で
PATHをE:j2sdk141b2\bin(これは例、貴方のSDKのbinのディレクトリを設定)
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のときはスタート>設定>コントロールパネル>システム>詳細環境設定で
CLASSPATHをE:j2sdk141b2\demo\jps
(これは例、貴方のSDKのbinのディレクトリを設定)
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" |
この結果から、この場合のデフォルト・プリント・サービスは:
- イメージとしてGIF、JPEG、PNGが処理できる
- イメージはバイト配列、java.io.InputStream、java.net.URLを介して送りこめる
- アプリケーションはjava.awt.print.Pageableまたはjava.awt.print.Printableを実装したオブジェクトを送りこめる(つまり従来プリント用に使われているjava.awt.printパッケージが使える)
- アプリケーションはバイトストリームをバイト配列、java.io.InputStream、java.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()); } } } |
それではJPEGの簡単な矩形のイメージファイルをプリントするサンプルを試してみましょう。このサンプル・プログラムはJpsSample0.javaというファイルとなっています。このファイルを前記のサンプルMyPrintService.javaと同じようにe:\j2sdk141b2\demo\jps(皆さんの環境によって異なる)のフォルダに置き、コンパイル後実行します。なお注意して頂きたいのはJDKは1.4.1以降のバージョンでないとJPEGエンコードに問題があることで、必ず最新のバージョンで確認されることをお薦めします。
このプログラムのリストは以下のようになっています。イメージの作成はBufferedImageを使い、これをJPEGに変換するのはImageIOのメソッドを使用しています。GIFやPNG形式での出力でも試して見ることをお薦めします。
/**
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(); } } } |
これは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);
//ByteArrayOutputStreamにJPEGとして書き出し
//(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(); } } } |
JPSにはこれまでのjava.awt.printが使えるようになっています。つまりJava
2DのイメージをJPSを使ってプリントできます。この場合、java.awt.printとjavax.printを併用するので混乱しないよう注意してください。Java
2DのAPIのなかから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.printはjava.awt.print.PrinterJobがベースとなっていますが、JPSのためにJDK1.4から新しく幾つかのメソッドがjava.awt.print.PrinterJobに追加されています:
- 2Dグラフィックスのイメージを処理できるプリント・サービスを探し出す為のスタティックなメソッドで、これはPrintServiceまたはStreamPrintServiceFactoryのオブジェクトの配列を返す
- PrinterJobにPrintServiceをセットまたはゲットするメソッド
- PrintRequestAttributeSetのパラメタを受理するpageDialogメソッド
- PrintRequestAttributeSetのパラメタを受理するprintDialogメソッド
- PrintRequestAttributeSetのパラメタを受理するprintメソッド
新しいprintDialogとpageDialogのふたつのメソッドは属性のセット(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): } } |
PrinterJobのprint(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キーを同時に押して強制的に戻します。
以上