首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有方法检查打印过程是否成功?

是否有方法检查打印过程是否成功?
EN

Stack Overflow用户
提问于 2012-08-02 00:12:27
回答 2查看 12.3K关注 0票数 14

我有一份申请,需要打印一张票。每一张票必须是独一无二的。该应用程序是windows窗体,完全用c#编写。对于我们的应用,我们使用的是三星ML-2525激光单色打印机。

流程基本上如下,操作员选择一个产品/票证(这是唯一的),然后按下一个按钮,它可以做两件事:

  1. 连接到数据库并按所使用的方式更新产品。
  2. 打印票证(这是使用System.Drawing和GDI+完成的)

由于某些原因,每隔一段时间,需要打印的图像都不会发送到打印机。这是个罕见的病例,但确实发生了。

我试图使用Win32_Printer ( http://msdn.microsoft.com/en-us/library/Aa394363 )连接到打印机,但无法获得当前打印机的状态(在线、脱机、低墨粉、卡纸等)。我只能检查打印机是否存在,纸张大小是否正确安装。我尝试了类似于下面的代码,但是它没有工作

代码语言:javascript
运行
复制
    private string MonitorPrintJobWmi()
    {
        var jobMessage = String.Empty;
        var scope = new ManagementScope(ManagementPath.DefaultPath);
        scope.Connect();

        var selectQuery = new SelectQuery { QueryString = @"select *  from Win32_PrintJob" };

        var objSearcher = new ManagementObjectSearcher(scope, selectQuery);
        var objCollection = objSearcher.Get();

        foreach (var job in objCollection)
        {
            if (job != null)
            {
                jobMessage += String.Format("{0} \r\n", job["Name"].ToString());
                jobMessage += String.Format("{0} \r\n", job["JobId"].ToString());
                _jobId = Convert.ToInt32(job["JobId"]);
                jobMessage += String.Format("{0} \r\n", job["JobStatus"].ToString());
                jobMessage += String.Format("{0} \r\n", job["Status"].ToString());
            }
        }
        return jobMessage;
    }

我试图为打印机获得一个API,但我没有得到它。顺便说一句,打印机的软件确实显示了窗口工具栏中的不同错误。

我的问题是,在如何连接打印机并检查打印是否成功方面,是否有人能引导我朝着正确的方向前进。

此外,如果有人知道一些其他特定的打印机,我可以完成这一点,即改变硬件。

谢谢,

EN

回答 2

Stack Overflow用户

发布于 2012-09-13 16:13:08

若要获取本地计算机上的打印队列列表,请尝试PrintServer的GetPrintQueues方法。

一旦有了与相关打印机关联的PrintQueue对象的实例,就可以使用它访问打印机的状态(IsOffline、IsPaperOut等)。此外,您还可以使用它获取给定队列(GetPrintJobInfoCollection)中的作业列表,然后允许您获取特定于作业的状态信息(IsInError、IsCompleted、IsBlocked等)。

希望这能有所帮助!

票数 5
EN

Stack Overflow用户

发布于 2017-03-09 23:15:13

尝试打印PrintDocument (System.Drawing.Printing)后,尝试检查打印作业的状态。

第一步:初始化printDocument。

第二步:从System.Drawing.Printing.PrinterSettings.InstalledPrinters.Cast<string>();获取打印机名称

并将其复制到printerDocument.PrinterSettings.PrinterName中

第三步:试着打印和处理。

代码语言:javascript
运行
复制
printerDocument.Print();
printerDocument.Dispose();

最后一步:在一个任务中运行检查(不要阻止UI线程)。

代码语言:javascript
运行
复制
 Task.Run(()=>{
     if (!IsPrinterOk(printerDocument.PrinterSettings.PrinterName,checkTimeInMillisec))
     {
        // failed printing, do something...
     }
    });

以下是实现:

代码语言:javascript
运行
复制
    private bool IsPrinterOk(string name,int checkTimeInMillisec)
    {
        System.Collections.IList value = null;
        do
        {
            //checkTimeInMillisec should be between 2000 and 5000
            System.Threading.Thread.Sleep(checkTimeInMillisec);
            // or use Timer with Threading.Monitor instead of thread sleep

            using (System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_PrintJob WHERE Name like '%" + name + "%'"))
            {
                value = null;

                if (searcher.Get().Count == 0) // Number of pending document.
                    return true; // return because we haven't got any pending document.
                else
                {
                    foreach (System.Management.ManagementObject printer in searcher.Get())
                    {
                        value = printer.Properties.Cast<System.Management.PropertyData>().Where(p => p.Name.Equals("Status")).Select(p => p.Value).ToList();
                        break; 
                    }
                }
            }
       }
       while (value.Contains("Printing") || value.Contains("UNKNOWN") || value.Contains("OK"));

       return value.Contains("Error") ? false : true;    
    }

祝好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11769351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档