System.Printing пропускает несколько состояний статуса задания?
Я отправляю задания на печать на принтер и пытаюсь отслеживать их состояние, чтобы отразить его в собственной очереди.
Кажется, что задания на печать никогда не переходят в состояние "Напечатано", "Завершено".
Я сделал небольшую тестовую программу, чтобы проверить, не использовал ли я объект.net неправильно, но это все же произошло. Я запустил свою тестовую программу, чтобы запросить новое задание на печать, и как только он был получен, я тщательно опросил его и обновлял каждый раз, чтобы увидеть его состояние и убедиться, что я ничего не пропустил.
PrintServer ps = new PrintServer(@"\\printServer");
PrintQueue pq = new PrintQueue(ps, "PDF Writer - bioPDF");
PrintSystemJobInfo jobInfo = null;
while (jobInfo == null)
{
pq.Refresh();
var printJobs = pq.GetPrintJobInfoCollection();
foreach (var printJob in printJobs)
{
printJob.Refresh();
jobInfo = printJob;
break;
}
Thread.Sleep(100);
}
PrintJobStatus jobStatus = PrintJobStatus.None;
PrintJobStatus prevJobStatus = PrintJobStatus.None;
while (true)
{
try
{
jobInfo.Refresh();
} catch { }
prevJobStatus = jobStatus;
jobStatus = jobInfo.JobStatus;
if (jobStatus != prevJobStatus)
{
Console.WriteLine("**UPDATE**");
SpotTroubleUsingProperties(jobInfo); // Microsoft example method that prints a description of each possible job status
}
Thread.Sleep(20);
}
Результат, который я получаю, несмотря на то, что документ напечатан:
**UPDATE**
The job is spooling now.
**UPDATE**
The job is printing now.
**UPDATE**
The user or someone with administration rights to the queue has deleted the job. It must be resubmitted.
Как я могу узнать, когда документ находится в состоянии "Завершено"?
2 ответа
Если вы не включите опцию "Сохранять печатные документы" для принтера, вы никогда не увидите Completed
статус, поскольку задания на печать удаляются, как только они заканчиваются. Переход Printing-->Deleting,
не Printing-->Completed-->Deleting
,
Таким образом, у вас есть два возможных сигнала о том, что задание выполнено: 1) Когда оно входит в Deleting
и 2) когда он исчезает из очереди. Насколько мне известно, нет никакого способа отличить удаляемое задание на печать, потому что оно выполнено, и потому, что оно было удалено человеком или другой программой.
Я просто тестировал аналогичную ситуацию и пришел к выводу журнала, без установленного флага "Сохранять напечатанные документы":
Info: 11/24/2017 12:08:18 PM - JobStatus for document testA4.pdf is Printing, Retained.
Info: 11/24/2017 12:08:22 PM - JobStatus for document testA4.pdf changed from Printing, Retained to Retained.
Info: 11/24/2017 12:08:22 PM - JobStatus for document testA4.pdf changed from Retained to Completed, Retained.
Info: 11/24/2017 12:08:22 PM - Document testA4.pdf marked as Completed by printer.
Info: 11/24/2017 12:08:33 PM - JobStatus for document testA4.pdf changed from Completed, Retained to Deleted.
Кажется, это может зависеть от принтера / драйвера.
Код, используемый для получения этого вывода:
public void MonitorPrintJobStatus(string printerName, Document document, CancellationToken token)
{
using (var printServer = new LocalPrintServer())
{
using (var printQueue = printServer.GetPrintQueue(printerName))
{
foreach (var printJobInfo in printQueue.GetPrintJobInfoCollection())
{
if (printJobInfo.Name == document.DocumentToBePrinted.Path)
{
bool printed = false;
var previousPrintJobStatus = printJobInfo.JobStatus;
_logger.LogInfo($"{DateTime.Now} - JobStatus for document {document.DocumentToBePrinted.Path} is {previousPrintJobStatus}.");
while (!token.IsCancellationRequested && !printed)
{
printJobInfo.Refresh();
if (previousPrintJobStatus != printJobInfo.JobStatus)
{
_logger.LogInfo($"{DateTime.Now} - JobStatus for document {document.DocumentToBePrinted.Path} changed from {previousPrintJobStatus} to {printJobInfo.JobStatus}.");
previousPrintJobStatus = printJobInfo.JobStatus;
}
if (printJobInfo.IsCompleted)
{
_logger.LogInfo($"{DateTime.Now} - Document {document.DocumentToBePrinted.Path} marked as Completed by printer.");
document.Status = DocumentPrintStatus.Printed;
printed = true;
}
}
break;
}
}
}
}
}