biz-Streamマニュアル バッチ印刷ガイド 第4章 サンプルプログラム 4.1 印刷指示処理サンプル (BatchSrv1.java)

4.1 印刷指示処理サンプル (BatchSrv1.java)

概要

このサンプルでは、レイアウトファイル「Sample1.xml」をバッチ印刷しています。このとき、プリンタの制御として以下のように設定します。

  1. プリンタは Bullzip PDF Printer に出力します。

  2. 印刷部数は1部のみです。

  3. 出力トレイは自動的に最適なものを選択します。

  4. 印刷ジョブ名は「BatchPrintSrv1」を含むユニークな文字列となります。

  5. 1ページ目から印刷されます。

  6. 最終ページまで印刷されます。

  7. 用紙サイズに合わせて印刷します。

また、このサンプルでは、PDFBatchPrintStream クラスの doPrint メソッドにより印刷指示を行った後、PDFBatchPrintStream クラスの getJobId、getResult メソッドなどで「ジョブID」「印刷状態」を取得します。その結果「バッチ印刷エラーコード」を検知した場合は印刷の再実行を行います。 異常終了や例外を検知した場合はそこでプログラムを終了します。

サンプル構成

項目 ファイルパス
ページレイアウトサンプル <biz-Stream_home>/sample/java/Sample1.xml サンプル1
ソースサンプル <biz-Stream_home>/sample/batch_print/BatchSrv1.java サンプル1


ソースサンプル

赤行は、バッチ印刷のロジックを追加、変更する箇所を示します。

import java.net.URLDecoder;
import java.util.Collection;
import java.util.Hashtable;

import com.brainsellers.pdf.print.PDFBatchPrintStatus;
import com.brainsellers.pdf.print.PDFBatchPrintStream;
import com.brainsellers.pdf.print.PDFBatchStatus;
import com.brainsellers.xml.JaxpXML;
import com.brainsellers.xml.common.XMLSuper;
import com.brainsellers.xml.page.PDFEngine;


public class BatchSrv1 {

	// バッチ印刷サーバのホスト名
	public static final String BATCHPRINT_SERVER = "server";
	// バッチ印刷サーバのポート番号
	public static final String PORT_NO = "3000";
	// プリンタ名
	public static final String PRINTER_NAME = "Bullzip PDF Printer";
	// 印刷状態の取得間隔 (単位:ミリ秒)
	// 【注意】1000ミリ秒未満はバッチ印刷サーバに負荷が掛かるため短くしすぎないこと
	public static final int INTERVAL = 1 * 1000;

	// 連続印刷数
	public static final int LOOP = 1;
	// 連番
	public static int i = 0;


	public static void main(String[] args) {
		try {
			// 連続印刷をシミュレーションする
			for (i = 0; i < LOOP; i++) {
				new BatchSrv1();
			}

			System.exit(0);
		} catch (Exception e) {
			e.printStackTrace();

			System.exit(1);
		}
	}

