SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Java Graphicsを使ってかんたんプリント

JavaプログラムにAWTとJPSで印刷機能を実装する

JPS(Java Print Service)

 JPSを使った印刷では、ダイアログを出さずにプログラム側から属性を指定することができます。柔軟な印刷機能の実装ができる反面、プログラムは少し複雑になります。

JPSPrintDirect.java
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のときと同じように、印刷ダイアログでの設定を行うようにしたい場合は以下のようになります。

JPSPrintDialog.java
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標準の印刷ダイアログとは見た目が多少異なります。

JPSのSwing印刷ダイアログ
JPSのSwing印刷ダイアログ

まとめ

  • 印刷機能の実装はJava Graphicsを使って画面への描画と同じ要領で行うことができます。
  • 印刷機能の実装にはAWTとJPSの2種類の方法があります。
  • AWTではOS標準の印刷ダイアログが使用可能です。ただし、プログラムからの印刷属性指定はほとんどできません。
  • JPSではプログラムによる細かな印刷制御が可能です。ただし、印刷ダイアログはSwingのインタフェースになってしまいます。

 ユーザ操作による印刷がメインの場合は、AWTの印刷機能を使った方が良いでしょう。使い慣れたインタフェースによって違和感なく印刷設定が可能です。

 一方、プログラムよる自動印刷処理など場合には、JPSを使ったほうが良いと思います。AWTのようなユーザ操作を必要とせず、プログラムから柔軟に印刷属性の指定を行うことができますし、印刷イベントのハンドリングも可能です。

 今回紹介した印刷プログラムは非常に簡単なものですが、これを足掛かりに自分なりの印刷機能を作ってみてはどうでしょうか。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

佐々木孝(ササキタカシ)

Javaをメインに業務システムの開発サポート、パッケージ開発、および技術研究をしています。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2468 2008/09/05 11:18

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー