3.1 ダイレクト印刷を使用したアプリケーション開発の概要
アプリケーション開発の概要
biz-Streamダイレクト印刷を利用した印刷アプリケーションは、PDFを生成しクライアントに表示するWEBアプリケーションに似ています。これは、既存のbiz-Streamを利用してPDFを生成するWEBアプリケーションを簡単にダイレクト印刷アプリケーションに移行できることを意味します。基本的には、WEBアプリケーションが出力先に指定しているストリームのインスタンスの代わりに、ダイレクト印刷が提供するPDFDirectPrintStreamクラスのインスタンスを指定することでダイレクト印刷アプリケーションとなります。
また、このPDFDirectPrintStreamの提供するメソッドを呼び出すことで次のような印刷の制御をすることができます。
- 出力先のプリンタ名を指定
- 出力する際に使用するトレイを指定
- 印刷部数を指定
- 印刷結果または発生したエラーの内容等を応答するためのURLを指定
- 印刷に使用したデータをPDFファイルとしてローカルに保存
- 印刷のジョブ名称を任意の文字列で指定
- 印刷するファイルの開始ページ番号を指定
- 印刷するファイルの終了ページ番号を指定
- ページサイズに合わせて印刷フラグを指定
- 印刷ダイアログの表示有無を指定
クライアント/サーバ間の処理の流れ
ダイレクト印刷を利用したアプリケーションのクライアントとサーバの間では以下のような処理が行われます。- ブラウザから印刷要求を行います。
- アプリケーション開発者が実装する印刷アプリケーションで印刷データの出力用ストリームとしてPDFDirectPrintStreamクラスをインスタンス化し、必要な設定を行います。続いてbiz-StreamライブラリのPDF生成エンジンをインスタンス化し、出力先として先に生成したPDFDirectPrintStreamクラスのインスタンスを指定します。
- PDF生成エンジンに対してPDFの生成を指示します。生成されたPDFはPDFDirectPrintStreamクラスのインスタンスを経由して印刷データとしてブラウザにダウンロードされます。
- ブラウザはダウンロードした印刷データに対してダイレクト印刷クライアントモジュールを呼び出します。
- 呼び出されたダイレクト印刷クライアントモジュールは印刷データからプリンタに制御情報を取り出し、プリンタの選択およびその他制御を行います。その後、印刷データを印刷し、指定されていれば印刷データをPDFファイルとして保存します。また、この際に動作状況がログに記録されます。
- 印刷応答URLが指定されている場合、ダイレクト印刷クライアントモジュールは印刷および保存処理が完了すると、その結果をGETメソッドで指定されたURLに送信します。
- アプリケーション開発者が実装する印刷結果を処理するサーブレットは受け取った印刷結果にしたがって処理を行います。
コーディング方法
前述のように、ダイレクト印刷アプリケーションはPDFを生成する部分は既存のPDF生成アプリケーションと同じように作成できます。ここではダイレクト印刷のコーディングに関して説明するため、biz-Streamライブラリを利用したPDFを生成するWEBアプリケーションがすでにあるものとします。biz-Streamライブラリを利用したPDFを生成するWEBアプリケーションの開発方法およびレイアウトの作成方法に関してはbiz-Streamの各マニュアルをご確認ください。最も簡単なPDFを生成するWEBアプリケーションは以下のように記述できます。(ここではサーブレットの基本的な処理は省略してあります)
public void makePdf(HttpServletResponse response) throws Exception { ServletOutputStream output = response.getOutputStream(); PDFEngine pdf = new PDFEngine( output ); XMLSuper xml = new JaxpXML( "${base-dir}/sample/xml/Circle/CircleSample1.xml" , pdf ); xml.parse(); xml.calcDataSize(); xml.setPageSize(); xml.toPDF(); xml.close(); }
これをダイレクト印刷アプリケーションに移行する場合、次の赤行のような変更を加えることになります。(PDF生成エンジンの出力先に指定していた出力ストリームをPDFDirectPrintStreamのインスタンスに変更するだけです)
public void makePdf(HttpServletResponse response) throws Exception { PDFDirectPrintStream direct = new PDFDirectPrintStream( response ); PDFEngine pdf = new PDFEngine( direct ); XMLSuper xml = new JaxpXML( "${base-dir}/sample/xml/Circle/CircleSample1.xml" , pdf ); xml.parse(); xml.calcDataSize(); xml.setPageSize(); xml.toPDF(); xml.close(); }
また、ダイレクト印刷時のプリンタの制御は以下のようにPDFDirectPrintStreamのメソッドを呼び出すことで行います。
PDFDirectPrintStream direct = new PDFDirectPrintStream(response); direct.setPrinterName("Canon LBP3800 LIPSLX"); //プリンタ名 direct.setNumberOfCopy(1); // 印刷部数
PDFDirectPrintStreamのインターフェイスに関しては『3.5 DirectPrintStreamクラス』に詳細に記述しています。
また、『第4章 サンプルプログラム』で具体的な利用例を示しますのでこちらもご確認ください。