	/**
	 * 印刷要求を1回送信し、印刷状態を監視する
	 *
	 * @throws Exception
	 */
	public BatchSrv1() throws Exception {
		// 印刷のループ
		// 通常は1回で抜けるが、PDF生成からやり直した場合は複数回ループする
		PRINT_LOOP : while (true) {

			PDFBatchPrintStream batchPrintStream = null;
			try {
				// PDF生成とバッチ印刷サーバへの送信を行う
				batchPrintStream = doPrint();
			} catch (Exception ex) {
				// 以下の場合に該当
				// ・PDF生成でエラーが発生した場合

				// エラー処理をして異常終了とする
				throw new Exception("【エラー1】PDF生成でエラーが発生しました。プログラムを終了します。", ex);
			}

			String jobId = batchPrintStream.getJobId();
			String result = batchPrintStream.getResult();
			String errorCode = batchPrintStream.getErrorCode();
			String errorDetails = batchPrintStream.getErrorDetails();
			if (errorDetails != null) {
				errorDetails = URLDecoder.decode(errorDetails, "UTF-8");
			}

			System.out.println("==============================");
			System.out.println("JobID=" + jobId);
			System.out.println("Result=" + result);
			System.out.println("ErrorCode=" + errorCode);
			System.out.println("ErrorDetails="+ errorDetails);
			System.out.println("==============================");

			if (result == null || result.equals("")) {
				// 以下の場合に該当
				// ・バッチ印刷が起動していない場合
				// ・接続先が誤っている場合
				// ・バッチ印刷が印刷要求または印刷状態要求を受け付けられない場合
				System.err.println("【エラー2】バッチ印刷の印刷要求結果を取得できませんでした。再度PDF生成からやり直します。");

				// 待ち時間の後、再度印刷要求を行う
				sleep();
				continue PRINT_LOOP;
			}

			if (result.equalsIgnoreCase("FAIL")) {
				if (errorCode != null && (errorCode.equals("114") || errorCode.equals("405") || errorCode.equals("506"))) {
					// 以下の場合に該当
					// 114=バッチ印刷のキュー上限に達した場合
					// 405=スプールタイムアウトが発生した場合
					// 506=指定したJobIDに対応する印刷状態が存在しない場合(バッチ印刷が再起動された場合など)
					System.err.println("【エラー3】バッチ印刷でエラーが発生しました。再度PDF生成からやり直します。エラーコード: " + errorCode + ", エラーメッセージ: " + errorDetails);

					// 待ち時間の後、再度印刷要求を行う
					sleep();
					continue PRINT_LOOP;
				} else {
					// 上記以外の場合に該当
					// エラー処理をして異常終了とする
					throw new Exception("【エラー4】バッチ印刷でエラーが発生しました。プログラムを終了します。エラーコード: " + errorCode + ", エラーメッセージ: " + errorDetails);
				}
			} else {
				// 待ち時間の後、印刷状態取得を行う
				sleep();

				// 印刷状態取得ループ
				// ステータスコードが0006になるまでINTERVAL間隔で印刷状態取得を繰り返す
				STATUS_LOOP : while (true) {
					// 印刷状態を取得する
					PDFBatchPrintStatus batchPrintStatus = getBatchPrintStatus(jobId);

					if (batchPrintStatus == null) {
						// 以下の場合に該当
						// ・バッチ印刷が印刷状態要求を受け付けられなかった場合

						// 【注意】
						// このパターンは印刷状態取得に失敗するが、印刷成功・失敗は不定となる
						// PDF生成からやり直した場合、二重に印刷されてしまう可能性があるため注意
						// 厳密に印刷結果を管理するには異常終了としてプログラムを止めた後に出力結果を確認、未印刷分からやり直すこと

						// 二重に印刷される可能性を許容する場合はこちらのロジックを使用する
						System.err.println("【エラー5】バッチ印刷の印刷状態を取得できませんでした。再度PDF生成からやり直します。");
						// 待ち時間の後、再度印刷要求を行う
						sleep();
						continue PRINT_LOOP;

						// 厳密に出力を管理するにはこちらのロジックを使用する
						// エラー処理をして異常終了とする
						// throw new Exception("【エラー5】バッチ印刷の印刷状態を取得できませんでした。プログラムを終了します。");
					}

					String dateTime = ((PDFBatchPrintStatus) batchPrintStatus).getDateTime();
					String errorCause = ((PDFBatchPrintStatus) batchPrintStatus).getErrorCause();
					errorCode = ((PDFBatchPrintStatus) batchPrintStatus).getErrorCode();
					errorDetails = ((PDFBatchPrintStatus) batchPrintStatus).getErrorDetails();
					String jobName = ((PDFBatchPrintStatus) batchPrintStatus).getJobName();
					String printerName = ((PDFBatchPrintStatus) batchPrintStatus).getPrinterName();
					String status = ((PDFBatchPrintStatus) batchPrintStatus).getStatus();
					String statusCode = ((PDFBatchPrintStatus) batchPrintStatus).getStatusCode();

					System.out.println("------------------------------");
					System.out.println("dateTime=" + dateTime);
					System.out.println("errorCause=" + errorCause);
					System.out.println("errorCode=" + errorCode);
					System.out.println("errorDetails=" + errorDetails);
					System.out.println("jobId=" + jobId);
					System.out.println("jobName=" + jobName);
					System.out.println("printerName=" + printerName);
					System.out.println("status=" + status);
					System.out.println("statusCode=" + statusCode);
					System.out.println("------------------------------");

					if (statusCode == null || statusCode.equals("")) {
						// 以下の場合に該当
						// ・バッチ印刷が印刷要求または印刷状態要求を受け付けられない場合
						// ・印刷状態最大保持数、印刷状態最大保持時間の値が小さく、印刷状態がクリアされてしまった場合

						// 【注意】
						// このパターンは印刷状態取得に失敗するが、印刷成功・失敗は不定となる
						// PDF生成からやり直した場合、二重に印刷されてしまう可能性があるため注意
						// 厳密に印刷結果を管理するには異常終了としてプログラムを止めた後に出力結果を確認、未印刷分からやり直すこと

						// 二重に印刷される可能性を許容する場合はこちらのロジックを使用する
						System.err.println("【エラー6】バッチ印刷の印刷状態を取得できませんでした。再度PDF生成からやり直します。");
						// 待ち時間の後、再度印刷要求を行う
						sleep();
						continue PRINT_LOOP;

						// 厳密に出力を管理するにはこちらのロジックを使用する
						// エラー処理をして異常終了とする
						// throw new Exception("【エラー6】バッチ印刷の印刷状態を取得できませんでした。プログラムを終了します。");
					} else if (statusCode.equals("0002") || statusCode.equals("0004")) {
						// 0002 (印刷指示受付)
						// 0004 (印刷中)

						// 以下の場合に該当
						// ・バッチ印刷のキューに存在するが、キュー取り出し待ち状態の場合
						// ・キューから取り出されてAdobeモジュールによるPDFロードが行われ、プリントスプーラへ入るまでの間の場合

						// 待ち時間の後、再度印刷状態取得を行う
						sleep();
						continue STATUS_LOOP;
					} else if (statusCode.equals("0006")) {
						// 0006 (印刷要求送信完了)

						// 以下の場合に該当
						// ・正常にプリントスプーラへ送信完了した場合
						System.out.println("【正常】プリントスプーラへの送信が完了しました。JobID: " + jobId);

						break PRINT_LOOP;
					} else if (statusCode.equals("0008")) {
						// 0008 (印刷異常終了)

						if (errorCode != null && errorCode.equals("000")) {
							// 以下の場合に該当
							// ・印刷状態は0008で確定しているがエラーコードが確定するまでの間に印刷状態取得が行われた場合

							// 待ち時間の後、再度印刷状態取得を行う
							sleep();
							continue STATUS_LOOP;
						} else if (errorCode != null && errorCode.equals("405")) {
							// 以下の場合に該当
							// 405=スプールタイムアウトが発生した場合
							System.err.println("【エラー7】バッチ印刷でエラーが発生しました。再度PDF生成からやり直します。エラーコード: " + errorCode + ", エラーメッセージ: " + errorDetails);

							// 待ち時間の後、再度印刷要求を行う
							sleep();
							continue PRINT_LOOP;
						} else {
							// 以下の場合に該当
							// ・AdobeモジュールによるPDFロード、またはプリントスプーラへの投入時にエラーが発生した場合

							// エラー処理をして異常終了とする
							throw new Exception("【エラー8】印刷異常終了となりました。プログラムを終了します。");
						}
					}
				}
			}
		}
	}

