我正在通过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();
打印效果很好,但是在这里我无法知道打印是成功还是失败。就像用户选择了错误的打印机一样,这些打印机无法正常工作。如何有效地管理这些场景并知道我的打印命令是否成功?
答案 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
}
}