【问题标题】:How to determine specific printer properties for a printer job?如何确定打印机作业的特定打印机属性?
【发布时间】: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 的打印监控库中的互操作检索该值没有成功,其中所有值都表明作业是彩色的,具有正确的页数和副本数。

【问题讨论】:

标签: c# printing


【解决方案1】:

是否可以获取为此打印生成的假脱机文件以检查它是否设置了 dmColor 设置本身?

您从事件日志中获得的设置 2 对应于 DMCOLOR_COLOR 而不是 DMCOLOR_MONOCHROME,因此日志中的颜色设置似乎也认为它是颜色。

可能是打印机驱动程序在创建作业时有点偷偷摸摸地将作业提交为彩色,然后在后台发送“设置设备设置”消息将其更改为单色?如果是这样,假脱机文件中应该有一条 SPT_DEVMODE 记录。

查看这篇文章以获得假脱机文件阅读器:http://www.codeproject.com/Articles/10586/EMF-Printer-Spool-File-Viewer

【讨论】:

    【解决方案2】:

    您需要刷新您的 jog,直到标志 IsSpooling 变为 false。

    for (int i = 0; i < jobs.Count(); i++)
    {
        try
        {
            int timeOut = 20000;
            var jobInfo = jobs.ElementAt(i);                               
            while (jobInfo.IsSpooling && timeOut > 0)
            {
                Thread.Sleep(100);
                timeOut-=100;
                jobInfo.Refresh(); 
            }                                                                                                                                       var pages = Math.Max(jobInfo.NumberOfPages,jobInfo.NumberOfPagesPrinted);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多