目次 | 前の項目 | 次の項目 | JavaTM 印刷サービス API ユーザガイド |
javax.print.attribute.standard パッケージには、Java 印刷サービス API の標準属性がすべて列挙されています。標準属性のほとんどは、IETF IPP (Internet Printing Protocol) 1.1 仕様に定義されている属性です。つまり、javax.print.attribute.standard パッケージに定義されている属性クラス (カテゴリ) は、すべて IPP に準拠しており、IPP 属性カテゴリに対応しています。その名前 (getName から返される名前) は、IPP 属性カテゴリの実際の IPP 名です。また、多くのクラス名は、IPP 名を反映しており、Java プログラミング言語で許可されるコーディング規則にできるだけ準拠しています。さらに、カテゴリに定義される値は、IPP の値と同じです。各属性カテゴリと IPP の互換性については、API 仕様を参照してください。この節では、開発者が頻繁に使用する属性について説明します。ここに挙げた属性も含めて、頻繁に使用する属性では、PrintRequestAttribute を実装しています。印刷アプリケーションでは通常、印刷ジョブ全体の印刷方法を指定しますが、これは PrintRequestAttribute の機能に含まれるためです。
OrientationRequested 属性カテゴリには、用紙上での印刷方向を指定します。指定できる属性値は、PORTRAIT、LANDSCAPE、REVERSE_PORTRAIT、および REVERSE_LANDSCAPE です。通常は、OrientationRequested.PORTRAIT がデフォルト値です。次のコード例では、OrientationRequested 属性を属性セットに追加しています。OrientationRequested オブジェクトには、型保証された String 値が列挙されてます。各 String 値は、設定可能な印刷方向に対応しています。これらの String 値は IPP キーワードです。aset.add(OrientationRequested.REVERSE_PORTRAIT);一部の書式設定済みのドキュメントの種類 (「Postscript」など) では、この属性カテゴリがサポートされないことがあります。書式設定済みのドキュメントの種類には、プリンタによって解釈されるプリンタ言語コマンドが埋め込まれており、これらのコマンドはクライアントの要求より優先されるためです。
特定の印刷サービスでサポートされる印刷方向の値をクライアントから検出するには、次のメソッドを呼び出します。
このメソッドによって、サポートされる値が列挙された OrientationRequested 型の配列が返されます。PrintService.getSupportedAttributeValues(OrientationRequested.class, ...).
Copies 属性カテゴリには、印刷する部数を指定できます。Copies クラスには、要求した部数を示す整数がカプセル化されます。次のコード例では、部数を 5 に設定した Copies 属性を属性セットに追加しています。印刷サービスによってサポートされる印刷部数の範囲をクライアント検出するには、次のメソッドを呼び出します。aset.add(Copies(5));このメソッドによって、CopiesSupported オブジェクトが返されます。このオブジェクトには、印刷サービスが処理できる印刷部数の範囲を示す、整数値の範囲がカプセル化されています。getSupportedAttributeValues を呼び出すときに、Copies の代わりに CopiesSupported を指定すると、常に NULL が返されます。CopiesSupported オブジェクトには PrintRequestAttribute インタフェースが実装されていないため、クライアントが印刷要求に CopiesSupported 属性を指定できないためです。PrintService.getSupportedAttributeValues(Copies.class, ...)次のコード例では、印刷サービスが 5 部の印刷に対応しているかどうかを検出し、5 部の値を Copies 属性に設定し、それを属性セットに追加しています。
CopiesSupported copSupp = (CopiesSupported) service.getSupportedAttributeValues(Copies.class, null, null); if (copSupp != null && copSupp.contains(5)) { requestAttrSet.add(new Copies(5)); } else { ... }
Media は、印刷先の媒体を識別する IPP 属性です。Media 属性は、重要な属性ですが、操作は比較的複雑です。Java 印刷サービス API では、抽象クラス Media に対して 3 つのサブクラス (MediaSizeName、MediaName、および MediaTray) を定義して、IPP 仕様内でオーバーロードされた Media 属性を反映します。すべての Media サブクラスには、Media カテゴリが割り当てられています。各サブクラスでは、Media カテゴリに対して、標準属性値を個別に定義しています。たとえば、MediaTray オブジェクトでは、Media 属性の値として MANUAL を設定し、プリンタの手差しトレイの用紙にドキュメントを印刷することを指定できます。次のコード例では、Media 属性を属性セットに追加しています。
aset.add(MediaTray.MANUAL);Media 属性の値は、常に String 型です。ただし、属性がオーバーロードされるため、属性が参照する媒体の種類は値の種類によって決定されます。たとえば、定義済みの IPP 属性値には、「a4」および「top-tray」の値が含まれています。Media 属性の値が「a4」に設定されている場合は、用紙のサイズを参照しますが、「top-tray」に設定されている場合は、給紙元を参照します。String 型の属性値では、さまざまな種類の媒体を参照できるため、アプリケーションで属性セットを拡張することができます。たとえば、「company-letterhead」や「yellow letter paper」などの値を属性セットに含めることができます。この方法で Media 属性を拡張するには、この媒体を使用して印刷するように構成された印刷サービスを、アプリケーション上で検出する必要があります。
ほとんどのアプリケーションでは、MediaSizeName または MediaTray のどちらかが使用されます。MediaSizeName クラスには、媒体がサイズ別に列挙されています。MediaTray クラスには、プリンタの用紙トレイが列挙されています。通常は、メイントレイと手差しトレイが含まれます。IPP 1.1 の仕様では、媒体のサイズとトレイを同時に指定できません。たとえば、アプリケーションから手差しトレイに対して、A4 サイズの用紙を要求することはできません。今後の IPP 仕様では、同時に複数の種類の媒体を要求する方法が提供されるかもしれません。その場合は、JPS API を拡張し、この変更を実装する予定です。
JPS API には、IPP 属性以外の媒体関連の Attribute クラス (MediaSize および MediaPrintableArea) も追加されています。
MediaSize は、要求属性ではありません。用紙寸法が列挙された属性で、MediaSizeName インスタンスに対応付けられています。各 MediaSizeName インスタンスは通常、MediaSizeName オブジェクトに関連付けられており、MediaSizeName インスタンスに定義されている用紙の寸法をクライアントから取得できます。MediaSizeName インスタンスから用紙寸法を取得するには、次のメソッドを呼び出します。MediaSize size = MediaSizeName.getMediaSizeForName(paper);
MediaPrintableArea は、互換性のある Media とともに印刷要求で使用し、用紙上の印刷領域を指定します。プリンタのハードウェアには通常、印刷可能なページ領域が定義されており、ページ全体に印刷することはほとんどありません。このため、アプリケーションでは、特定のサイズの媒体に定義されている印刷可能領域を認識し、印刷データをその領域に収める必要があります。たとえば、5 × 7 インチの用紙の印刷可能領域を調べるには、このサイズの用紙に対応するメディアサイズ属性の値を選択し、印刷サービスに対して媒体サイズをアプリケーションから照会する必要があります。
返された値は、その用紙サイズに対してプリンタがサポートできる最大印刷可能領域です。PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); aset.add(MediaSizeName.NA_5X7); MediaPrintableArea printableArea = (MediaPrintableArea)service. getSupportedAttributeValues(MediaPrintableArea.class, null, aset);
Destination 属性を使用して、印刷データをプリンタ装置に送信せずに、ファイルに切り替えることができます。ファイルに出力するオプションはユーザダイアログで一般的ですが、スプールされたデータが常に使用できるとは限りません。デバイス固有のラスタが存在し、切り替え先のデバイスでは解釈できないことがあるためです。このため、Java 印刷サービス API では、クライアントから印刷サービスに照会し、出力をファイルに切り替えることができるかどうかを確認する必要があります。印刷サービスによっては、特定のカテゴリをまったくサポートしない場合や、特定の値だけをサポートする場合があります。たとえば、JPS API は、ネットワーク環境で使用できます。この場合、印刷データの書式設定がホストコンピュータ上で行われず、データを書式設定するサービスにクライアントのローカルファイルシステムに対するアクセス権がないときは、ローカルファイルを出力できないことがあります。Destination 属性では、出力先の値として URL が使用されます。このため、ネットワークプリンタでは、ftp などのプロトコルを使用して、書式設定済みの印刷データをアップロードすることができます。ただし、この属性をサポートするほとんどのプリンタは、ローカル環境で動作するため、「file:」プロトコルの URL を使用できます。次のコード例では、「c:」ドライブ上の out.prn ファイルに出力を切り替えています。aset.add(new Destination("file:c:\out.prn"));
SheetCollate 属性を使用すれば、複数のページで構成されるドキュメントを複数部印刷するときに、印刷ジョブを部単位で印刷するかどうかを指定できます。たとえば、3 ページのドキュメントを部単位で 2 部印刷する場合は、(1、2、3、1、2、3) として印刷されます。しかし、同じドキュメントを 2 部印刷するときに、部単位で印刷ない場合は、(1、1、2、2、3、3) として印刷されます。この属性は、バージョン 1.1 の IPP 仕様にありませんが、便利な属性で、ほとんどのプリンタでサポートされます。次のコード例では、部単位で印刷するジョブを指定しています。aset.add(SheetCollate.COLLATED);
一部のプリンタ、特に高機能のプリンタでは、用紙の両面に印刷することができます。Sides 属性を使用すると、通常のデフォルト値である片面印刷以外に、両面印刷を指定できます。両方印刷は、「duplex (両面印刷)」または「tumble (反転両面印刷)」と呼ばれる場合もあります。これらの 2 つの値は、出力の方向によって区別されます。Java 印刷サービス API では、「duplex (両面印刷)」は長辺で裏返す両面印刷で、「tumble (反転両面印刷)」は短辺で裏返す両面印刷のことです。詳細については、Sides に関する API 仕様を参照してください。次のコード例では、ドキュメントの両面印刷を指定しています。aset.add(Sides.DUPLEX);
Fidelity 属性は、IPP の boolean 型属性です。印刷サービスが印刷要求に指定されたすべての属性をサポートしない場合に、印刷ジョブを拒否するかどうかを表現します。Fidelity 属性は、多くの場合、開発者は考慮する必要がありません。ただし、JPS API コンテキストでは、重要な属性です。デフォルト値は、FIDELITY_FALSE です。印刷サービスが印刷要求に指定された属性をサポートしない場合でも、印刷ジョブを拒否しないことを示します。たとえば、アプリケーションで横方向での反転を指定し、プリンタが横方向での反転をサポートしないときは、Fidelity 属性が true の場合、そのジョブは拒否されます。Fidelity 属性が false の場合は、横長方向など、適切な代替方式に置き換えてジョブを実行します。Fidelity 属性を使用して、指定したとおりにドキュメントを印刷するか、またはすべての属性をプリンタがサポートしない場合でも印刷するかを、アプリケーションから決定できます。次のコード例では、要求した属性をプリンタがサポートしない場合は、ジョブを拒否しています。忠実な印刷が重要な場合は、Java 印刷サービス API のさまざまなツールを使用して、特定の印刷要求に対して忠実にサポートされる属性をアプリケーションから照会することができます。PrintService インタフェースについては、各照会メソッドを参照してください。aset.add(Fidelity.FIDELITY_TRUE);