PrintLabel.cs 4.7 KB
using PrintLabel;
using System;
using System.Collections.Generic;
using System.Management;
using System.Printing;

namespace Asa
{
    public class PrintLabel
    {
        public delegate void PrintStatusEvent(PrinterStatus sta);
        public event PrintStatusEvent PrintStatusChanged;
        
        public PrintLabel(string dir)
        {
            Common.LabelPrint = new BLL.LabelPrint();
            Common.LabelPrint.Load(dir);

        }

        /// <summary>
        /// 加载标签
        /// </summary>
        /// <param name="labelName"></param>
        public void LoadLabel(string labelName)
        {
            Common.LabelPrint.LabelName = labelName;
        }

        /// <summary>
        /// 编辑标签
        /// </summary>
        public void EditLabel()
        {
            FrmLabel frm = new FrmLabel();
            frm.ShowDialog();
        }

        /// <summary>
        /// 打印机
        /// </summary>
        /// <param name="name">打印机名字</param>
        /// <param name="landscape">打印方向,横向纵向</param>
        public void Printer(string name, bool landscape)
        {
            Common.LabelPrint.PrinterName = name;
            Common.LabelPrint.PrintLandscape = landscape;
        }

        /// <summary>
        /// 打印
        /// </summary>
        /// <param name="key"></param>
        public void Print(Dictionary<string, string> key)
        {
            Common.LabelPrint.PrintLast(key, out string[] codeContent);
            System.Threading.Thread tRun = new System.Threading.Thread(new System.Threading.ThreadStart(GetStatus));
            tRun.Start();
        }

        /// <summary>
        /// 打印机状态
        /// </summary>
        public enum PrinterStatus
        {
            /// <summary>
            /// 其他
            /// </summary>
            Other = 1,
            /// <summary>
            /// 未知
            /// </summary>
            Unknown,
            /// <summary>
            /// 空闲
            /// </summary>
            Idle,
            /// <summary>
            /// 正在打印中
            /// </summary>
            Printing,
            /// <summary>
            /// 预热
            /// </summary>
            Preheat,
            /// <summary>
            /// 停止打印
            /// </summary>
            Stop,
            /// <summary>
            /// 打印中
            /// </summary>
            Print,
            /// <summary>
            /// 离线
            /// </summary>
            Offline
        }




        /// <summary>
        /// 获取打印机的当前状态
        /// </summary>
        private void GetStatus()
        {
            int n = 0;
            PrinterStatus sta = PrinterStatus.Other;
            string path = "win32_printer.DeviceId='" + Common.LabelPrint.PrinterName + "'";
            ManagementObject printer = new ManagementObject(path);

            while (true)
            {
                printer.Get();
                int ret = Convert.ToInt32(printer.Properties["PrinterStatus"].Value);
                sta = (PrinterStatus)ret;
                switch(sta)
                {
                    case PrinterStatus.Preheat:
                        break;
                    case PrinterStatus.Print:
                        n = 1;
                        break;
                    case PrinterStatus.Printing:
                        n = 1;
                        break;
                    case PrinterStatus.Idle:
                        if (n == 1) n = 2;
                        break;
                    default:
                        n = 3;
                        break;
                }
                if (n == 3 || n == 2)
                    break;
                System.Threading.Thread.Sleep(1000);
            }
            PrintStatusChanged?.Invoke(sta);

        }

        private void GetPrintStatus()
        {
            PrintQueue pq = LocalPrintServer.GetDefaultPrintQueue();
            switch (pq.QueueStatus)
            {
                //正常状态
                case PrintQueueStatus.None:
                    Console.WriteLine("正常运行");
                    break;
                //纸未取走
                case PrintQueueStatus.OutputBinFull:
                    Console.WriteLine("未取走");
                    break;
                //缺纸
                case PrintQueueStatus.PaperOut:
                    Console.WriteLine("缺纸");
                    break;
                //打印
                case PrintQueueStatus.Printing:
                    Console.WriteLine("正在打印");
                    break;
                default:
                    Console.WriteLine(pq.QueueStatus);
                    break;
            }

        }


    }
}