この記事は(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のプリンタのキューをオフラインにしてもオフラインになっていませんでした。キューの一時停止はキューのステータスでとれたのですが。もう少し調査が必要ですね。