Java Language
Javaプリントサービス
サーチ…
前書き
Java Print Service APIは、印刷サービスを検出して印刷要求を送信するための機能を提供します。
IETF仕様RFC 2911のインターネット印刷プロトコル(IPP)1.1で規定された標準属性に基づく拡張可能な印刷属性を含む。
利用可能な印刷サービスの発見
使用可能なすべての印刷サービスを検出するために、 PrintServiceLookup
クラスを使用できます。どのように見てみましょう:
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
public class DiscoveringAvailablePrintServices {
public static void main(String[] args) {
discoverPrintServices();
}
public static void discoverPrintServices() {
PrintService[] allPrintServices = PrintServiceLookup.lookupPrintServices(null, null);
for (Printservice printService : allPrintServices) {
System.out.println("Print service name: " + printService.getName());
}
}
}
このプログラムは、Windows環境で実行されると、次のように出力されます。
Print service name: Fax
Print service name: Microsoft Print to PDF
Print service name: Microsoft XPS Document Viewer
デフォルトの印刷サービスの検出
デフォルトのプリントサービスを検出するために、 PrintServiceLookup
クラスを使用できます。方法を見てみましょう::
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
public class DiscoveringDefaultPrintService {
public static void main(String[] args) {
discoverDefaultPrintService();
}
public static void discoverDefaultPrintService() {
PrintService defaultPrintService = PrintServiceLookup.lookupDefaultPrintService();
System.out.println("Default print service name: " + defaultPrintService.getName());
}
}
印刷サービスからの印刷ジョブの作成
印刷ジョブは、特定の印刷サービスに何かを印刷する要求です。基本的には、
- 印刷されるデータ( 印刷される文書の構築を参照)
- 属性のセット
正しいプリントサービスインスタンスを取得した後、プリントジョブの作成を要求することができます。
DocPrintJob printJob = printService.createPrintJob();
DocPrintJob
インターフェイスは、 print
メソッドを提供しprint
。
printJob.print(doc, pras);
doc
引数はDoc
:印刷されるデータです。
そして、 pras
引数があるPrintRequestAttributeSet
セット:インタフェースPrintRequestAttribute
。印刷要求属性の例は次のとおりです。
- コピー数(1,2等)、
- 向き(縦または横)
- 色度(モノクロ、カラー)
- 品質(ドラフト、ノーマル、ハイ)
- 両面(片面、両面など)
- 等々...
printメソッドはPrintException
スローすることがありPrintException
。
印刷される文書の作成
Doc
はインタフェースであり、Java Print Service APIはSimpleDoc
と呼ばれる簡単な実装を提供します。
すべてのDoc
インスタンスは、基本的に2つの側面から成り立っています。
- 印刷データコンテンツ自体(電子メール、画像、文書等)
-
DocFlavor
(MIMEタイプ+表現クラス)と呼ばれる印刷データフォーマット。
Doc
オブジェクトを作成する前に、ドキュメントをどこかから読み込む必要があります。この例では、ディスクから特定のファイルをロードします。
FileInputStream pdfFileInputStream = new FileInputStream("something.pdf");
これで、私たちのコンテンツと一致するDocFlavor
を選択する必要がありDocFlavor
。 DocFlavor
クラスには、最も一般的なタイプのデータを表す定数がDocFlavor
。 INPUT_STREAM.PDF
選択しましょう:
DocFlavor pdfDocFlavor = DocFlavor.INPUT_STREAM.PDF;
さて、 SimpleDoc
新しいインスタンスを作成することができます:
Doc doc = new SimpleDoc(pdfFileInputStream, pdfDocFlavor , null);
doc
オブジェクトを印刷ジョブ要求に送信できるようになりました( 印刷サービスからの印刷ジョブの作成を参照)。
印刷要求属性の定義
場合によっては、印刷要求のいくつかの側面を判断する必要があります。我々はそれを属性と呼ぶ。
印刷要求属性の例は次のとおりです。
- コピー数(1,2等)、
- 向き(縦または横)
- 色度(モノクロ、カラー)
- 品質(ドラフト、ノーマル、ハイ)
- 両面(片面、両面など)
- 等々...
それらのうちの1つを選択する前に、それぞれの値にどのような価値があるかを知るには、まず属性のセットを作成する必要があります。
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
これで追加できます。いくつかの例があります:
pras.add(new Copies(5));
pras.add(MediaSize.ISO_A4);
pras.add(OrientationRequested.PORTRAIT);
pras.add(PrintQuality.NORMAL);
pras
オブジェクトを印刷ジョブ要求に送信できるようになりました( 印刷サービスからの印刷ジョブの作成を参照)。
リッスン印刷ジョブ要求状況の変更
ほとんどの印刷クライアントでは、印刷ジョブが終了したか失敗したかを知るのに非常に便利です。
Java Print Service APIは、これらのシナリオに関する情報を得るためのいくつかの機能を提供します。我々がしなければならないのは、
-
PrintJobListener
インタフェースの実装を提供し、 - この実装を印刷ジョブに登録します。
印刷ジョブの状態が変わると、通知されます。私たちは何かが必要なことを行うことができます。例えば:
- ユーザインタフェースを更新し、
- 別のビジネスプロセスを開始し、
- データベースに何かを記録し、
- または単純にログに記録します。
以下の例では、すべての印刷ジョブのステータス変更を記録します:
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;
public class LoggerPrintJobListener implements PrintJobListener {
// Your favorite Logger class goes here!
private static final Logger LOG = Logger.getLogger(LoggerPrintJobListener.class);
public void printDataTransferCompleted(PrintJobEvent pje) {
LOG.info("Print data transfer completed ;) ");
}
public void printJobCompleted(PrintJobEvent pje) {
LOG.info("Print job completed =) ");
}
public void printJobFailed(PrintJobEvent pje) {
LOG.info("Print job failed =( ");
}
public void printJobCanceled(PrintJobEvent pje) {
LOG.info("Print job canceled :| ");
}
public void printJobNoMoreEvents(PrintJobEvent pje) {
LOG.info("No more events to the job ");
}
public void printJobRequiresAttention(PrintJobEvent pje) {
LOG.info("Print job requires attention :O ");
}
}
最後に、次のように、印刷ジョブ自体の前に、印刷ジョブのリスナー実装を印刷ジョブに追加することができます。
DocPrintJob printJob = printService.createPrintJob();
printJob.addPrintJobListener(new LoggerPrintJobListener());
printJob.print(doc, pras);
PrintJobEvent pje引数
すべてのメソッドにPrintJobEvent pje
引数があることに注意してください。この例では簡単のために使用していませんが、ステータスを調べるために使用することができます。例えば:
pje.getPrintJob().getAttributes();
PrintJobAttributeSet
オブジェクトインスタンスを返し、それぞれに対してfor each wayを実行できます。
同じ目標を達成する別の方法
同じ目標を達成するためのもう1つのオプションは、 PrintJobAdapter
クラスを拡張することです(名前が示すように、 PrintJobListener
アダプタです)。インタフェースを実装するには、それらのすべてを強制的に実装する必要があります。この方法の利点は、私たちが望むメソッドだけをオーバーライドする必要があることです。どのように動作するか見てみましょう:
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobAdapter;
public class LoggerPrintJobAdapter extends PrintJobAdapter {
// Your favorite Logger class goes here!
private static final Logger LOG = Logger.getLogger(LoggerPrintJobAdapter.class);
public void printJobCompleted(PrintJobEvent pje) {
LOG.info("Print job completed =) ");
}
public void printJobFailed(PrintJobEvent pje) {
LOG.info("Print job failed =( ");
}
}
特定のメソッドだけをオーバーライドすることに注意してください。
インターフェイスのPrintJobListener
実装する例と同じ方法で、プリントジョブにプリントを送信する前にリスナーを追加します。
printJob.addPrintJobListener(new LoggerPrintJobAdapter());
printJob.print(doc, pras);