イーサネット ケーブルでプライベート ネットワークに接続されたプリンター (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);
}
}