检查打印命令是否成功

时间:2015-06-17 09:12:19

标签: c# .net winforms printing

我正在通过c#代码打印一些PDF文件。我的代码看起来像这样

myPrinters.SetDefaultPrinter(pdfPrinterName);
var info = new ProcessStartInfo
{
  Verb = "Print",
  FileName = file,
  CreateNoWindow = true,
  WindowStyle = ProcessWindowStyle.Hidden
};

var p = new Process { StartInfo = info };
p.Start();                 
p.WaitForInputIdle();
System.Threading.Thread.Sleep(18000);
if (!p.CloseMainWindow())
  p.Kill();

打印效果很好,但是在这里我无法知道打印是成功还是失败。就像用户选择了错误的打印机一样,这些打印机无法正常工作。如何有效地管理这些场景并知道我的打印命令是否成功?

1 个答案:

答案 0 :(得分:3)

此代码实际上并未打印任何内容,它使用命令行管理程序向用户安装的任何程序发送打印命令以处理pdf。这可能是也可能不是Adobe Acrobat。一旦发送动词,该过程将立即结束。它甚至不会等到文件被添加到打印队列中。

通过使用System.Printing命名空间中的类来实现打印机管理。 PrintServer类表示实际的打印机,PrintQueue表示该打印机上的打印队列。调用PrintQueue.GetPrintJobInfoCollection将返回打印机上的所有作业。

找到相关的PrintSystemJobInfo对象后(通过检查Name或JobName属性),您可以使用IsCompleted,IsBlocked等属性检查作业的状态。要检测更改,您应定期在作业上调用Refresh

您可以尝试使用以下方法找到作业,通过复制各种文档示例创建:

public bool TryFindJob(string searchString,out PrintSystemJobInfo actualJob)
{
    var myPrintServer = new PrintServer(@"\\theServer");

    actualJob=null;
    var myPrintQueues = myPrintServer.GetPrintQueues();
    foreach (PrintQueue pq in myPrintQueues)
    {
       pq.Refresh();
       var jobs = pq.GetPrintJobInfoCollection();
       foreach (PrintSystemJobInfo job in jobs)
       {
            if (job.JobName.Contains(searchString) || job.Name.Contains(searchString))
            {
                actualJob=job;
                return true;
            }
        }
    }
    return false;
}

假设作业的名称将包含文件的名称,您可以找到该作业:

var name=Path.GetFileNameWithoutExtension(file);
PrintSystemJobInfo job;
if(TryFindJob(name,out job))
{
   while(...)
   {
        job.Refresh();
        if (job.IsCompleted)
        {
            break;
        }
        else
        {
            //Sleep and retry
        }

}