|
分類:[VB.NET/VB2005 以降]
VB.NetでPDFを印刷しています。 URLを参考にコーディングしました。
https://jehupc.exblog.jp/8603528/
印刷自体は成功するのですが、ジョブと同期が取れていない気がします。 サンプルソースを添付します。
'-------------------------------------------------------------------------------------------------- Imports System.Printing
Private Sub Test() Dim p As New System.Diagnostics.Process() 'プロセス Dim prtSv As New LocalPrintServer() 'プリントサーバ情報 Dim que As PrintQueue = prtSv.DefaultPrintQueue '印刷キュー取得 Dim intJobNum As Integer = 0 'ジョブ番号 Dim intWatiMiliTime As Integer = 1000 '待機時間(ミリ秒) Dim intCnt As Integer = 0 'カウンタ
Try p.StartInfo.FileName = "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"
p.StartInfo.Verb = "open" p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
'プロセスを新しいWindowで起動 p.StartInfo.CreateNoWindow = True
'Acrobatのコマンドライン引数設定 p.StartInfo.Arguments = " /s /l /p /h " + "C:\Test\test.pdf"
'プロセス起動 p.Start()
'1回目のループ処理 While True '指定ミリ秒待機 Threading.Thread.Sleep(intWatiMiliTime) intCnt += intWatiMiliTime
'1分以上経過した場合は処理を抜ける If intCnt > (intWatiMiliTime * 60) Then Return BCK_PRCS_RSLT.PDF_NG End If
'キューが1つ以上 If que.NumberOfJobs > 0 Then Dim jobList As New List(Of PrintSystemJobInfo)() '印刷ジョブコレクション取得 For Each ps As PrintSystemJobInfo In que.GetPrintJobInfoCollection jobList.Add(ps) Next
'ジョブにpdfファイルがある場合 If jobList(jobList.Count - 1).Name.EndsWith(".pdf", True, Nothing) Then intJobNum = jobList(jobList.Count - 1).JobIdentifier Exit While End If End If End While
intCnt = 0
'2回目のループ処理 While True
'指定ミリ秒待つ Threading.Thread.Sleep(intWatiMiliTime) intCnt += intWatiMiliTime
Dim jobNow As PrintSystemJobInfo = que.GetJob(intJobNum)
If jobNow.JobStatus = PrintJobStatus.Completed OrElse jobNow.JobStatus = PrintJobStatus.Deleted OrElse jobNow.JobStatus = PrintJobStatus.Deleting OrElse jobNow.JobStatus = PrintJobStatus.Printed OrElse jobNow.JobStatus = PrintJobStatus.Printing OrElse jobNow.JobStatus = PrintJobStatus.Retained _ Then 'ループ終了(何故かこの処理に来ない) Exit While End If
'1分以上経過した場合は処理を抜ける If jobNow.JobStatus = PrintJobStatus.None OrElse jobNow.JobStatus = PrintJobStatus.Error OrElse jobNow.JobStatus = PrintJobStatus.Paused OrElse jobNow.JobStatus = PrintJobStatus.Offline OrElse jobNow.JobStatus = PrintJobStatus.PaperOut OrElse jobNow.JobStatus = PrintJobStatus.UserIntervention OrElse intCnt > (intWatiMiliTime * 60) _ Then MsgBox("印刷に失敗しました") End If
End While
Catch ex As Exception MsgBox("印刷に失敗しました") End Try End Sub '--------------------------------------------------------------------------------------------------
コメント「1回目のループ処理」内で、印刷された場合は印刷ジョブコレクションを取得できますが、 コメント「2回目のループ処理」内で、印刷が成功しているにも関わらず jobNow.JobStatus = PrintJobStatus.Completed になりません。 (Sleep処理で時間を長くしたり短くしたり、又は外したりしましたが変わらず。。)
上手くジョブと同期をとる方法はありますか?
|