using Bro.Common.Helper; using Bro.Common.Interface; using Bro.UI.Model.Winform; using Sunny.UI; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Printing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ZXing; using ZXing.Common; using static System.Windows.Forms.AxHost; //using System.Printing; namespace Bro.M141.Process { [MenuNode("PrinterStatus", "打印机显示界面", 2, EnumHelper.TopMenu.SystemInfo, MenuNodeType.Form)] public partial class UIPrinter : MenuFormBase //public partial class UIPrinter : UserControl { M141Config Config141 => Process.IConfig as M141Config; M141Process Process141 => Process as M141Process; public UIPrinter() { InitializeComponent(); } public override void OnProcessUpdated() { base.OnProcessUpdated(); printDocument1.PrintPage += new PrintPageEventHandler(printDocument_Print); Process141.StartPrinter += StartPrint; textBox1.Text = "Broconcentric"; } PrintDocument printDocument1 = new PrintDocument(); int ttwith = (int)(80 * 4); int ttheigh = (int)(40 * 4); string message = ""; public void StartPrint(string str) { try { ttwith = 320; ttheigh = 160; message = str; if (string.IsNullOrEmpty(message)) { message = textBox1.Text; } this.printDocument1.DefaultPageSettings.PrinterSettings.PrinterName = "Honeywell PX240S (300 dpi)"; this.printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custum", ttwith, ttheigh); this.printDocument1.PrintController = new System.Drawing.Printing.StandardPrintController(); this.printDocument1.Print(); } catch { } int statuscode = GetPrinterStatusCodeInt(); string status = GetPrinterStatusMessage(statuscode); //Config141 Process141.PlcwritePrinter(1520, 0); Process141.PlcwritePrinter(1510, 1); } private void printDocument_Print(object sender, PrintPageEventArgs e) { Font fntTxt = new Font("黑体", 15, System.Drawing.FontStyle.Bold);//正文文字 System.Drawing.Brush brush = new SolidBrush(System.Drawing.Color.Black);//画刷 try { string numvalue = message; float Scale = (float)0.95; int startX = 10; int startY = 25; //int length = 320 * Scale; //int height = 160 * Scale; var g = e.Graphics; Font font = new Font("Arial", 8 * Scale);//设置字体颜色 Font font2 = new Font("Arial", 11 * Scale);//设置字体颜色 Font font3 = new Font("Arial", 36 * Scale);//设置字体颜色 Font font4 = new Font("Arial", 12 * Scale);//设置字体颜色 Pen p = new Pen(Color.Black, Scale);//定义了一个黑色,宽度为1的画笔 g.Clear(Color.White); g.DrawRectangle(p, startX * Scale, startY * Scale, 70 * Scale, 20 * Scale);//在画板上画矩形,起始坐标为(10,10),宽为80,高为20 g.DrawRectangle(p, startX * Scale, startY * Scale, 280 * Scale, 20 * Scale);//在画板上画矩形,起始坐标为(90,10),宽为80,高为20 g.DrawString("厂商", font, brush, (startX + 20) * Scale, (startY + 5) * Scale);// g.DrawString("嘉彰科技", font2, brush, (startX + 140) * Scale, (startY + 4) * Scale); //第二行数据 g.DrawRectangle(p, startX * Scale, (startY + 20) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 20) * Scale, 280 * Scale, 20 * Scale); g.DrawString("品名", font, brush, (startX + 20) * Scale, (startY + 25) * Scale); g.DrawString(@"COVER LG208H-RC100 #2", font4, brush, (startX + 71) * Scale, (startY + 22) * Scale); //第三行数据 g.DrawRectangle(p, startX * Scale, (startY + 40) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 40) * Scale, 280 * Scale, 20 * Scale); g.DrawString("料号", font, brush, (startX + 20) * Scale, (startY + 45) * Scale); g.DrawString(@"436LG208I000", font2, brush, (startX + 130) * Scale, (startY + 43) * Scale); //第四行数据 g.DrawRectangle(p, startX * Scale, (startY + 60) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 60) * Scale, 210 * Scale, 20 * Scale); g.DrawString("数量", font, brush, (startX + 20) * Scale, (startY + 65) * Scale); g.DrawString(@"50PCS", font2, brush, (startX + 120) * Scale, (startY + 62) * Scale); //第五行数据 g.DrawRectangle(p, startX * Scale, (startY + 80) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 80) * Scale, 210 * Scale, 20 * Scale); g.DrawString("生产日期", font, brush, (startX + 10) * Scale, (startY + 85) * Scale); g.DrawString($"{DateTime.Now.ToString("yyyy.MM.dd")}", font2, brush, (startX + 105) * Scale, (startY + 82) * Scale); //第六行数据 g.DrawRectangle(p, startX * Scale, (startY + 100) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 100) * Scale, 140 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 100) * Scale, 210 * Scale, 20 * Scale); g.DrawString("MARK1", font, brush, (startX + 15) * Scale, (startY + 104) * Scale); g.DrawString("MARK2", font, brush, (startX + 155) * Scale, (startY + 104) * Scale); //侧面 g.DrawRectangle(p, (startX + 210) * Scale, (startY + 60) * Scale, 70 * Scale, 60 * Scale); g.DrawString(@"#2", font3, brush, (startX + 210) * Scale, (startY + 62) * Scale); } catch (Exception ee) { MessageBox.Show(ee.Message); } } private void printDocument_Print222(object sender, PrintPageEventArgs e) { Font fntTxt = new Font("黑体", 15, System.Drawing.FontStyle.Bold);//正文文字 System.Drawing.Brush brush = new SolidBrush(System.Drawing.Color.Black);//画刷 try { string numvalue = message; //Bitmap bitmap = getexcel();// CreateCode(numvalue); //int with = (ttwith - bitmap.Width) / 2 - 20; //int heih = (ttheigh - bitmap.Height) / 2; //條碼的位置 //e.Graphics.DrawImage(bitmap, new System.Drawing.Point(0, 0)); //條碼信息數字的位置 //e.Graphics.DrawString(numvalue, fntTxt, brush, new System.Drawing.Point(bitmap.Width / 4 + with - 10, heih + bitmap.Height + 5)); //e.Graphics.DrawImage(img, new Rectangle(25, 25, bmpwidth, bmpheight), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel); int Scale = 1; int startX = 10; int startY = 25; int length = 320 * Scale; int height = 160 * Scale; var g = e.Graphics; Font font = new Font("Arial", 8 * Scale);//设置字体颜色 Font font2 = new Font("Arial", 11 * Scale);//设置字体颜色 Font font3 = new Font("Arial", 36 * Scale);//设置字体颜色 Font font4 = new Font("Arial", 12 * Scale);//设置字体颜色 //SolidBrush brush = new SolidBrush(Color.Black);//新建一个画刷,到这里为止,我们已经准备好了画板、画刷、和数据 Pen p = new Pen(Color.Black, Scale);//定义了一个黑色,宽度为1的画笔 g.Clear(Color.White); //设置白色背景 //第一行数据 g.DrawRectangle(p, startX * Scale, startY * Scale, 70 * Scale, 20 * Scale);//在画板上画矩形,起始坐标为(10,10),宽为80,高为20 g.DrawRectangle(p, startX * Scale, startY * Scale, 280 * Scale, 20 * Scale);//在画板上画矩形,起始坐标为(90,10),宽为80,高为20 g.DrawString("厂商", font, brush, (startX + 20) * Scale, (startY + 5) * Scale);// g.DrawString("嘉彰科技", font2, brush, (startX + 140) * Scale, (startY + 4) * Scale); //第二行数据 g.DrawRectangle(p, startX * Scale, (startY + 20) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 20) * Scale, 280 * Scale, 20 * Scale); g.DrawString("品名", font, brush, (startX + 20) * Scale, (startY + 25) * Scale); g.DrawString(@"COVER LG208H-RC100 #2", font4, brush, (startX + 71) * Scale, (startY + 22) * Scale); //第三行数据 g.DrawRectangle(p, startX * Scale, (startY + 40) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 40) * Scale, 280 * Scale, 20 * Scale); g.DrawString("料号", font, brush, (startX + 20) * Scale, (startY + 45) * Scale); g.DrawString(@"436LG208I000", font2, brush, (startX + 130) * Scale, (startY + 43) * Scale); //第四行数据 g.DrawRectangle(p, startX * Scale, (startY + 60) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 60) * Scale, 210 * Scale, 20 * Scale); g.DrawString("数量", font, brush, (startX + 20) * Scale, (startY + 65) * Scale); g.DrawString(@"50PCS", font2, brush, (startX + 120) * Scale, (startY + 62) * Scale); //第五行数据 g.DrawRectangle(p, startX * Scale, (startY + 80) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 80) * Scale, 210 * Scale, 20 * Scale); g.DrawString("生产日期", font, brush, (startX + 10) * Scale, (startY + 85) * Scale); g.DrawString($"{DateTime.Now.ToString("yyyy.MM.dd")}", font2, brush, (startX + 105) * Scale, (startY + 82) * Scale); //第六行数据 g.DrawRectangle(p, startX * Scale, (startY + 100) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 100) * Scale, 140 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 100) * Scale, 210 * Scale, 20 * Scale); g.DrawString("MARK1", font, brush, (startX + 15) * Scale, (startY + 104) * Scale); g.DrawString("MARK2", font, brush, (startX + 155) * Scale, (startY + 104) * Scale); //侧面 g.DrawRectangle(p, (startX + 210) * Scale, (startY + 60) * Scale, 70 * Scale, 60 * Scale); g.DrawString(@"#2", font3, brush, (startX + 210) * Scale, (startY + 62) * Scale); } catch (Exception ee) { MessageBox.Show(ee.Message); } } public static Bitmap CreateCode(string asset) { // 1.设置条形码规格 EncodingOptions options = new EncodingOptions(); options.Height = 100; // 必须制定高度、宽度 options.Width = 250; // 2.生成条形码图片并保存 var writer = new BarcodeWriter(); writer.Options = options; writer.Format = BarcodeFormat.CODE_128; // 这里可以设定条码的标准 //為true不自帶條碼信息 options.PureBarcode = true; Bitmap bp = writer.Write(asset); return bp; // 生成图片 } //打印 private void button1_Click(object sender, EventArgs e) { message = textBox1.Text; if (string.IsNullOrEmpty(message)) { MessageBox.Show("打印内容不可为空"); return; } StartPrint(message); } //预览 private void button2_Click(object sender, EventArgs e) { message = textBox1.Text; if (string.IsNullOrEmpty(message)) { MessageBox.Show("打印内容不可为空"); return; } PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog(); this.printDocument1.DefaultPageSettings.PrinterSettings.PrinterName = "Honeywell PX240S (300 dpi)"; this.printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custum", ttwith, ttheigh); //this.printDocument1.PrintPage += new PrintPageEventHandler(this.printDocument_Print); printPreviewDialog1.Document = printDocument1; DialogResult res = printPreviewDialog1.ShowDialog(); printPreviewDialog1.Document.Dispose(); } public Bitmap getexcel() { int startX = 10; int startY = 25; int Scale = 1; int length = 320 * Scale; int height = 160 * Scale; Bitmap bmp = new Bitmap(length, height);//, System.Drawing.Imaging.PixelFormat.Format32bppArgb);//新建一个图片对象 //bmp.SetResolution(320, 160); Graphics g = Graphics.FromImage(bmp);//利用该图片对象生成“画板” Font font = new Font("Arial", 8 * Scale);//设置字体颜色 Font font2 = new Font("Arial", 11 * Scale);//设置字体颜色 Font font3 = new Font("Arial", 36 * Scale);//设置字体颜色 Font font4 = new Font("Arial", 12 * Scale);//设置字体颜色 SolidBrush brush = new SolidBrush(Color.Black);//新建一个画刷,到这里为止,我们已经准备好了画板、画刷、和数据 //g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; //g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //g.PixelOffsetMode = PixelOffsetMode.Half; Pen p = new Pen(Color.Black, Scale);//定义了一个黑色,宽度为1的画笔 g.Clear(Color.White); //设置白色背景 //第一行数据 g.DrawRectangle(p, startX * Scale, startY * Scale, 70 * Scale, 20 * Scale);//在画板上画矩形,起始坐标为(10,10),宽为80,高为20 g.DrawRectangle(p, startX * Scale, startY * Scale, 280 * Scale, 20 * Scale);//在画板上画矩形,起始坐标为(90,10),宽为80,高为20 g.DrawString("厂商", font, brush, (startX + 20) * Scale, (startY + 5) * Scale);// g.DrawString("嘉彰科技", font2, brush, (startX + 140) * Scale, (startY + 4) * Scale); //第二行数据 g.DrawRectangle(p, startX * Scale, (startY + 20) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 20) * Scale, 280 * Scale, 20 * Scale); g.DrawString("品名", font, brush, (startX + 20) * Scale, (startY + 25) * Scale); g.DrawString(@"COVER LG208H-RC100 #2", font4, brush, (startX + 71) * Scale, (startY + 22) * Scale); //第三行数据 g.DrawRectangle(p, startX * Scale, (startY + 40) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 40) * Scale, 280 * Scale, 20 * Scale); g.DrawString("料号", font, brush, (startX + 20) * Scale, (startY + 45) * Scale); g.DrawString(@"436LG208I000", font2, brush, (startX + 130) * Scale, (startY + 43) * Scale); //第四行数据 g.DrawRectangle(p, startX * Scale, (startY + 60) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 60) * Scale, 210 * Scale, 20 * Scale); g.DrawString("数量", font, brush, (startX + 20) * Scale, (startY + 65) * Scale); g.DrawString(@"50PCS", font2, brush, (startX + 120) * Scale, (startY + 62) * Scale); //第五行数据 g.DrawRectangle(p, startX * Scale, (startY + 80) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 80) * Scale, 210 * Scale, 20 * Scale); g.DrawString("生产日期", font, brush, (startX + 10) * Scale, (startY + 85) * Scale); g.DrawString($"{DateTime.Now.ToString("yyyy.MM.dd")}", font2, brush, (startX + 105) * Scale, (startY + 82) * Scale); //第六行数据 g.DrawRectangle(p, startX * Scale, (startY + 100) * Scale, 70 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 100) * Scale, 140 * Scale, 20 * Scale); g.DrawRectangle(p, startX * Scale, (startY + 100) * Scale, 210 * Scale, 20 * Scale); g.DrawString("MARK1", font, brush, (startX + 15) * Scale, (startY + 104) * Scale); g.DrawString("MARK2", font, brush, (startX + 155) * Scale, (startY + 104) * Scale); //侧面 g.DrawRectangle(p, (startX + 210) * Scale, (startY + 60) * Scale, 70 * Scale, 60 * Scale); g.DrawString(@"#2", font3, brush, (startX + 210) * Scale, (startY + 62) * Scale); //Font font22 = new Font("Arial", 6);//设置字体颜色 //for (int i = 0; i < 32;i++) //{ // g.DrawString(i.ToString(), font22, brush, 0, i*10); // g.DrawString(i.ToString(), font22, brush, i * 10, 0); //} //bmp.Save("E:/test.bmp");//保存为输出流,否则页面上显示不出来 g.Dispose();//释放掉该资源 bmp.SetResolution(105 * Scale, 105 * Scale); return bmp; } #region [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool OpenPrinter(string pPrinterName, out IntPtr hPrinter, IntPtr pDefault); [DllImport("winspool.drv", SetLastError = true)] private static extern bool ClosePrinter(IntPtr hPrinter); [DllImport("winspool.drv", SetLastError = true)] private static extern bool GetPrinter(IntPtr hPrinter, int dwLevel, IntPtr pPrinter, int cbBuf, out int pcbNeeded); [DllImport("winspool.drv", CharSet = CharSet.Auto)] public static extern int EnumJobs(IntPtr hPrinter, int FirstJob, int NoJobs, int Level, IntPtr pInfo, int cdBuf, out int pcbNeeded, out int pcReturned); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct PRINTER_INFO_2 { public string pServerName; public string pPrinterName; public string pShareName; public string pPortName; public string pDriverName; public string pComment; public string pLocation; public IntPtr pDevMode; public string pSepFile; public string pPrintProcessor; public string pDatatype; public string pParameters; public IntPtr pSecurityDescriptor; public uint Attributes; public uint Priority; public uint DefaultPriority; public uint StartTime; public uint UntilTime; public uint Status; public uint cJobs; public uint AveragePPM; } /// /// 默认打印机的名称 /// //private static string printerName = new LocalPrintServer().DefaultPrintQueue.Name; private static string printerName = "Honeywell PX240S (300 dpi)"; /// /// 获取打印机的状态编码(方式1) /// /// public static int GetPrinterStatusCodeInt() { int intRet = -1; IntPtr hPrinter; if (OpenPrinter(printerName, out hPrinter, IntPtr.Zero)) { int cbNeeded = 0; bool bolRet = GetPrinter(hPrinter, 2, IntPtr.Zero, 0, out cbNeeded); if (cbNeeded > 0) { IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded); bolRet = GetPrinter(hPrinter, 2, pAddr, cbNeeded, out cbNeeded); if (bolRet) { PRINTER_INFO_2 Info2 = new PRINTER_INFO_2(); Info2 = (PRINTER_INFO_2)Marshal.PtrToStructure(pAddr, typeof(PRINTER_INFO_2)); intRet = System.Convert.ToInt32(Info2.Status); } Marshal.FreeHGlobal(pAddr); } ClosePrinter(hPrinter); } return intRet; } /// /// 检查打印机是否可用(方式1) /// /// /// public static bool CheckIsEnable(int intStatusCodeValue) { bool isEnable = false; if (UIPrinter.GetTaskNumber() == 0) { return true; } if (intStatusCodeValue == 0x0008000 || intStatusCodeValue == 0x00000400 || intStatusCodeValue == 0x00004000) { return true; } return isEnable; } /// /// 获取打印机的状态信息(方式1) /// /// public static string GetPrinterStatusMessage(int intStatusCodeValue) { string strRet = string.Empty; switch (intStatusCodeValue) { case 0: strRet = "准备就绪(Ready)"; break; case 0x00000200: strRet = "忙(Busy)"; break; case 0x00400000: strRet = "被打开(Printer Door Open)"; break; case 0x00000002: strRet = "错误(Printer Error)"; break; case 0x0008000: strRet = "初始化(Initializing)"; break; case 0x00000100: strRet = "正在输入,输出(I/O Active)"; break; case 0x00000020: strRet = "手工送纸(Manual Feed)"; break; case 0x00040000: strRet = "无墨粉(No Toner)"; break; case 0x00001000: strRet = "不可用(Not Available)"; break; case 0x00000080: strRet = "脱机(Off Line)"; break; case 0x00200000: strRet = "内存溢出(Out of Memory)"; break; case 0x00000800: strRet = "输出口已满(Output Bin Full)"; break; case 0x00080000: strRet = "当前页无法打印(Page Punt)"; break; case 0x00000008: strRet = "塞纸(Paper Jam)"; break; case 0x00000010: strRet = "打印纸用完(Paper Out)"; break; case 0x00000040: strRet = "纸张问题(Page Problem)"; break; case 0x00000001: strRet = "暂停(Paused)"; break; case 0x00000004: strRet = "正在删除(Pending Deletion)"; break; case 0x00000400: strRet = "正在打印(Printing)"; break; case 0x00004000: strRet = "正在处理(Processing)"; break; case 0x00020000: strRet = "墨粉不足(Toner Low)"; break; case 0x00100000: strRet = "需要用户干预(User Intervention)"; break; case 0x20000000: strRet = "等待(Waiting)"; break; case 0x00010000: strRet = "热机中(Warming Up)"; break; case 1048706: strRet = "色带已用尽"; break; default: strRet = "未知状态(Unknown Status)"; break; } return strRet; } /// /// 获取打印机正在打印的任务数(方式1) /// /// public static int GetTaskNumber() { IntPtr handle; int FirstJob = 0; int NumJobs = 127; int pcbNeeded; int pcReturned = -1; OpenPrinter(printerName, out handle, IntPtr.Zero); // get num bytes required, here we assume the maxt job for the printer quest is 128 (0..127) EnumJobs(handle, FirstJob, NumJobs, 1, IntPtr.Zero, 0, out pcbNeeded, out pcReturned); // allocate unmanaged memory IntPtr pData = Marshal.AllocHGlobal(pcbNeeded); // get structs EnumJobs(handle, FirstJob, NumJobs, 1, pData, pcbNeeded, out pcbNeeded, out pcReturned); return pcReturned; } #endregion private void button3_Click(object sender, EventArgs e) { int taskNum = GetTaskNumber(); int statuscode = GetPrinterStatusCodeInt(); string status = GetPrinterStatusMessage(statuscode); //只有在打印机异常时再次下发打印任务后,才能获取到打印机状态。这是因为打印机驱动程序通常只在处理打印请求时更新其状态信息。如果打印机没有接收到新的打印任务,可能无法立即反映出真实状态。 textBox2.Text = "taskNum:" + taskNum + ",statuscode:" + statuscode + ",status:" + status; } } }