サーチ…


前書き

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を選択する必要がありDocFlavorDocFlavorクラスには、最も一般的なタイプのデータを表す定数がDocFlavorINPUT_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);


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow