Я отправляю задания печати на принтер, и я стараюсь отслеживать их статус, чтобы отразить его в собственной очереди.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.
Как я могу знать, когда документ находится в «завершенного» статус?
Я не знал этого варианта. Я подумал, что объект '' 'PrintQueue'' поддерживает эти данные для меня каким-то образом, но теперь я понимаю это лучше - поскольку он снова пробует фактическую катушку, когда я вызываю' '' Refresh() '' '. После изменения этой опции вы упоминаете (слишком плохо, что это невозможно сделать программно), по какой-то причине, когда задания выполняются, они находятся только в статусе '' Printed'''. '' 'KeepPrintedJobs'' истинно для объекта' '' PrintQueue'', но '' 'IsRetained''' является ложным для объекта' '' PrintSystemJobInfo'''. Кроме того, задания находятся в '' 'Printed''' состоянии, а не' '' Completed'''. Почему это? – shwartz
@shwartz Я не знаю почему. Вся подсистема печати Windows - странный, чрезмерно сложный мир, который развился из DOS и Windows 3.x, и он по-прежнему несет в себе много багажа с этой эпохи. Но если вам нужна опция keep-print-documents, она может быть установлена программно. Взгляните на SetPrinter(), структуру PRINTER_INFO_2 и параметр PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS. –
Знаете ли вы, как это сделать в управляемом коде C#? – shwartz