0

イーサネット ケーブルでプライベート ネットワークに接続されたプリンター (HP PageWide MFP P57750) があります。シンプルな C# Web アプリで、ユーザーは PDF ファイルをプリンターに送信し、印刷部数を設定します。印刷の最後に、アプリはジョブの終了を通知する必要があります。

PrintDocument の EndPrint イベントを使用しようとしましたが、間違ったタイミングで発生したようです。プリンターがまだ印刷中であるためです。

私も PrintJobInfoCollection で 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);
     }
}
4

2 に答える 2

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;
            }
        }

編集

PrintQueue には、IsPrinting、IsWaiting、IsBusy などのプロパティもあります。これらのプロパティも while ループで調べることができますが、これらのプロパティは、特にジョブについてではなく、一般的なプリンターについて教えてくれます。誤解を招く情報を得ることができますか

于 2016-05-10T07:39:45.470 に答える