DocPrintJobでの印刷
前項では、PrinterJobを使って帳票印刷をしましたが、AttributeSetとPrintServiceと同時に導入されたDocPrintJobを使ってみたくなるかもしれません。この項ではPrinterSupportedクラスで選択したプリンタをDocPrintJobで使用する例を示します。
まず、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を使うと、次のようになります。
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が必要です。
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と同じなので省略します。
