Как получить статус задания на печать с помощью C#

Я могу напечатать документ, но не знаю, как получить его статус. Я просмотрел много ресурсов ( MSDN, Ссылки для проверки статуса работы), но не смог найти ответ.

Я действительно хочу получить подтверждение от принтера, был ли документ успешно распечатан или нет. Кроме того, мне также интересно, смогу ли я получить сигнал об ошибке от принтера, например, застряла ли бумага.

У меня есть Имя принтера и Имя документа, которые я отправляю на печать. Кто-нибудь провел какие-либо исследования в этой области и может сказать мне, как это сделать?

4 ответа

Вы могли бы использовать WMI для этого. Он предоставляет несколько связанных с печатью классов, включая Win32_PrintJob.

Это не проверено, но что-то вроде этого должно помочь вам начать:

SelectQuery query = new SelectQuery("Win32_PrintJob");

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
using (ManagementObjectCollection printJobs = searcher.Get())
    foreach (ManagementObject printJob in printJobs)
    {
        // The format of the Win32_PrintJob.Name property is "PrinterName,JobNumber"
        string name = (string) printJob["Name"];
        string[] nameParts = name.Split(',');
        string printerName = nameParts[0];
        string jobNumber = nameParts[1];
        string document = (string) printJob["Document"];
        string jobStatus = (string) printJob["JobStatus"];

        // Process job properties...
    }

В Интернете есть примеры... google "отправка команд PJL в C#" (PJL означает язык работы принтера)

Codeproject Чтение данных непосредственно с принтера - хорошая статья / пример

Вы можете попробовать этот код также

// Проверка возможных состояний неисправности задания на печать с использованием флагов свойства JobStatus

internal static void SpotTroubleUsingJobAttributes(PrintSystemJobInfo theJob)
{

if ((theJob.JobStatus & PrintJobStatus.Blocked) == PrintJobStatus.Blocked)
{
    Console.WriteLine("The job is blocked.");
}
if (((theJob.JobStatus & PrintJobStatus.Completed) == PrintJobStatus.Completed)
    || 
    ((theJob.JobStatus & PrintJobStatus.Printed) == PrintJobStatus.Printed))
{
    Console.WriteLine("The job has finished. Have user recheck all output bins and be sure the correct printer is being checked.");
}
if (((theJob.JobStatus & PrintJobStatus.Deleted) == PrintJobStatus.Deleted)
    || 
    ((theJob.JobStatus & PrintJobStatus.Deleting) == PrintJobStatus.Deleting))
{
    Console.WriteLine("The user or someone with administration rights to the queue has deleted the job. It must be resubmitted.");
}
if ((theJob.JobStatus & PrintJobStatus.Error) == PrintJobStatus.Error)
{
    Console.WriteLine("The job has errored.");
}
if ((theJob.JobStatus & PrintJobStatus.Offline) == PrintJobStatus.Offline)
{
    Console.WriteLine("The printer is offline. Have user put it online with printer front panel.");
}
if ((theJob.JobStatus & PrintJobStatus.PaperOut) == PrintJobStatus.PaperOut)
{
    Console.WriteLine("The printer is out of paper of the size required by the job. Have user add paper.");
}

if (((theJob.JobStatus & PrintJobStatus.Paused) == PrintJobStatus.Paused)
    || 
    ((theJob.HostingPrintQueue.QueueStatus & PrintQueueStatus.Paused) == PrintQueueStatus.Paused))
{
    HandlePausedJob(theJob);
    //HandlePausedJob is defined in the complete example.
}

if ((theJob.JobStatus & PrintJobStatus.Printing) == PrintJobStatus.Printing)
{
    Console.WriteLine("The job is printing now.");
}
if ((theJob.JobStatus & PrintJobStatus.Spooling) == PrintJobStatus.Spooling)
{
    Console.WriteLine("The job is spooling now.");
}
if ((theJob.JobStatus & PrintJobStatus.UserIntervention) == PrintJobStatus.UserIntervention)
{
    Console.WriteLine("The printer needs human intervention.");
}}
     //end SpotTroubleUsingJobAttributes

Конечно, вышеупомянутый ответ правильный, но если вы используете Windows API на C# для проверки состояния задания на печать, вам придется сделать немного больше, в частности, чтобы избавиться от вложенных предложений if-then-else. Вот пример кода:

      namespace Sample
{
    class UsingNativeAPIs
    {
        private const int JOB_STATUS_RETAINED = 8192;          
        private const int JOB_STATUS_COMPLETE = 4096;          
        private const int JOB_STATUS_RESTART = 2048;           
        private const int JOB_STATUS_USER_INTERVENTION = 1024;
        private const int JOB_STATUS_BLOCKED_DEVQ = 512;       
        private const int JOB_STATUS_DELETED = 256;            
        private const int JOB_STATUS_PRINTED = 128;            
        private const int JOB_STATUS_PAPEROUT = 64;                            
        private const int JOB_STATUS_OFFLINE = 32;             
        private const int JOB_STATUS_PRINTING = 16;     
        private const int JOB_STATUS_SPOOLING = 8;      
        private const int JOB_STATUS_DELETING = 4;                       
        private const int JOB_STATUS_ERROR = 2;                
        private const int JOB_STATUS_PAUSED = 1;
                                                                       
        private Dictionary<int, string> jDict = new Dictionary<int, string>()
            {
                {JOB_STATUS_RETAINED, "Retained"},
                {JOB_STATUS_COMPLETE, "Complete"},
                {JOB_STATUS_RESTART, "restarted"},
                {JOB_STATUS_USER_INTERVENTION, "UserIntervention"},
                {JOB_STATUS_BLOCKED_DEVQ, "Blocked"},
                {JOB_STATUS_DELETED, "Deleted"},
                {JOB_STATUS_PRINTED, "Printed"},
                {JOB_STATUS_PAPEROUT, "PaperOut"},
                {JOB_STATUS_OFFLINE, "Offline"},
                {JOB_STATUS_PRINTING, "Printing"},
                {JOB_STATUS_SPOOLING, "Spooling"},
                {JOB_STATUS_DELETING, "Deleting"},
                {JOB_STATUS_ERROR, "Error"},
                {JOB_STATUS_PAUSED, "Paused"},                      
            };

        private StringBuilder Get_Status(JOB_INFO_2W[] jobInfos, /*... your parameters, if any*/)
        {
            string jobStatus;
            StringBuilder sb;
            foreach (var job in jobInfos)
            {
                jobStatus = "";
                foreach (var item in jdict)
                {
                    if ((job.Status & item.Key) == item.Key)
                    {
                        jobStatus = item.Value;
                        break; // or just ignore this line if you look for all combined statuses
                    }
                }
                sb.Append("Status = " + jobStatus);
            }

            return sb;
        }
    }
}
Другие вопросы по тегам