	/**
	 * PDF生成してバッチ印刷サーバに送信する
	 *
	 * @return 印刷要求結果
	 * @throws Exception
	 */
	private PDFBatchPrintStream doPrint() throws Exception {
		PDFBatchPrintStream batchPrintStream = null;

		try {
			// バッチ印刷ストリームの生成
			batchPrintStream = new PDFBatchPrintStream("http://" + BATCHPRINT_SERVER + ":" + PORT_NO + "/");
			batchPrintStream.setPrinterName(PRINTER_NAME);    // (1) プリンタ名
			batchPrintStream.setNumberOfCopy(1);                // (2) 印刷部数
			batchPrintStream.setSelectedTray("AUTO");           // (3) 出力トレイ
			batchPrintStream.setJobName("BatchPrintSrv1");      // (4) 印刷識別子(2バイト文字を使用する場合はUTF-8)
			batchPrintStream.setFromPage(1);                    // (5) 開始ページ番号
			batchPrintStream.setToPage(-1);                     // (6) 終了ページ番号
			batchPrintStream.setDoFit(true);                   // (7) 用紙サイズに合わせて印刷
//			batchPrintStream.setPassword("password");                // (8) 暗号化パスワード(バッチ印刷インストーラで指定したもの)
//			batchPrintStream.setPasswordWithEncoded("cGFzc3dvcmQ="); // (8') エンコード済み暗号化パスワード

			// PDF埋め込み情報をHashtableにセット
			Hashtable<String, String> ht = new Hashtable<String, String>();
			ht.put("title", "BatchSrv1" + "_" + i);
			ht.put("company", "ブレインセラーズ・ドットコム株式会社");
			ht.put("address", "東京都千代田区九段北XX-XX-XX");
			ht.put("phone", "TEL.XX-XXXX-XXXX");
			ht.put("fax", "FAX.XX-XXXX-XXXX");

			PDFEngine pdf = new PDFEngine(batchPrintStream);
			XMLSuper xml = new JaxpXML("${base-dir}/sample/java/Sample1.xml", pdf);
			// レイアウト情報(XML)の解析を行う
			xml.parse();
			// ページサイズを設定する
			xml.setPageSize();
			// PDFを生成する
			xml.toPDF(ht);
			// PDFを出力する
			xml.close();

		} catch (Exception ex) {
			throw ex;
		}

		return batchPrintStream;
	}

	/**
	 * 指定したJobIDをキーとして印刷状態を取得する
	 *
	 * @param jobId JobID
	 * @return 印刷状態
	 */
	private PDFBatchPrintStatus getBatchPrintStatus(String jobId) {
		// バッチ印刷サーバを指定
		PDFBatchStatus batchStatus = new PDFBatchStatus("http://" + BATCHPRINT_SERVER + ":" + PORT_NO + "/");
		// JobIDを指定して印刷状態を取得
		batchStatus.query(jobId);
		Collection<PDFBatchPrintStatus> batchPrintStatusCollections = batchStatus.getPrintStatus();
		if (batchPrintStatusCollections.size() < 1) {
			return null;
		}
		PDFBatchPrintStatus batchPrintStatus = batchPrintStatusCollections.iterator().next();

		return batchPrintStatus;
	}

	/**
	 * 指定した時間待つ
	 */
	private void sleep() {
		try {
			Thread.sleep(INTERVAL);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}