我正在将打印作业发送到打印机,并尝试跟踪它们的状态,以便将其反映在我自己的队列中。
打印作业似乎从未经历过“已打印”、“已完成”状态。
我做了一个小的测试程序,看看我是否以错误的方式使用了.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.我如何知道文档何时处于“已完成”状态?
发布于 2013-05-14 04:56:51
除非您为打印机启用了“保留打印的文档”选项,否则您永远看不到Completed状态,因为打印作业一完成就会被删除。过渡是Printing-->Deleting,而不是Printing-->Completed-->Deleting。
因此,有两种可能的信号表明作业已经完成: 1)当作业进入Deleting状态时;2)当作业从队列中消失时。据我所知,无法区分因为打印作业完成而被删除的打印作业和因为个人或其他程序删除它而被删除的打印作业。
发布于 2017-11-24 19:21:15
我只是在测试类似的情况,并得到了以下日志输出,在不使用的情况下使用设置了'Keep printed‘标志:
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;
}
}
}
}
}https://stackoverflow.com/questions/16509583
复制相似问题