首页 .Net .NET(C#) 查找打印机指定打印机名称打印代码(PrintDocument)

.NET(C#) 查找打印机指定打印机名称打印代码(PrintDocument)

1、指定打印机名进行简单打印的代码

 public void Print(string PrinterName)
    {
      PrintDocument doc = new PrintDocument();
      doc.PrinterSettings.PrinterName = PrinterName;
      doc.PrintPage += new PrintPageEventHandler(PrintHandler);
      doc.Print();
    }
    private void PrintHandler(object sender, PrintPageEventArgs ppeArgs)
    {
      Font FontNormal = new Font("Verdana", 12);
      Graphics g = ppeArgs.Graphics;
      g.DrawString("Your string to print", FontNormal, Brushes.Black, xpos, ypos, new StringFormat());
    }

2、获取已安装的打印机驱动名

public IEnumerable<string> GetPrintDrivers()
        {
            var dirvers = new List<string>();
            //Query printer's portName from WIN32_Printer
            string query = string.Format("SELECT * from Win32_PrinterDriver");
            var searcher = new ManagementObjectSearcher(query);
            ManagementObjectCollection managementObjects = searcher.Get();
            foreach (ManagementObject managementObject in managementObjects)
            {
                var name = managementObject.Properties["Name"].Value;
                dirvers.Add(name.ToString());
            }
            return dirvers;
        }

3、连接打印机并发送指令代码

public >PrinterCommunicate
    {
        public bool CheckNetWorkConnection(string strPrinterIP, int intPrinterPort) 
        {
           System.Net.Sockets.TcpClient Zebraclient = new TcpClient();
           try
           {
               Zebraclient.Connect(strPrinterIP, intPrinterPort);
               return Zebraclient.Connected;
           }
           catch
           {
               return false;
           }
        }
        public bool SendZPL_ViaNetwork(string strPrinterIP, int intPrinterPort, string strPrinterCommand, out string strOutMsg)
        {
            strOutMsg = "";
            System.Net.Sockets.TcpClient Zebraclient = new TcpClient();
            try
            {
                Zebraclient.SendTimeout = 1500;
                Zebraclient.ReceiveTimeout = 1500;
                //defining ip address and port number
                Zebraclient.Connect(strPrinterIP, intPrinterPort);
                if (Zebraclient.Connected == true)
                {
                    //send and receive illustrated below
                    NetworkStream mynetworkstream;
                    StreamReader mystreamreader;
                    StreamWriter mystreamwriter;
                    mynetworkstream = Zebraclient.GetStream();
                    mystreamreader = new StreamReader(mynetworkstream);
                    mystreamwriter = new StreamWriter(mynetworkstream);
                    mystreamwriter.WriteLine(strPrinterCommand);
                    mystreamwriter.Flush();
                    char[] mk = null;
                    mk = new char[256];
                    mystreamreader.Read(mk, 0, mk.Length);
                    string data1 = new string(mk);
                    strOutMsg = data1;
                    Zebraclient.Close();
                    return true;
                }
                else
                {
                    strOutMsg = "Connection failed";
                    return false;
                }
            }
            catch (Exception ex)
            {
                Log.WriteLogToFile("IPP_PCL", "PrinterCommunicate.cs -- SendZPL_ViaNetwork", "-99", ex.Message);
                strOutMsg = "EXCEPTION_ERROR";
            }
            return false;
        }
    }

4、管理打印机的状态以及查询修改打印机属性

>PrinterPropertyManager
    {
        /// <summary>
        /// 获取打印机的IP地址和端口号
        /// </summary>
        /// <param name="printerName">打印机名称</param>
        public KeyValuePair<string, int> GetPrinterIPAndPort(string printerName)
        {
            string port = GetPrinterPropertyValue(printerName, "PortName");
            //Query portName's property from regedit
            string[] portQuerys = GetPortQuerys(port);
            foreach (var portQuery in portQuerys)
            {
                RegistryKey portKey = Registry.LocalMachine.OpenSubKey(portQuery, RegistryKeyPermissionCheck.Default, 
                                          System.Security.AccessControl.RegistryRights.QueryValues);
                if (portKey != null)
                {
                        /*             
                         * 取IP的时候要特别注意,如果端口类型为"Advanced Port Monitor",那么IP地址会保存到IPAddress属性中                         
                         * 如果端口类型为"Standard Tcp/Ip Port",那么IP地址会保存到HostName属性中。
                         */
                    object IPValue = portKey.GetValue("IPAddress", String.Empty, 
                                         RegistryValueOptions.DoNotExpandEnvironmentNames);
                    object portValue = portKey.GetValue("PortNumber", String.Empty,
                                           RegistryValueOptions.DoNotExpandEnvironmentNames);
                    if (IPValue != null && portValue != null)
                    {
                        return new KeyValuePair<string, int>(IPValue.ToString(), (Int32)portValue);
                    }
                }
            }
            return new KeyValuePair<string, int>();
        }
        /// <summary>
        /// determine whether the printer is network printer.
        /// </summary>
        public bool IsNetWorkPrinter(string printer)
        {
            string port = GetPrinterPropertyValue(printer, "PortName");
            //Query portName's property from regedit
            string[] portQuerys = GetNetWorkPortQuerys(port);
            foreach (var portQuery in portQuerys)
            {
                RegistryKey portKey = Registry.LocalMachine.OpenSubKey(portQuery, RegistryKeyPermissionCheck.Default, 
                                          System.Security.AccessControl.RegistryRights.QueryValues);
                if (portKey != null)
                {
                    return true;
                }
            }
            return false;
        }
        private string[] GetNetWorkPortQuerys(string portName)
        {
            return new string[] 
            {
                @"System\CurrentControlSet\Control\Print\Monitors\Advanced Port Monitor\Ports\" + portName,
                @"System\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" + portName
            };
        }
        private string[] GetPortQuerys(string portName)
        {
            return new string[] 
            {
                @"System\CurrentControlSet\Control\Print\Monitors\Advanced Port Monitor\Ports\" + portName,
                @"System\CurrentControlSet\Control\Print\Monitors\Local Port\Ports\" + portName,
                @"System\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" + portName,
                @"System\CurrentControlSet\Control\Print\Monitors\USB Monitor\Ports\" + portName,
                @"System\CurrentControlSet\Control\Print\Monitors\WSD Port\Ports\" + portName,
            };
        }
        /// <summary>
        /// get printer property value
            /// 使用WMI查询打印机的信息,需要打开windows management instrumentation服务
        /// </summary>
        public string GetPrinterPropertyValue(string printerName, string propertyName)
        {
            string propertyValue = string.Empty;
            //Query printer's portName from WIN32_Printer
            string query = string.Format("SELECT * from Win32_Printer WHERE Name = '{0}'", printerName);
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
            ManagementObjectCollection managementObjects = searcher.Get();
            foreach (ManagementObject managementObject in managementObjects)
            {
                PropertyData propertyData = managementObject.Properties[propertyName];
                if (propertyData != null)
                {
                    propertyValue = propertyData.Value.ToString();
                }
            }
            return propertyValue;
        }
        /// <summary>
        /// change printer property value
        /// </summary>
        public void SetPrinterPropertyValue(string printerName, string propertyName, string propertyValue)
        {
            //Query printer's portName from WIN32_Printer
            string query = string.Format("SELECT * from Win32_Printer WHERE Name = '{0}'", printerName);
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
            ManagementObjectCollection managementObjects = searcher.Get();
            foreach (ManagementObject managementObject in managementObjects)
            {
                PropertyData propertyData = managementObject.Properties[propertyName];
                if (propertyData != null)
                {
                    propertyData.Value = propertyValue;
                    managementObject.Put();
                }
            }
        }
        /// <summary>
        /// whether the port is existed
        /// 检查某个打印端口是否存在
        /// </summary>
        /// <param name="printerName"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        public bool IsPortExisted(string printerName,string port)
        {
            string propertyName = "PortName";
            string currentPort = null;
            try
            {
                currentPort = GetPrinterPropertyValue(printerName, propertyName);
                SetPrinterPropertyValue(printerName, propertyName, port);
                SetPrinterPropertyValue(printerName, propertyName, currentPort);
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }
        /// <summary>
        /// 获取打印机名字的列表
        /// </summary>
        public ArrayList GetPrinterNames()
        {
            ArrayList result = new ArrayList();
            foreach (string ss in PrinterSettings.InstalledPrinters)
            {
                result.Add(ss);
            }
            return result;
        }
        /// <summary>
        /// 获取打印机状态
        /// </summary>
        /// <param name="printerName">打印机名称</param>
        public PrinterStatus GetPrinterStatus(string printerName,out bool isError,out string errorDescription)
        {
            //init return variable
            isError = false;
            errorDescription = string.Empty;
            PrinterStatus printerStatus = PrinterStatus.Idle;
            if (IsNetWorkPrinter(printerName))
            {
                KeyValuePair<string, int> ipPortKeyValuePair = GetPrinterIPAndPort(printerName);
                PrinterCommunicate printerCommunicate = new PrinterCommunicate();
                if (printerCommunicate.CheckNetWorkConnection(ipPortKeyValuePair.Key, ipPortKeyValuePair.Value))
                {
                    WindowsPrintQueue winowsPrintQueue = new WindowsPrintQueue();
                    if (winowsPrintQueue.IsZebraPrinter(printerName))
                    {
                        //get actual status of zebra printer via zebra command
                        if(IsPause(ipPortKeyValuePair.Key, ipPortKeyValuePair.Value))
                        {
                           printerStatus = PrinterStatus.Paused;
                        }
                        string errorMsg = string.Empty;
                        if(IsError(ipPortKeyValuePair.Key, ipPortKeyValuePair.Value, out errorMsg))
                        {
                            isError = true;
                            errorDescription = GetZebraPrinterErrorStatusDescription(errorMsg);
                        }
                    }
                }
                else
                {
                    //not connected
                    printerStatus = PrinterStatus.Offline;
                }
            }
            return printerStatus;
        }
        /// <summary>
        /// determine whether the network printer is in pause.Only for zebra model printer
        /// </summary>
        private bool IsPause(string ip, int port)
        {
            string strOutMsg = null;
            string zebraCommand = "^XA~HS^XZ";
            PrinterCommunicate printerCommunicate = new PrinterCommunicate();
            if (printerCommunicate.SendZPL_ViaNetwork(ip, port, zebraCommand, out strOutMsg))
            {
                //split retMsg with "\r\n"
                string[] retMsgs = strOutMsg.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                if (retMsgs != null)
                {
                   string retFirstMsgItem = retMsgs[0];
                   string[] retFirstMsgItems = retFirstMsgItem.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                   return "1".Equals(retFirstMsgItems[2]);
                }
            }
            return false;
        }
        /// <summary>
        /// determine whether the network printer is in error.only for zebra model printer
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <param name="strOutMsg"></param>
        /// <returns></returns>
        private bool IsError(string ip, int port, out string strOutMsg)
        {
            strOutMsg = string.Empty;
            string zebraCommand = "^XA~HQES^XZ";
            PrinterCommunicate printerCommunicate = new PrinterCommunicate();
            if (printerCommunicate.SendZPL_ViaNetwork(ip, port, zebraCommand, out strOutMsg))
            {
                //split retMsg with "\r\n"
                string[] retMsgs = strOutMsg.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                if (retMsgs != null)
                {
                    for (int i = 0; i < retMsgs.Length; i++)
                    {
                        string retMsgItem = retMsgs[i];
                        if (string.IsNullOrEmpty(retMsgItem) || !retMsgItem.Contains(":")) { continue; }
                        string[] retMsgItemSplited = retMsgItem.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
                        if (retMsgItemSplited == null || retMsgItemSplited.Length == 0) { continue; }
                        string errorMsg = retMsgItemSplited[1].Trim();
                        if (!string.IsNullOrEmpty(errorMsg))
                        {
                            string errorFlag = errorMsg.Substring(0, 1);
                            if ("1".Equals(errorFlag))
                            {
                                strOutMsg = errorMsg;
                                return true;
                            }
                        }
                    }
                }
            }
            return false;
        }
        /// <summary>
        /// get actual status of zebra printer via zebra command.
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        private string GetZebraPrinterErrorStatusDescription(string errorMsg)
        {
            StringBuilder status = new StringBuilder();
            //error happend
            string nibble1 = errorMsg.Substring(errorMsg.Length - 1, 1);
            string nibble2 = errorMsg.Substring(errorMsg.Length - 2, 1);
            string nibble3 = errorMsg.Substring(errorMsg.Lengt

                        
特别声明:本站部分内容收集于互联网是出于更直观传递信息的目的。该内容版权归原作者所有,并不代表本站赞同其观点和对其真实性负责。如该内容涉及任何第三方合法权利,请及时与824310991@qq.com联系,我们会及时反馈并处理完毕。