2013-05-12 2 views
1

Я отправляю задания печати на принтер, и я стараюсь отслеживать их статус, чтобы отразить его в собственной очереди.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. 

Как я могу знать, когда документ находится в «завершенного» статус?

ответ

1

Если вы не включили опцию «Сохранить печатные документы» для принтера, вы никогда не увидите статус Completed, так как задания на печать удаляются, как только они заканчиваются. Переход Printing-->Deleting, не Printing-->Completed-->Deleting.

Таким образом, у вас есть два возможных сигнала, что задание завершено: 1) когда оно входит в состояние Deleting и 2) когда оно исчезает из очереди. Насколько мне известно, нет способа отличить удаляемое задание на печать, поскольку оно завершено, и потому что человек или другая программа его удалили.

+0

Я не знал этого варианта. Я подумал, что объект '' 'PrintQueue'' поддерживает эти данные для меня каким-то образом, но теперь я понимаю это лучше - поскольку он снова пробует фактическую катушку, когда я вызываю' '' Refresh() '' '. После изменения этой опции вы упоминаете (слишком плохо, что это невозможно сделать программно), по какой-то причине, когда задания выполняются, они находятся только в статусе '' Printed'''. '' 'KeepPrintedJobs'' истинно для объекта' '' PrintQueue'', но '' 'IsRetained''' является ложным для объекта' '' PrintSystemJobInfo'''. Кроме того, задания находятся в '' 'Printed''' состоянии, а не' '' Completed'''. Почему это? – shwartz

+1

@shwartz Я не знаю почему. Вся подсистема печати Windows - странный, чрезмерно сложный мир, который развился из DOS и Windows 3.x, и он по-прежнему несет в себе много багажа с этой эпохи. Но если вам нужна опция keep-print-documents, она может быть установлена ​​программно. Взгляните на SetPrinter(), структуру PRINTER_INFO_2 и параметр PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS. –

+0

Знаете ли вы, как это сделать в управляемом коде C#? – shwartz

1

Я просто тестирует подобную ситуацию и пришли к следующему выходу лесозаготовительной, без установлен флаг «сохранить печатные документы»:

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

Интересно. Может быть, переход от завершенного к удалению настолько быстр, что только петля опроса, как вы, никогда бы не увидела этого. Спасибо за информацию. –

+0

Хорошо, если вы посмотрите на журналы, вы увидите, что для «удаления» требуется около 11 секунд, –

Смежные вопросы