SHOEISHA iD

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

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

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

Javaの標準機能だけで実現する帳票印刷

プリンタの検索と選択、そして特に長形3号封筒への印刷

Javaの標準機能だけで実現する帳票印刷 第3回

DocPrintJobでの印刷

 前項では、PrinterJobを使って帳票印刷をしましたが、AttributeSetとPrintServiceと同時に導入されたDocPrintJobを使ってみたくなるかもしれません。この項ではPrinterSupportedクラスで選択したプリンタをDocPrintJobで使用する例を示します。

 まず、PrinterJobを使ったものを再掲します。

PrinterJobを使った印刷例
Printable pable = new SomethingPrintable02();
PrintRequestAttributeSet rqset = new HashPrintRequestAttributeSet();
rqset.add(OrientationRequested.LANDSCAPE);
PrinterSupported supp = new PrinterSupported();
PrintService sv = supp.printerSetTo(x,y,rqset);
if (sv !=null) {
    PrinterJob pj = PrinterJob.getPrinterJob();
    pj.setPrintable(pable);
    try {
        pj.setPrintService(sv);
        if (pj.printDialog(rqset)) pj.print(rqset);
    }catch (PrinterException e) {
        System.err.println(e);
    }
}

 DocPrintJobを使うと、次のようになります。

DocPrintJobを使った印刷例
Printable pable = new SomethingPrintable02();
DocFlavor flv = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
DocAttributeSet das = new HashDocAttributeSet();
Doc doc = new SimpleDoc(pable, flv, das);
PrintRequestAttributeSet rqset = new HashPrintRequestAttributeSet();
rqset.add(OrientationRequested.LANDSCAPE);
PrinterSupported supp = new PrinterSupported();
PrintService sv = supp.printerSetTo(x,y,rqset);
if (sv !=null) {
    sv = ServiceUI.printDialog(null, 200, 200,
        new PrintService[]{sv}, sv, flv, rqset);
}
if (sv !=null) {
    DocPrintJob dpj = sv.createPrintJob();
    try {
        dpj.print(doc, rqset); 
    }
    catch (PrintException e) {
        System.err.println(e);
    }
}

 この2つは手順として対応するように順序を工夫してあります。

 DocPrintJobの場合はDPJと略記し、PrinterJobの場合はPJと略記して両者を比較しながら解説してみます。

  • ドキュメントの用意
    DocPrintJob(以下DPJと略記)の場合、DocFlavorが必須です。
    帳票印刷の場合DocFlavor.SERVICE_FORMATTED.PRINTABLEとします。
    DocAttributeSetはここでは必要ありません。空で適用するかnullを設定します。ここでは空で。
    以下の手順でDocFlavorはなくても済ませられますが、PrintServiceLookupやServiceUI.printDialog()で使う場合もあるので、ドキュメントの用意は最初にしておきます。
  • 属性の用意
    次のプリンタ選択に使います。プリンタ選択でこの属性セットに値が加えられるので、設定するものがなくてもここでインスタンスを作ります。用紙と余白以外はここで設定してしまいます。例としてLANDSCAPEを加えています。
  • プリンタ選択
    今回作成したPrinterSupportedを使います。
    DPJの場合、ここにさらにServiceUI.printDialog()を加えました。わざとプリンタを選択できないようにしてあります。用紙や余白の確認用です。必要なければ削除します。
    PrinterJob(以下PJと略記)の場合はPrinterJob#printDialog()で確認していますが、こちらもこのようにしたほうが安心かもしれません。
  • Jobインスタンスの生成
    PJはstaticメソッドで生成するのでどこでもできますが、DPJはサービスから生成しますそこで、サービスが確定したあとに位置しています。
  • 印刷
    PJではサービスと結びつけてから属性セットを指定して印刷します。PrinterJob#printDialog()を使うにはサービスを結びつけた後である必要があります。上にも記したように、DPJと同様の場所でServiceUI.printDialog()を使って確認する方がよいかもしれません。
    DPJではDocと属性セットを指定して印刷するだけです。

プリンタ選択+DocPrintJobの印刷プログラム例

 このプログラムの実行には、PrinterSupported.javaとSomethingPrintable02.javaが必要です。

WithDocPrintJob.java
import java.awt.print.Printable;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
/** WithDocPrintJob.java
    PrintRequestAttributeSet と
    PrinterSupportedクラスを使って選択したプリンタ(と用紙)と
    DocPrintJobを使う帳票印刷の典型例
    印刷内容はSomethingPrintable02.javaを使います
    起動時の引数で長形3号、葉書、角形2号、A3、A4、角形6号、洋形6号
    の用紙に印刷できます。プログラム中のX,Yの値を変更すれば
    他の用紙にも印刷可能です。
    コメント行の変更で縦置き、横置きも変更できます
    2019-06-05 Adachi
     */
public class WithDocPrintJob {
    public static void main(String[] args) {
        boolean DEBUG = true;
        int job = 4;
        float x=210f;
        float y=297f;
        if (args.length==0) {
           System.out.println("0:chou3 1:hagaki 2:kaku2 3:A3");
           System.out.println("4:A4    5:kaku6  6:you6 ");
       }
        if (args.length>0) job = Integer.parseInt(args[0]);
        if(job==0) {x=120f; y=235f;} //chou_3
        if(job==1) {x=100f; y=148f;} //hagaki
        if(job==2) {x=240f; y=332f;} //kaku_2
        if(job==3) {x=297f; y=420f;} //A3
        if(job==4) {x=210f; y=297f;} //A4
        if(job==5) {x=162f; y=229f;} //kaku_6
        if(job==6) {x=98f; y=190f;} //you_6
        
        Printable pable = new SomethingPrintable02();
        DocFlavor flv = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
        DocAttributeSet das = new HashDocAttributeSet();
        Doc doc = new SimpleDoc(pable, flv, das);
        PrintRequestAttributeSet rqset = new HashPrintRequestAttributeSet();
        //rqset.add(OrientationRequested.LANDSCAPE);
        //rqset.add(OrientationRequested.REVERSE_LANDSCAPE);
        PrinterSupported supp = new PrinterSupported();
        PrintService sv = supp.printerSetTo(x,y,rqset);
        if (sv !=null) {
            sv = ServiceUI.printDialog(null, 200, 200,
                new PrintService[]{sv}, sv, flv, rqset);
        }
        if (sv !=null) {
            DocPrintJob dpj = sv.createPrintJob();
            try {
                dpj.print(doc, rqset); 
            }
            catch (PrintException e) {
                System.err.println(e);
            }
        }
    }
}

 実行結果はSomethingPrintable02.javaと同じなので省略します。

次のページ
(4)Linuxでトレイを切り替える方法

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

Javaの標準機能だけで実現する帳票印刷連載記事一覧

もっと読む

この記事の著者

安達 順一(アダチ ジュンイチ)

私立高校に理科・情報の教員として勤めていました。Linuxサーバー/クライアントの授業システムを作り、移動プロファイルで運用していました。教員用にもLinuxサーバーを用意し成績処理プログラムを書きました。情報の学校設定科目ではウェブページ制作とjavaのプログラミングの初歩の授業を作りました。情報...

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11671 2020/06/22 11:00

イベント

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

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

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

メールバックナンバー