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 class 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、管理打印机的状态以及查询修改打印机属性
class 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.Length - 3, 1); if (!"0".Equals(nibble1)) { Dictionary<int, string> nibble1ErrorDictionary = new Dictionary<int, string>(); nibble1ErrorDictionary.Add(1, "Midea Out"); nibble1ErrorDictionary.Add(2, "Ribbon Out"); nibble1ErrorDictionary.Add(4, "Head Open"); nibble1ErrorDictionary.Add(8, "Cutter Fault"); status.Append(GetErrorDescriptionFromNibble(nibble1, nibble1ErrorDictionary)); } if (!"0".Equals(nibble2)) { Dictionary<int, string> nibble2ErrorDictionary = new Dictionary<int, string>(); nibble2ErrorDictionary.Add(1, "Printhead Over Temperature"); nibble2ErrorDictionary.Add(2, "Motor Over Temperature"); nibble2ErrorDictionary.Add(4, "Bad Printhead Element"); nibble2ErrorDictionary.Add(8, "Printhead Detection Error"); status.Append(GetErrorDescriptionFromNibble(nibble1, nibble2ErrorDictionary)); } if (!"0".Equals(nibble3)) { Dictionary<int, string> nibble3ErrorDictionary = new Dictionary<int, string>(); nibble3ErrorDictionary.Add(1, "Invalid Firmware Config"); nibble3ErrorDictionary.Add(2, "Printhead Thermistor Open"); status.Append(GetErrorDescriptionFromNibble(nibble1, nibble3ErrorDictionary)); } string strStatus = status.ToString(); return strStatus.Substring(0, strStatus.Length - 1); } private StringBuilder GetErrorDescriptionFromNibble(string nibble, Dictionary<int, string> statusDictionary) { int intNibble = Convert.ToInt32(nibble); StringBuilder status = new StringBuilder(); if (statusDictionary != null) { foreach (var statusKV in statusDictionary) { if ((intNibble & statusKV.Key) == statusKV.Key) { status.Append(statusKV.Value); status.Append(","); } } } return status; } } public enum PrinterStatus { Other = 1, Unknown = 2, Idle = 3, Printing = 4, Warmup = 5, Paused = 6, Offline = 7 }
5、用于获取打印机的型号,以及得到打印机的WindowsPrintQueue(打印队列)
public class WindowsPrintQueue { /// <summary> /// whether the two printer is same model. /// </summary> /// <param name="printerName1"></param> /// <param name="printerName2"></param> /// <returns></returns> public bool IsSameModel(string printerName1, string printerName2) { return GetPrinterModel(printerName1).Equals(GetPrinterModel(printerName2)); } /// <summary> /// whether the printer is zebra model. /// </summary> /// <param name="printerName1"></param> /// <param name="printerName2"></param> /// <returns></returns> public bool IsZebraPrinter(string printerName) { string zebraModel = "ZEBRA"; return GetPrinterModel(printerName).Contains(zebraModel); } /// <summary> /// Return printer model /// </summary> /// <param name="printerName"></param> /// <returns></returns> public string GetPrinterModel(string printerName) { string model = string.Empty; System.Printing.PrintQueue printQueue = GetPrintQueue(printerName); if (printQueue != null) { //Get printer model if (printQueue.Description.IndexOf(",") == printQueue.Description.LastIndexOf(",")) { model = printQueue.Description.Substring(printQueue.Description.IndexOf(",") + 1, printQueue.Description.LastIndexOf(",") - printQueue.Description.IndexOf(",") - 1); } else { model = printQueue.Description.Substring(printQueue.Description.IndexOf(",") + 1); } } return model; } /// <summary> /// Get Windows Print Queue via printer name /// </summary> /// <param name="printerName"></param> /// <returns></returns> public System.Printing.PrintQueue GetPrintQueue(string printerName) { System.Printing.PrintQueue printQueue = null; PrintServer server = new PrintServer(printerName); foreach (System.Printing.PrintQueue pq in server.GetPrintQueues()) { if (pq.FullName.Equals(printerName)) { printQueue = pq; } } return printQueue; } /// <summary> /// Get Windows Print Queue via printer name /// 如果两个printer指向的是同一个物理打印机,则如果copy1的printQueue已经打开, ///则发送到copy2的打印job也会添加到已经打开的copy1的printQueue中. /// </summary> /// <param name="printerName"></param> /// <returns></returns> public System.Printing.PrintQueue GetOpenedPrintQueueOfSameModel(string printerName) { System.Printing.PrintQueue doorOpenedprintQueue = null; System.Printing.PrintQueue currentPrinterPrintQueue = null; PrintServer server = new PrintServer(printerName); foreach (System.Printing.PrintQueue pq in server.GetPrintQueues()) { if (pq.FullName.Equals(printerName)) { currentPrinterPrintQueue = pq; } else { if (IsSameModel(printerName, pq.FullName)) { if (pq.IsDoorOpened) { doorOpenedprintQueue = pq; break; } } } } if (doorOpenedprintQueue != null) { return doorOpenedprintQueue; } else { return currentPrinterPrintQueue; } } }