Java™ Platform
Standard Edition 7

パッケージ javax.print.attribute

JavaTM Print Service の属性の型とそれらが属性セットに収集される方法を記述するクラスとインスタンスを提供します。

参照: 説明

パッケージ javax.print.attribute の説明

JavaTM Print Service の属性の型とそれらが属性セットに収集される方法を記述するクラスとインスタンスを提供します。

属性とは何か

印刷ジョブを設定する場合、クライアントは印刷データ処理命令の 2 つを指定します。印刷データは、印刷される実際の内容です。処理命令は、使用するメディアの種類、印刷する部数、用紙の片面に印刷するか、両面に印刷するかなど印刷データの印刷方法をプリンタに指示します。クライアントは、Java Print Service API の属性の定義によってこれらの処理命令を指定します。

印刷データと処理命令は別個のエンティティーです。これは次のことを意味します。

処理命令は、印刷ジョブが要求を処理する方法を指定しません。 各処理命令は、印刷ジョブの結果の説明だけを行います。印刷ジョブは、処理命令により指定された結果を実現する方法を確定します。処理命令の項目を説明的に表現することにより、印刷ジョブの実装により多くの柔軟性が得られます。

属性のカテゴリと値

各プリンタには、さまざまなサイズの用紙に印刷する機能や複数の部数を印刷する機能など、いくつかの機能が備わっています。それぞれの機能には値の範囲があります。たとえば、プリンタの印刷方向を指定する機能には、値の範囲 [landscape, portrait] があります。印刷要求ごとに、機能に対してこれらの値の 1 つが設定されます。Java Print Service API は属性カテゴリという用語を使ってプリンタの機能を参照し、属性値という用語を使って機能の値を参照します。

Java Print Service API では、属性カテゴリは、Attribute インタフェースを実装する Java クラスによって表されます。属性値は、このようなクラスまたはそのサブクラスの 1 つのインスタンスです。たとえば、印刷部数を指定するために、アプリケーションは希望する印刷部数を持つ Copies クラスのインスタンスを構築し、印刷要求の一部としてこの Copies インスタンスを使用します。この場合、Copies クラスは属性カテゴリを表し、Copies インスタンスは属性値を表します。

属性の役割

印刷ジョブをプリンタに送信するときに、クライアントはドキュメントの名前など印刷データの特性と両面印刷で部数 5 部など印刷データの印刷方法を説明する属性を提供します。印刷ジョブが複数の印刷データから構成される場合、最初のドキュメントは 8 x 11 インチのメディアを使用し、もう一つのドキュメントは 11 x 17 インチのメディアを使用するなど、異なる印刷データは異なる処理命令を持ちます。

プリンタが印刷ジョブの処理を開始すると、ジョブの状態 (完了したジョブ、待機中のジョブなど) や印刷済みのページ数など、さまざまなジョブ情報を取得できます。このような情報も属性です。属性は、プリンタ名、プリンタの位置、および待機するジョブの数などプリンタ自体の情報も記述できます。

Java Print Service API は Attribute の 5 つのサブインタフェースを持つ異なる種類の属性を定義します。次にそれらを説明します。

各属性クラスは、これらのタグ機能サブインタフェースの 1 つまたは複数を実装して、属性が API のどの場所で使用されるかを指定します。各属性クラスが複数のタグ機能サブインタフェースを実装する場合は、属性を複数のコンテキストで使用できます。たとえば、メディア属性は、DocAttribute として 1 つの印刷ジョブの 1 つのドキュメントに適用することも、PrintRequestAttribute として印刷ジョブ全体に適用することもできます。低レベルの属性の中には、単独で使用されず、常に高レベルの属性に統合されるものもあります。これらの低レベルの属性クラスは、Attribute インタフェースだけを実装し、タグ機能サブインタフェースを実装することはありません。

Java Print Service API は、Internet Printing Protocol (IPP) バージョン 1.1 の属性にモデル化されている標準属性クラスのグループを定義します。標準属性クラスは、実際の属性クラスを保持するために、パッケージ javax.print.attribute に定義されたジェネリック機能とは概念的に区別されるサブパッケージ javax.print.attribute.standard にあります。

属性セット

