「ほっ」と。キャンペーン
(VB.Net)[補足2].NetからのPDFファイル印刷方法
この記事は(VB.Net)[補足].NetからのPDFファイル印刷方法の追記情報です。

ジョブやキューはループの中でまわしてもそのままではステータスは最新のものにならないようです。
PrintQueue.Refresh() や PrintSystemJobInfo.Refresh() というメソッドを実行することで、最新情報が取得できるようです。
なので、上記のコードの中に Refresh() メソッドが必要になりますね。
また、PrintSystemJobInfo.JobStatus プロパティや PrintQueue.QueueStatus プロパティは複数のステータスを保持するみたいなので、JobStatus、QueueStatusプロパティに取り出したいプロパティの論理積をとってやる必要があることがMSDNのここに書かれていました。

ということで、ステータスを見るとこは下記のようなコードになると思います。

'ジョブが印刷中,印刷完了されていればスプールが終わっているはずなので処理正常終了
If (jobNow.JobStatus And PrintJobStatus.Completed) = PrintJobStatus.Completed _
OrElse (jobNow.JobStatus And PrintJobStatus.Deleted) = PrintJobStatus.Deleted _
OrElse (jobNow.JobStatus And PrintJobStatus.Deleting) = PrintJobStatus.Deleting _
OrElse (jobNow.JobStatus And PrintJobStatus.Printed) = PrintJobStatus.Printed _
OrElse (jobNow.JobStatus And PrintJobStatus.Printing) = PrintJobStatus.Printing _
OrElse (jobNow.JobStatus And PrintJobStatus.Retained) = PrintJobStatus.Retained Then
'ループ終了
Exit While
End If
'ジョブがなんらかのエラーがあったとき。
If (jobNow.JobStatus And PrintJobStatus.Error) = PrintJobStatus.Error Then
Throw New PamTrWarningException("印刷に失敗しました。印刷ジョブはエラー状態にあります。")
End If
If (jobNow.JobStatus And PrintJobStatus.Offline) = PrintJobStatus.Offline Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタはオフラインです。")
End If
If (jobNow.JobStatus And PrintJobStatus.PaperOut) = PrintJobStatus.PaperOut Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタが必要な用紙サイズに適合していません。")
End If
If (jobNow.JobStatus And PrintJobStatus.UserIntervention) = PrintJobStatus.UserIntervention Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタは、エラー状態を修正するためにユーザーの操作を必要としています。")
End If
If (jobNow.JobStatus And PrintJobStatus.Paused) = PrintJobStatus.Paused Then
Throw New PamTrWarningException("印刷に失敗しました。印刷ジョブは一時停止されます。")
End If
If (jobNow.JobStatus And PrintJobStatus.Blocked) = PrintJobStatus.Blocked Then
Throw New PamTrWarningException("印刷に失敗しました。キュー内にあるこのジョブよりも優先される印刷ジョブが原因と考えられるエラーが発生したため、印刷ジョブがブロックされました。")
End If
 
 
 
'キューになんらかのエラーがあったとき
If (que.QueueStatus And PrintQueueStatus.ServerUnknown) = PrintQueueStatus.ServerUnknown Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタはエラー状態にあります。")
End If
If (que.QueueStatus And PrintQueueStatus.OutOfMemory) = PrintQueueStatus.OutOfMemory Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタに使用可能なメモリがありません。")
End If
If (que.QueueStatus And PrintQueueStatus.UserIntervention) = PrintQueueStatus.UserIntervention Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタは、エラー状態を修正するためにユーザーの操作を必要としています。")
End If
If (que.QueueStatus And PrintQueueStatus.PagePunt) = PrintQueueStatus.PagePunt Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタで現在のページを印刷できません。")
End If
If (que.QueueStatus And PrintQueueStatus.NoToner) = PrintQueueStatus.NoToner Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタのトナーがありません。")
End If
If (que.QueueStatus And PrintQueueStatus.Offline) = PrintQueueStatus.Offline Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタはオフラインです。")
End If
If (que.QueueStatus And PrintQueueStatus.PaperProblem) = PrintQueueStatus.PaperProblem Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタの用紙が原因で、未定義のエラーが発生しています。")
End If
If (que.QueueStatus And PrintQueueStatus.PaperOut) = PrintQueueStatus.PaperOut Then
Throw New PamTrWarningException("印刷に失敗しました。現在の印刷ジョブに必要な種類の用紙がプリンタにセットされていないか、または用紙切れです。")
End If
If (que.QueueStatus And PrintQueueStatus.PaperJam) = PrintQueueStatus.PaperJam Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタの用紙が詰まっています。")
End If
If (que.QueueStatus And PrintQueueStatus.Error) = PrintQueueStatus.Error Then
Throw New PamTrWarningException("印刷に失敗しました。プリンタがエラー状態のため印刷できません。")
End If
If (que.QueueStatus And PrintQueueStatus.Paused) = PrintQueueStatus.Paused Then
Throw New PamTrWarningException("印刷に失敗しました。印刷キューが一時停止されています。")
End If


ところで、このステータスですが、どこまで正確な情報が取れるかが不明です。
あまりステータステストをしていないのですが、Windowsのプリンタのキューをオフラインにしてもオフラインになっていませんでした。キューの一時停止はキューのステータスでとれたのですが。もう少し調査が必要ですね。
[PR]
by jehoshaphat | 2008-09-22 14:15 | .Net開発 | Trackback | Comments(0)
トラックバックURL : http://jehupc.exblog.jp/tb/8650821
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。


<< (WindowsServer)... (SQL)時間、分を別列に分け... >>