そんなアホな話は置いておいて・・・
java.awt.print
javax.print
をさわってみました。
awtの方は、Graphicsに絵を描いといて出力するので
Java2Dで描ける図形なら、大抵印刷できるらしい。
当然、Lineでもって罫線ひっぱりゃ帳票になるので、
中の人の頑張り次第で、帳票出力もできますよ。と。
javax.printの方は、JDKの印刷APIの最終形のようで
(どっかのサイトでそう書いてあった)
ファイルとかBufferedImageとか、Streamから直接印刷したり、
印刷にデータ投げた後、Listener使ってイベントハンドリングしたりできる。
で、その中に用紙切れとか、インクなくなったときのような
なんかユーザが、プリンタに手出せば回復できるエラーを
イベントとして取れるようなことが書いてあったので、早速実験した所・・・
取れませんでした。(;´д⊂)
なんかネットワークプリンタとかの時は対応して無いらしい。
Java 印刷サービス APIユーザガイド PrintJobListener
特に、printJobNoMoreEvents は、発行頻度は高くありませんが、役に立つメッセージです。クライアントでは、多くの場合、ジョブの終了または失敗を把握する必要があります。可能な場合は、サービスはこのような「終了」イベントを配信する必要があります。ただし、ジョブの終了または失敗をサービスが判断できない場合は、「完了」メッセージによって誤った処理が実行されることがあります。たとえば、可視キューが存在しないネットワーク印刷サービスに対して、ジョブがスプールされることがあります。 この場合、「no more events」というメッセージが配信されても、ジョブが正常終了したと確実に判断することはできません。しかし、クライアントは、ジョブの失敗は通知されていないと判断することはできます。 次の例では、printJobNoMoreEvents メッセージを監視するリスナーを追加しています。
室伏並になげっぱになります。の意。
微妙な所で手が回らないJava。こういうとこC++とかの方が便利だなとか思う・・・
一応直接つないだ場合のテストもしてみるつもりだけど、
なんか取れなさそうな気がしてしょうがない~~どうなんでしょ~?
追記
取れませんでした。何がいけないんだろ。コードが悪いのか?
でもリスナaddしてSystem.out出してるだけなんだが・・・
ドライバによるのかな?
Unix/Linux環境のプリンタだといけるのかなぁ。謎すぎ。
PrintService service = PrintServiceLookup.lookupDefaultPrintService();
DocPrintJob job = service.createPrintJob();
job.addPrintJobListener(new PrintJobListener() {
//正常にデータ転送完了
public void printDataTransferCompleted(PrintJobEvent pje) {
System.out.println("正常にデータ転送完了:" + pje.toString());
}
//取り消された
public void printJobCanceled(PrintJobEvent pje) {
System.out.println("取り消された:" + pje.toString());
}
//正常に完了
public void printJobCompleted(PrintJobEvent pje) {
System.out.println("正常に完了した:" + pje.toString());
}
//正常に完了せず。再送信が必要
public void printJobFailed(PrintJobEvent pje) {
System.out.println("正常に完了しなかった。再送信が必要:" + pje.toString());
}
//イベントの送信がこれ以上ない
public void printJobNoMoreEvents(PrintJobEvent pje) {
System.out.println("イベントの送信がこれ以上存在しない:" + pje.toString());
}
//紙切れとか。
public void printJobRequiresAttention(PrintJobEvent pje) {
System.out.println("紙切れやインク切れなど、ユーザの操作で復帰:" + pje.toString());
}
});
PrintRequestAttributeSet props = new HashPrintRequestAttributeSet();
//thisはjava.awt.print.Printable を実装したクラス。
//このコードはJPanelにimplementsさせてそのコード上で書いてました。サンプルだし。
Doc doc = new SimpleDoc(this, (DocFlavor.SERVICE_FORMATTED.PRINTABLE), new HashDocAttributeSet() );
job.print(doc,props);
Sevlet環境を意識してか、すべてプロパティを指定してから印刷に投げることができます。(プリンタダイアログを出さずに印刷できる)
HashDocAttributeSetにjavax.print.attribute.standardのクラスをaddしてやればよろし。
プリンタを指定したきゃPrintServiceLookup.lookupDefaultPrintService();の部分を変えてあげましょう。
もっと細かくプリンタの情報がとりたいという人は、こちらを参考に。あぁそうかとひざを打つw
javax.print初体験 - いがぴょん様