通常、クライアントは、印刷ジョブの送信の際に複数の処理命令を提供する必要があります。たとえば、クライアントは A4 のメディアサイズと横長の印刷方向を指定する必要があります。複数の処理命令を送信するために、クライアントは Java Print Service API が AttributeSet インタフェースで表現する属性セットに属性を収集する必要があります。

AttributeSet インタフェースは、Map インタフェースに類似しています。これは値に対するキーのマッピングを提供します。ここでは、各キーは一意であり、複数の値を保持することはできません。ただし、AttributeSet インタフェースは、Java Print Service API の要件に対応するためのインタフェースです。AttributeSet の要件は次のとおりです。

  1. AttributeSet の各キーはカテゴリに対応し、キーの値はキーによって表されるカテゴリに属する属性値の 1 つだけをとることができる。このため、Map と異なり、AttributeSet はキーの使用可能な値を制限する。つまり、属性カテゴリはそのカテゴリに属さない属性値を設定できない。
  2. 同じカテゴリからの 2 つの属性が同じセットに存在することはできない。たとえば、属性のコレクションは、これら 2 つの属性がプリンタに矛盾した命令を与えるため、「一方向」属性と「両方向」属性の両方を保持することはできない。
  3. Attribute インタフェースを実装する属性だけがセットに追加できる。

javax.print.attribute パッケージには、属性セットのインタフェースの具象実装として HashAttributeSet が含まれます。HashAttributeSet はハッシュマップに基づく属性セットを提供します。この実装を使用するか、または AttributeSet インタフェースの独自の実装を提供することができます。

Java Print Service API は、「属性の役割」セクションで説明されているとおり、4 種類の属性の 1 つだけを保持するように制限されている属性セットの次の 4 つの特殊化を提供します。

ここでは 4 種類の属性セットだけがリストされていますが、5 種類の属性があることに注意してください。SupportedValuesAttribute インタフェースは、別の属性でサポートする値を提供する属性を表示します。サポートする値の属性は属性セットには統合されないため、これらを定義する属性セットのサブインタフェースはありません。

一部のコンテキストでは、属性セットは読み込み専用の場合がありますが、これはクライアントが属性セットの内容を検査することはできるが変更できないことを意味します。別のコンテキストでは、属性セットが読み込み、書き込み可能の場合がありますが、これはクライアントが属性セットの内容の検査と変更の両方を行うことができることを意味します。読み込み専用属性セットの場合、変更オペレーションの呼び出しは UnmodifiableSetException をスローします。

javax.print.attribute パッケージには、次の各属性セットのサブインタフェースの具象実装の 1 つが含まれます。

これらのクラスのすべては、HashAttributeSet を拡張し、属性セットが対応する種類の属性を保持することだけが可能になる制限を適用します。

属性クラスの設計

属性値は、整数値または列挙値など小さい不可分なデータ項目です。Java Print Service API は、属性値を表すために int など基本データ型を使用しません。 その理由は次のとおりです。 型保証とすべての属性を均等に表すために、Java Print Service API は各属性カテゴリを Copies クラス、Sides クラス、および PrinterResolution クラスなどのクラスとして定義します。各属性クラスは、属性の値を保持する 1 つ以上の基本データ項目をラップします。属性セットの操作は、属性を追加するとき、同じカテゴリ内に既存の属性を検出するとき、およびそのカテゴリに付与された属性を検索するときに、頻繁に属性カテゴリのオブジェクト間の比較を行います。属性カテゴリはクラスによって表されるので、属性値の速い比較は Class.equals メソッドによって行えます。

Java Print Service API には多数の属性カテゴリが含まれますが、属性値の異なる型はほんの少ししかありません。ほとんどの属性は、整数値、整数型の範囲、テキスト、整数値の列挙など少数のデータ型によって表せます。カテゴリが受け入れる属性値の型は、属性の抽象構文と呼ばれます。一貫性を提供し、コードの重複を減らすために、Java Print Service API は抽象構文クラスを定義して各抽象構文を表し、可能な場合には、これらのクラスは標準属性の親としていつでも使用できます。抽象構文クラスは次のとおりです。

