モジュール java.desktop

パッケージ javax.print.attribute

Java™Print Serviceの属性のタイプと属性セットへの属性の収集方法を記述するクラスとインタフェースを提供します。

属性とは何か

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

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

  • さまざまな処理手順を使用して、異なる時間に同じ印刷データを印刷することができます。
    たとえば、米国のレター・サイズの白紙、両面、プル、20枚のコピーでスライド・プレゼンテーションを印刷して、トークンを配布することができます。同じスライド・プレゼンテーションを米国のレター・サイズのOHP(片面、1部)に印刷して、実際のスライドを作成することができます。
  • 同じ処理命令を使用して、異なる時間に異なるデータを印刷できる。 たとえば、デフォルトの処理命令をUSレター・サイズ用紙、両面印刷、ホッチキス止めに設定できる。 この設定を明示的にオーバーライドしないかぎり、印刷ジョブの実行時、この設定により印刷が行われる

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

属性のカテゴリと値

各プリンタには、さまざまなサイズの用紙に印刷する機能や複数の部数を印刷する機能など、いくつかの機能が備わっています。 それぞれの機能には値の範囲があります。 たとえば、プリンタの印刷方向を指定する機能には、値の範囲[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つのサブインタフェースを持つ異なる種類の属性を定義します。次にそれらを説明します。

  • DocAttributeは、個々のドキュメントの特性と個々のドキュメントに適用される印刷ジョブの設定を指定する。
  • PrintRequestAttributeは、印刷ジョブ全体と印刷ジョブのすべてのドキュメントに適用される設定を指定する。
  • PrintJobAttributeは、印刷ジョブの状態を報告する。
  • PrintServiceAttributeは、印刷サービスの状態を報告する。
  • SupportedValuesAttributeは、別の属性でサポートされる値を取得する。
各属性クラスは、これらのタグ機能サブインタフェースの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など基本データ型を使用しません。その理由は次のとおりです。
  • 基本データ型は型保証されていない。 たとえば、コンパイラは「copies」属性値を、「sides」属性として使用することはできない
  • 一部の属性は、いくつかの値のレコードとして表されなければならない。 たとえば、プリンタの解像度は600 x 300 dpiを表すために600と300の2つの数が必要になる
型保証とすべての属性を均等に表すために、Java Print Service APIは各属性カテゴリをCopiesクラス、Sidesクラス、およびPrinterResolutionクラスなどのクラスとして定義します。 各属性クラスは、属性の値を保持する1つ以上の基本データ項目をラップします。 属性セットの操作は、属性を追加するとき、同じカテゴリ内に既存の属性を検出するとき、およびそのカテゴリに付与された属性を検索するときに、頻繁に属性カテゴリのオブジェクト間の比較を行います。 属性カテゴリはクラスによって表されるので、属性値の速い比較はClass.equalsメソッドによって行えます。

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

  • EnumSyntaxは、列挙値が単体オブジェクトによって表される型保証された列挙を提供する。 各列挙の単体は隠しint値をラップする列挙クラスのインスタンスである。
  • IntegerSyntaxは、整数値の属性の抽象構文である。
  • TextSyntaxは、テキスト値の属性の抽象構文であり、テキスト文字列の自然言語を使用するロケールを含む。
  • SetOfIntegerSyntaxは、整数型の範囲またはセットを表す属性の抽象構文である。
  • ResolutionSyntaxは、600x300 dpiなど解像度の値を表す属性の抽象構文である。
  • Size2DSyntaxは、用紙のサイズ8.5 x 11インチなど2次元の大きさを表す属性の抽象構文である。
  • DateTimeSyntaxは、値が日付と時刻の属性の抽象構文である。
  • URISyntaxは、値がURI (Uniform Resource Indicator)の属性の抽象構文である。
抽象構文クラスは、それを使用する属性に依存しません。 実際、印刷を何も行わないアプリケーションは、抽象構文クラスを使用できます。 ほとんどの標準抽象クラスは、抽象構文クラスの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は、ベンダーが以下を実行できるように設計されています。
  • javax.print.attribute.standardで定義されている標準属性の新しいベンダー固有の値を定義します。
  • 標準属性がサポートしないベンダーのプリンタ固有の機能を表す新しい属性カテゴリを定義する。
属性の新しい値を定義する場合は、クライアントで任意の値を持つ属性のインスタンスを実行時に構築できます。 ただし、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