【发布时间】:2016-07-10 07:27:56
【问题描述】:
我正在编写一些代码来监控打印机队列,然后使用事件信息来收集有关作业的一些细节,包括 # 页、方向、是否为彩色以及请求了多少份副本。
我使用 Merrion Computing(现已开源)的代码捕获事件;它处理互操作。
对于Color来说,应该是存放在JOB_INFO_2.pDeviceMode.dmColor中;但是,无论我如何提交作业(使用从多个应用程序(包括 word 和 adobe)打印的打印机属性进行彩色或黑白),它总是指示颜色。我直接通过该代码进行了调试,并且互操作似乎是正确的,因此我使用事件中的 JobId 通过 .NET 使用代码(如下)查询打印系统;它包含完全相同的副本和颜色设置。
int iJobId = e.PrintJob.JobId;
LocalPrintServer printServer = new LocalPrintServer();
PrintQueueCollection queueCollection = printServer.GetPrintQueues();
foreach (PrintQueue queue in queueCollection)
{
queue.Refresh();
if(queue.FullName.Equals(e.PrintJob.PrinterName,StringComparison.OrdinalIgnoreCase))
{
int? iPageCount;
PrintJobInfoCollection jobs = queue.GetPrintJobInfoCollection();
foreach(PrintSystemJobInfo job in jobs)
{
job.Refresh();
if(job.JobIdentifier==iJobId)
{
iPageCount = job.NumberOfPages;
}
}
//-- Found the Printer...
int? iCopyCount=queue.CurrentJobSettings.CurrentPrintTicket.CopyCount;
PageOrientation? eOrientation = queue.CurrentJobSettings.CurrentPrintTicket.PageOrientation;
OutputColor? eColor = queue.CurrentJobSettings.CurrentPrintTicket.OutputColor;
Debug.WriteLine("queue=" + queue.FullName + ", Copies=" + iCopyCount.Value + ",Color=" + eColor.ToString() + ", pagecount=" + "unk" /*iPageCount.Value*/ + ", Orientation=", eOrientation.ToString());
Debug.WriteLine("---");
}
}
有没有人见过一种可靠的方法来检索特定打印机作业的份数和页数(最好使用 .NET)? 我
我确实发现这篇文章描述了相同类型的问题,但那里没有解决方案。
Determine current print job color using C#
还应注意,上述文章中的 WMI 代码也返回颜色。
我启用了打印事件日志 (http://www.papercut.com/kb/Main/LogPrintJobsInEventViewer)。查看打印事件的详细信息;颜色设置如预期的“2”,表示灰度。
很明显,windows 子系统正在接收请求的设置;但是,我使用 WMI、System.Printing 的命名空间或 Merrion 的打印监控库中的互操作检索该值没有成功,其中所有值都表明作业是彩色的,具有正确的页数和副本数。
【问题讨论】:
-
打印作业完成时也找不到份数和/或实际打印页数。
-
发现另一个帖子,基本上说这是不可能的;这个怎么可能? stackoverflow.com/questions/7256737/…