抽象構文クラスは、それを使用する属性に依存しません。実際、印刷を何も行わないアプリケーションは、抽象構文クラスを使用できます。ほとんどの標準抽象クラスは、抽象構文クラスの 1 つを拡張していますが、属性クラスはこれらのクラスの 1 つの拡張も要求されません。抽象構文クラスは、多くの属性クラスによって共有される簡易実装を単に提供するだけです。

各属性クラスは、直接的または間接的に Attribute インタフェースを実装し、それを印刷属性としてマークします。また、特定のコンテキストで、制限された属性セットに表示される属性クラスは、1 つ以上の Attribute のサブインタフェースを実装します。また、ほとんどの属性クラスは、適切な抽象構文クラスを拡張して実装を取得します。Sides 属性クラスを次のように考えてください。

public class Sides extends EnumSyntax implements DocAttribute, PrintRequestAttribute, PrintJobAttribute { public final Object getCategory() { return Sides.class; } ... }

すべての属性クラスは Attribute を実装するので、すべての属性クラスは、属性カテゴリを返す getCategory メソッドの実装を提供する必要があります。Sides の場合、getCategory メソッドは Sides.class を返します。getCategory メソッドは、最終的に標準属性クラスの任意のベンダー定義サブクラスが同じカテゴリに表示されるようにします。すべての属性オブジェクトはいったん構築されると不変であり、このため属性オブジェクトの参照を自由に渡すことができます。異なる属性値を取得するには、異なる属性オブジェクトを構築してください。

ベンダーの属性

Java Print Service API は、ベンダーが以下を実行できるように設計されています。 属性の新しい値を定義する場合は、クライアントで任意の値を持つ属性のインスタンスを実行時に構築できます。ただし、EnumSyntax の抽象構文クラスを使用する列挙属性は、コンパイル時に使用可能なすべての属性値を、属性クラスの単独インスタンスとして指定します。これは、新しい列挙値を実行時に構築できないことを意味します。標準列挙属性に対してべンダー固有の新しい値を定義する場合、ベンダーは新しい単独インスタンスを指定する新しい属性クラスを定義する必要があります。新しい属性値が標準属性値と同じカテゴリの中に入るようにするには、新しい属性クラスを標準属性クラスのサブクラスにしなければいけません。

新しい属性カテゴリを定義する場合、ベンダーは新しい属性クラスを定義します。この属性クラスは、標準属性クラスと同じように、Attribute またはそのサブインタフェースの 1 つを実装し、抽象構文クラスを拡張します。ベンダーは既存の抽象構文クラスを使用することも、新しい抽象構文クラスを定義することもできます。ベンダーが定義した新しい属性は、AttributeSet などのような Attribute が使用されるところではどこでも使用できます。

属性の使用

一般的な印刷アプリケーションでは、印刷要求属性は通常クライアントが指定する属性型であるため、PrintRequestAttributeSet を使用します。次の例は、印刷要求属性の属性セットを作成し、指定された属性によってドキュメントを印刷できるプリンタの検出を示しています。

FileInputStream psStream; try { psstream = new FileInputStream("file.ps"); } catch (FileNotFoundException ffne) { } if (psstream == null) { return; } //Set the document type. See the DocFlavor documentation for //more information. DocFlavor psInFormat = DocFlavor.INPUT_STREAM.POSTSCRIPT; Doc myDoc = new SimpleDoc(pstream, psInFormat, null); PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); aset.add(new Copies(5)); aset.add(MediaSize.A4); aset.add(Sides.DUPLEX); PrintService[] services = PrintServiceLookup.lookupPrintServices(psInFormat, aset); if (services.length > 0) { DocPrintJob job = services[0].createPrintJob(); try { job.print(myDoc, aset); } catch (PrintException pe) {} }

注:javax.print API では、メソッドへの null 参照パラメータ指定は、ドキュメントに意味が明記されている場合を除いては不正であることに注意してください。これに反する使用は無効なコーディングであり、すぐにまたはあとで実行時の例外が生ずる結果になります。IllegalArgumentException および NullPointerException は、このような場合の典型的で許容できる実行時の例外の事例です。

導入されたバージョン:
1.4
Java™ Platform
Standard Edition 7

バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.