JPS(Java Print Service)
JPSを使った印刷では、ダイアログを出さずにプログラム側から属性を指定することができます。柔軟な印刷機能の実装ができる反面、プログラムは少し複雑になります。
public class JPSPrintDirect { public static void main(String[] args) throws PrintException { //印刷データの提供形式 DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE; //印刷要求属性 PrintRequestAttributeSet requestAttributeSet = new HashPrintRequestAttributeSet(); requestAttributeSet.add(new PageRanges("1-2")); requestAttributeSet.add(MediaSizeName.ISO_B5); //用紙B5 requestAttributeSet.add( new JobName("JPS印刷テスト", Locale.JAPANESE)); //ジョブ名 //既定で選択される出力先 PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); //印刷ジョブの生成 DocPrintJob job = defaultService.createPrintJob(); //印刷ドキュメントの生成 SimpleDoc doc = new SimpleDoc(new MyPrintable(), flavor, null); //ジョブに印刷を依頼する job.print(doc, requestAttributeSet); } }
PrintRequestAttributeSetという印刷要求属性を使うことによって、印刷ダイアログで指定する内容をプログラムから設定できます。JavaDocを参照すると非常に細かい印刷指定ができることがわかります。
ただし、印刷属性の全てが利用できるわけではありません。プリンタドライバがサポートしていないものは使うことができません。また、OS標準の印刷ダイアログで使用可能な属性であっても、JPSでは(残念な事に)サポートされていないというケースもあるようです。
今回のサンプルでは、印刷範囲(1-2)、用紙サイズ(B5)、印刷ジョブ名の指定を行いました。AWTのときと同じように、印刷ダイアログでの設定を行うようにしたい場合は以下のようになります。
public class JPSPrintDialog { public static void main(String[] args) throws PrintException { //印刷データの提供形式 DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE; //印刷要求属性 PrintRequestAttributeSet requestAttributeSet = new HashPrintRequestAttributeSet(); //印刷ダイアログでの出力先一覧 PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, requestAttributeSet); //既定で選択される出力先 PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); //印刷ダイアログを表示して選択した出力先を得る PrintService service = ServiceUI.printDialog(null, 100, 100, services, defaultService, flavor, requestAttributeSet); if (service != null){ //印刷ジョブの生成 DocPrintJob job = service.createPrintJob(); //印刷ドキュメントの生成 SimpleDoc doc = new SimpleDoc(new MyPrintable(), flavor, null); //ジョブに印刷を依頼する job.print(doc, requestAttributeSet); } } }
印刷ダイアログでは「PrintServiceの選択と、PrintRequestAttributeSetの設定を行っている」と考えることができます。印刷ダイアログはSwingのユーザインターフェースで表示されるため、OS標準の印刷ダイアログとは見た目が多少異なります。

まとめ
- 印刷機能の実装はJava Graphicsを使って画面への描画と同じ要領で行うことができます。
- 印刷機能の実装にはAWTとJPSの2種類の方法があります。
- AWTではOS標準の印刷ダイアログが使用可能です。ただし、プログラムからの印刷属性指定はほとんどできません。
- JPSではプログラムによる細かな印刷制御が可能です。ただし、印刷ダイアログはSwingのインタフェースになってしまいます。
ユーザ操作による印刷がメインの場合は、AWTの印刷機能を使った方が良いでしょう。使い慣れたインタフェースによって違和感なく印刷設定が可能です。
一方、プログラムよる自動印刷処理など場合には、JPSを使ったほうが良いと思います。AWTのようなユーザ操作を必要とせず、プログラムから柔軟に印刷属性の指定を行うことができますし、印刷イベントのハンドリングも可能です。
今回紹介した印刷プログラムは非常に簡単なものですが、これを足掛かりに自分なりの印刷機能を作ってみてはどうでしょうか。
