PrintServiceインターフェースのメソッドでプリンタ(ドライバ)から情報を得ることを考える。プリンタで使える用紙についての情報が、Java内だけでは足りない。今回注目するのは、getSupportedAttributeValues()。PrintRequestAttributeSetに指定することができるようになる。加えてPrintServiceにある使えそうなメソッドについて試してみる。Linux(Debian9)とWindows10の両方で結果を書き出している。lookupPrintServices()▲まず、番外でlookupPrintServices()メソッド。番外なのは、PrintServiceインターフェースのメソッドでないから。PrinterJobとPrintServiceLookupの両方のクラスにメソッドがある。}}結果は制限を加えないものは当然同等。LinuxとWindowsではインストールされているプリンタが異なるが、A4までしか使えないMp493とA3まで使えるPX-1700Fは両方にドライバがあり両方で使っている。⇣⇡Linuxでは▲A3指定するとPX-1700Fのみ検出される。EPSON_EPSON_PX-1700FCanon_MP493は一台だが、デフォルトの用紙の異なる6つのサービスを登録している。iP9910A4までのはずのMP493もA3で使えることになっている。A4だとOneNoteとFaxが追加になって増える。Microsoft...と共に仮想的なサービスのようだ。iP9910⇣⇡(0)その結論▲lookupPrintServices(null,rqset)でのA3指定はLinuxで有効だがWindowsでは無視されるWindowsで出てくる仮想的なサービスを簡単に見分ける方法がない。設定可能項目の分類名を得る▲ここからPrinterServiceのメソッドAttributeにはカテゴリーに分けられて属性が入っている。属性といえば、Key-Valueの組み合わせのように感ずるが、格納先がAttributeSetなので、厳密には値だけ。この印刷サービスのジョブ設定時に、クライアントが指定可能な印刷属性カテゴリを判別します。sv.getSupportedAttributeCategories();サービスのリストをとった前のプログラムを流用したのでわかりにくいかもしれない。sv)というメソッドの部分が今回の出力をしている部分。いう名前のプリンタだけ調べるている。LinuxとWindowsでカテゴリの名前が異なるが、共通部分があった。}}⇣⇡Linuxでは▲Linux,Windowsでは異なるカテゴリもある。色を付けたのはよく見るクラス。}//for}//ifCanon_MP493_seriesの用紙だけを調べています。attributes)MediaというクラスはAttributeインタフェースを持ちます。MediaSizeNameクラスの親クラスです。戻値はObjectなので何でもありですが、Media.classを引数にすると、MediaSizeNameやMediaTrayやMediaNameのインスタンスの配列が返ります。そこでキャストしてから、代入します。null);ここで、pr1はCanon_MP493_seriesです。sun....がある。MediaSizeNameを得る。printer)はプログラム内部のstaticメソッドで長形3号の大きさ(120x235)に合うMediaSizeNameを返す。JavaのMediaSizeNameに登録されていない長形3号が得られるという所が大事。戻ってきたMediaSizeNameをPrintRequestAttributeSetに加えて、プリンタダイアログを出すとその用紙サイズが初期値になっている。MediaSizeNameかMediaTrayかMediaNameのどれかですから、MediaSizeNameのときだけ取り出して、キャストしてMediaSizeNameに代入します。これからMediaSize.getMediaSizeForName()メソッドでMediaSizeを求めます。サービス(プリンタ)から得られたものから探しているので、長形3号も入っている可能性があります。MediaSizeのインスタンスから縦横の長さを求め、(120x235)に近いかを確認します。インチも用意しましたが、探す値がインチでなければmmで十分でしょう。差が2mm以内ということでチェックしています。見つかったら、対応するMediaSizeNameを返します。複数見つかったらあとの方のMediaSizeNameが返ります。同じプリンタですが、呼び名が異なります。同様な方法で長形3号のマップを得る▲プログラムはPrintTest04.javaだが、他の結果に使ったメソッドが残っている。サービスのリストから、長形3号の大きさに対応するプリンタを探し、サービス->MediaSizeNameのマップとして返す。マップにする理由はプリンタによりMediaSizeNameが異なるから。マップから配列を作ってプリンタの選択肢に、MediaSizeNameはとりあえず0番のものを使用。今後入れたい機構1.今後デフォルトプリンタがあればそれを初期値にする。2.選択したプリンタによりMediaSizeNameを設定し直す。サービスの配列をダイアログに渡す。このPrintService用のジョブ設定時に、クライアントが指定可能な印刷データ形式を判定します。この印刷サービスのプリンタ記述属性セットを取得します。Serviceの状態を指定します。普段見慣れない属性だった。この印刷サービスの指定されたカテゴリ内でのデフォルト印刷属性値を判別します。}⇣⇡Linuxでは▲Linuxではトレイの切り替えができないので、いろいろな用紙をデフォルトにしたプリンタを登録している。そのデフォルトがきちんと出てきている。javax.print.attribute.standard.Media(MediaSizeName)attr.getName():mediaiso-a4⇣⇡Windowsでは▲Windowsのドライバはどれも普通なのでA4。実物のプリンタでないサービスも多い。使えるかいという問いかけをするAttributeインターフェースを持つクラスのインスタンスでなければならない。Service用のジョブ設定時に、クライアントが特定の印刷属性値を指定可能かどうかを判別します。(拡大縮小)安達順一(2019-05-27)https://dabiyone.com/。