3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

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