2016-05-10 16 views
0

プリンタ(HP PageWide MFP P57750)をイーサネットケーブルでプライベートネットワークに接続しています。シンプルなC#Web Appでは、ユーザーはpdfファイルをプリンタに送信し、印刷する部数を設定します。印刷の最後に、アプリはジョブの最後に通知する必要があります。C# - 印刷の最後をキャッチできません

PrintDocumentのEndPrintイベントを使用しようとしましたが、プリンタがまだ印刷中であるため、間違った時間に起動するようです。

また、PrintJueInfoCollectionでPrintQueueを使用しようとしましたが、初めて「印刷」PrintJobStatusを返します。それから私は5秒待って、ステータスを再確認しますが、プリンタがまだ印刷している間にキューにジョブがありません!

「コントロールパネル」 - >「デバイスとプリンタ」の「ジョブの進行状況」を参照してください。印刷枚数が多く、プリンタがまだ印刷中であっても、印刷はわずか数秒間続きます。クライアントが印刷するファイルをプリンタに送信した後でジョブが削除されると思います。

印刷の実際の終わりをどうやって捉えることができますか?

PdfDocument pdf = new PdfDocument(); 
pdf.LoadFromFile(filePath); 
pdf.PrinterName = CicloStampa.Properties.Settings.Default.NomeStampante; 
pdf.PrintDocument.PrinterSettings.Copies = (short)numeroCopie;   

pdf.PrintDocument.Print(); 

PrintServer myPrintServer = new PrintServer(); 
PrintQueue pq = myPrintServer.GetPrintQueue(CicloStampa.Properties.Settings.Default.NomeStampante); 
var printing = true; 

while (printing) 
{ 
    pq.Refresh(); 
    PrintJobInfoCollection pCollection = pq.GetPrintJobInfoCollection(); 

    foreach (PrintSystemJobInfo job in pCollection) 
    { 
     //SpotTroubleUsingJobAttributes returns KO/OK by matching PrintJobStatus. First time returns PrintJobStatus.Priting. Second time, pCollection is empty and the printer is still printing. 
     var res = SpotTroubleUsingJobAttributes(job); 
     System.IO.File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory + @"\Logs\LogImportazione.txt", DateTime.Now.ToString() + " ---- \t\t\t RES: " + res + "\n"); 
     if (res.StartsWith("KO")) 
     { 
      //DO STUFF      
     } 
     else 
     { 
      //END OF PRINT 
      printing = false; 
     } 
    } 
    if (pCollection.Count() == 0) 
    {          
     printing = false; 
    } 
    if (printing) 
    {                  
     System.Threading.Thread.Sleep(5000); 
    } 
} 
+1

http://stackoverflow.com/questions/19176143/net-end-printing-event – CodeCaster

答えて

1

印刷キューでジョブのコレクションを取得して、探しているジョブのステータスを取得するまでループを繰り返します。

 var myPrintServer = new LocalPrintServer(); 
     var pq = myPrintServer.GetPrintQueue("Printer Name"); 

     var jobs = pq.GetPrintJobInfoCollection(); 

     foreach (var job in jobs) 
     { 
      var done = false; 
      while (!done) 
      { 
       pq.Refresh(); 
       job.Refresh(); 
       done = job.IsCompleted || job.IsDeleted || job.IsPrinted; 
      } 
     } 

EDIT

たPrintQueueはまた、などIsPrinting、IsWaiting、IsBusyとしての性質を持っている、あなたはwhileループにあまりにもこれらのプロパティで見ることができるが、これらはないことについて、一般的なプリンタをご紹介ですあなたの仕事は具体的に他の人があなたがそうしたときに印刷することを決定した場合、誤解を招くような情報を得る可能性があります

+0

私はあなたのコードとdoneちょうど1〜2秒で間違っていると、それは真実になりますが、プリンターはまだ印刷しています... –

+0

私はいませんプリンタが物理的に印刷を停止する正確な瞬間を捕まえることができます。すべてのプリンタには異なるドライバがあり、それぞれの通信方法が異なります。プリンタは物理的な印刷プロセスを開始し、その内部キューからジョブを空にしてから、印刷の機械的プロセスが完全に終了する前にジョブを終了に設定します。 –

+0

あなたの答えに感謝します。この場合、プリンタが終了したときに通知を受ける機会はありません。別の方法がありますか? –

関連する問題