パッケージjavax.print.attribute
属性とは何か
印刷ジョブを設定する場合、クライアントは印刷データと処理命令の2つを指定します。 印刷データは、印刷される実際の内容です。 処理命令は、使用するメディアの種類、印刷する部数、用紙の片面に印刷するか、両面に印刷するかなど印刷データの印刷方法をプリンタに指示します。 クライアントは、Java Print Service APIの属性の定義によってこれらの処理命令を指定します。印刷データと処理命令は別個のエンティティです。 これは次のことを意味します。
- 異なる処理命令を使用して、異なる時間に同じ印刷データを印刷できる
たとえば、プレゼンテーション用スライドを20部USレター・サイズの白紙に、両面印刷し、ホッチキス止めして、会議用の配布資料として作成できる。また、同じプレゼンテーション用スライドを1部USレター・サイズの透明紙に片面印刷し、実際の説明用スライドを作成できる。 - 同じ処理命令を使用して、異なる時間に異なるデータを印刷できる。 たとえば、デフォルトの処理命令を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は、別の属性でサポートされる値を取得する。
DocAttribute
として1つの印刷ジョブの1つのドキュメントに適用することも、PrintRequestAttribute
として印刷ジョブ全体に適用することもできます。 低レベルの属性の中には、単独で使用されず、常に高レベルの属性に統合されるものもあります。 これらの低レベルの属性クラスは、Attributeインタフェースだけを実装し、タグ機能サブインタフェースを実装することはありません。
Java Print Service APIは、Internet Printing Protocol (IPP)バージョン1.1の属性にモデル化されている標準属性クラスのグループを定義します。 標準属性クラスはサブパッケージjavax.print.attribute.standard
内にあり、実際の属性クラスはパッケージjavax.print.attribute
で定義された汎用装置とは概念的に分離しています。
属性セット
通常、クライアントは、印刷ジョブの送信の際に複数の処理命令を提供する必要があります。 たとえば、クライアントはA4のメディア・サイズと横長の印刷方向を指定する必要があります。 複数の処理命令を送信するために、クライアントはJava Print Service APIがAttributeSetインタフェースで表現する属性セットに属性を収集する必要があります。
AttributeSet
インタフェースは、Map
インタフェースと似ています: キーから値へのマップが提供され、各キーは一意になっており、複数の値を含めることができます。 ただし、AttributeSet
インタフェースは、Java Print Service APIの要件に対応するためのインタフェースです。 AttributeSet
の要件は次のとおりです。
AttributeSet
の各キーはカテゴリに対応し、キーの値はキーによって表されるカテゴリに属する属性値の1つのみをとることができる。 このため、Map
と異なり、AttributeSet
はキーの使用可能な値を制限する。つまり、属性カテゴリはそのカテゴリに属さない属性値を設定できない。- 同じカテゴリからの2つの属性が同じセットに存在することはできない。 たとえば、属性のコレクションは、これら2つの属性がプリンタに矛盾した命令を与えるため、「一方向」属性と「両方向」属性の両方を保持することはできない。
Attribute
インタフェースを実装する属性だけがセットに追加できる。
javax.print.attribute
パッケージには、属性セット・インタフェースの具体的な実装としてHashAttributeSetが含まれています。 HashAttributeSet
はハッシュ・マップに基づく属性セットを提供します。 この実装を使用するか、またはAttributeSet
インタフェースの独自の実装を提供することができます。
Java Print Service APIは、「属性の役割」セクションで説明されているとおり、4種類の属性の1つだけを保持するように制限されている属性セットの次の4つの特殊化を提供します。
ここでは4種類の属性セットだけがリストされていますが、5種類の属性があることに注意してください。 SupportedValuesAttributeインタフェースは、別の属性でサポートする値を提供する属性を表示します。 サポートする値の属性は属性セットには統合されないため、これらを定義する属性セットのサブインタフェースはありません。
一部のコンテキストでは、属性セットは読込み専用の場合がありますが、これはクライアントが属性セットの内容を検査することはできるが変更できないことを意味します。 別のコンテキストでは、属性セットが読み込み、書込み可能の場合がありますが、これはクライアントが属性セットの内容の検査と変更の両方を行うことができることを意味します。 読込み専用属性セットの場合、変更オペレーションの呼出しはUnmodifiableSetException
をスローします。
パッケージjavax.print.attribute
には、各属性セット・サブ・インタフェースの具体的な実装が1つ含まれています:
- HashDocAttributeSet
- HashPrintRequestAttributeSet、
- HashPrintJobAttributeSet、
- HashPrintServiceAttributeSet
属性クラスの設計
属性値は、整数値または列挙値など小さい不可分なデータ項目です。 Java Print Service APIは、属性値を表すためにintなど基本データ型を使用しません。その理由は次のとおりです。- 基本データ型は型保証されていない。 たとえば、コンパイラは「copies」属性値を、「sides」属性として使用することはできない
- 一部の属性は、いくつかの値のレコードとして表されなければならない。 たとえば、プリンタの解像度は600 x 300 dpiを表すために600と300の2つの数が必要になる
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)の属性の抽象構文である。
各属性クラスは、直接的または間接的に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
-
クラス説明インタフェース
Attribute
は、クラスが印刷属性を表すことを示すために、あらゆる印刷属性クラスによって実装される基本インタフェースです。インタフェースAttributeSet
は、一連の印刷属性のインタフェースを指定します。クラスAttributeSetUtilities
は、AttributeSets
を操作する静的メソッドを提供します。クラスDateTimeSyntax
は、値が日付と時間であるすべての属性の共通の実装を提供する抽象基本クラスです。インタフェースDocAttribute
は、属性がドキュメントの設定を示すことを示すために印刷属性クラスが実装するタグ付けインタフェースです。インタフェースDocAttributeSet
は、doc属性のセット、つまりインタフェースDocAttribute
を実装する印刷属性のインタフェースを指定します。クラスEnumSyntax
は、すべての"型の安全な列挙型"オブジェクトの共通実装を提供する抽象基本クラスです。クラスHashAttributeSet
は、ハッシュ・マップの特性を持つAttributeSet
実装を提供します。クラスHashDocAttributeSet
は、その実装をクラスHashAttributeSet
から継承し、インタフェースDocAttributeSet
の意味制限を強制する属性セットを提供します。クラスHashPrintJobAttributeSet
は、その実装をクラスHashAttributeSet
から継承し、インタフェースPrintJobAttributeSet
の意味制限を強制する属性セットを提供します。クラスHashPrintRequestAttributeSet
は、その実装をクラスHashAttributeSet
から継承し、インタフェースPrintRequestAttributeSet
の意味制約を適用します。クラスHashPrintServiceAttributeSet
は、その実装をクラスHashAttributeSet
から継承し、インタフェースPrintServiceAttributeSet
の意味制限を強制する属性セットを提供します。クラスIntegerSyntax
は、整数値を持つすべての属性の共通の実装を提供する抽象基本クラスです。PrintJobAttribute
は、属性が印刷ジョブのステータスまたは印刷ジョブの他の特性を記述していることを示すために、印刷属性クラスが実装するタグ付けインタフェースです。インタフェースPrintJobAttributeSet
は、一連の印刷ジョブ属性、つまりインタフェースPrintJobAttribute
を実装する印刷属性のためのインタフェースを指定します。インタフェースPrintRequestAttribute
は、印刷属性クラスが実装するタグ付けインタフェースであり、属性が印刷ジョブに対してリクエストされた設定を示すことを示す。インタフェースPrintRequestAttributeSet
は、一連の印刷リクエスト属性、すなわちインタフェースPrintRequestAttribute
を実装する印刷属性のためのインタフェースを指定します。インタフェースPrintServiceAttribute
は、属性がPrint ServiceのステータスまたはPrint Serviceの他の特性を記述していることを示すために、印刷属性クラスが実装するタグ付けインタフェースです。インタフェースPrintServiceAttributeSet
は、一連の印刷ジョブ属性、つまりインタフェースPrintServiceAttribute
を実装する印刷属性のためのインタフェースを指定します。クラスResolutionSyntax
は、プリンタの解像度を示すすべての属性の共通実装を提供する抽象基本クラスです。クラスSetOfIntegerSyntax
は、値が非負整数の集合であるすべての属性の共通実装を提供する抽象基本クラスです。クラスSize2DSyntax
は、2ディメンションでサイズを示すすべての属性の共通実装を提供する抽象基本クラスです。インタフェースSupportedValuesAttribute
は、属性が他の属性のサポートされている値を記述していることを示すために印刷属性クラスが実装するタグ付けインタフェースです。クラスTextSyntax
は、値が文字列であるすべての属性の共通実装を提供する抽象基本クラスです。このセットが変更できないので要求されたオペレーションが実行できないことを示すためにスローされます。クラスURISyntax
は、値がUniform Resource Identifier (URI)であるすべての属性の共通実装を提供する抽象基本クラスです。