C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

PDF印刷とジョブの同期について

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■91648 / inTopicNo.1)  PDF印刷とジョブの同期について
  
□投稿者/ ペコ犬 (17回)-(2019/07/17(Wed) 16:52:24)

分類:[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処理で時間を長くしたり短くしたり、又は外したりしましたが変わらず。。)

上手くジョブと同期をとる方法はありますか?



引用返信 編集キー/
■91656 / inTopicNo.2)  Re[1]: PDF印刷とジョブの同期について
□投稿者/ Hongliang (844回)-(2019/07/18(Thu) 07:00:00)
試していませんが、que.GetJob()する直前にque.Refresh()してみるとどうでしょうか?
引用返信 編集キー/
■91658 / inTopicNo.3)  Re[2]: PDF印刷とジョブの同期について
□投稿者/ ペコ犬 (18回)-(2019/07/18(Thu) 09:38:20)
No91656 (Hongliang さん) に返信

> 試していませんが、que.GetJob()する直前にque.Refresh()してみるとどうでしょうか?

ご回答ありがとうございます。
Refreshして何度か試してみましたが、
結果は変わりませんでした。

Exceptionが発生したり、PrintJobStatus.Spoolingだったり、
以下のURLに掲載していない値(16382)が返ってきました。

https://docs.microsoft.com/ja-jp/dotnet/api/system.printing.printjobstatus?view=netframework-4.8

「2回目のループ処理」には、プロセスが既にHasExited = Trueになっている事が多い為、
同期を取るのが難しいかと思いました。


引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