using System; using System.Collections.Generic; using System.Data; using System.Diagnostics.Metrics; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace PrintBarCode.Helper { public class PrintHelper { private DataTable dt = new DataTable(); public PrintHelper() { dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Value", typeof(string)); dt.Columns.Add("Size", typeof(string)); } public string GetPrintString(string path, string PrintStr) { string[] array = File.ReadAllLines(path, Encoding.Default); int count2 = 0; for (int num = array.Length - 1; num >= 0; num--) { if (array[num].IndexOf("%%") > -1) { count2++; // 每找到一个包含“%%”的行,计数器加1 } } for (int num = array.Length - 1; num >= 0; num--) { if (array[num].IndexOf("%%") > -1) { string sourse = array[num]; string text = MidStrEx_New(sourse, "A0N,", "FH"); int fontSize = GetFontSize(text); string text2 = MidStrEx_New(sourse, "FD%%", "FS"); string value = "%%" + text2.Split('^')[0]; DataRow dataRow = dt.NewRow(); dataRow[0] = value; dataRow[1] = text; dataRow[2] = fontSize.ToString(); dt.Rows.Add(dataRow); } else if (array[num].IndexOf("^LL") > -1) { break; } } string boxFlie = getBoxFlie(path); return replaceGXStr(PrintStr, boxFlie); } private string MidStrEx_New(string sourse, string startstr, string endstr) { Regex regex = new Regex("(?<=(" + startstr + "))[.\\s\\S]*?(?=(" + endstr + "))", RegexOptions.Multiline | RegexOptions.Singleline); return regex.Match(sourse).Value; } private int GetFontSize(string hw) { int result = 9; string[] array = hw.Split(','); try { result = (int)(Convert.ToDouble(array[0]) / 2.8 + 0.4); } catch { } return result; } private string ConvertImageToCode(Bitmap img) { StringBuilder stringBuilder = new StringBuilder(); long num = 0L; long num2 = 0L; int num3 = 0; for (int i = 0; i < img.Size.Height; i++) { for (int j = 0; j < img.Size.Width; j++) { num3 *= 2; string text = ((long)img.GetPixel(j, i).ToArgb()).ToString("X"); if (text.Substring(text.Length - 6, 6).CompareTo("BBBBBB") < 0) { num3++; } num2++; if (j == img.Size.Width - 1 && num2 < 8) { stringBuilder.Append((num3 * (2 ^ (8 - (int)num2))).ToString("X").PadLeft(2, '0')); num3 = 0; num2 = 0L; } if (num2 >= 8) { stringBuilder.Append(num3.ToString("X").PadLeft(2, '0')); num3 = 0; num2 = 0L; } } stringBuilder.Append(Environment.NewLine); } return stringBuilder.ToString(); } private Bitmap CreateImage(string data, Font f) { if (string.IsNullOrEmpty(data)) { return null; } TextBox textBox = new TextBox(); textBox.Text = data; textBox.Font = f; Bitmap bitmap = new Bitmap(textBox.PreferredSize.Width, (textBox.PreferredSize.Height - 5) * textBox.Lines.Length + 5); Graphics graphics = Graphics.FromImage(bitmap); LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, bitmap.Width, bitmap.Height), Color.Black, Color.Black, 1.2f, isAngleScaleable: true); graphics.Clear(Color.White); graphics.DrawString(data, f, brush, 1f, 1f); return bitmap; } private string ZPLStr(string data, string name, float Size = 9f) { Bitmap bitmap = CreateImage(data, new Font("黑体", Size, FontStyle.Bold)); string text = ((bitmap.Size.Width / 8 + ((bitmap.Size.Width % 8 != 0) ? 1 : 0)) * bitmap.Size.Height).ToString(); string text2 = (bitmap.Size.Width / 8 + ((bitmap.Size.Width % 8 != 0) ? 1 : 0)).ToString(); string text3 = ConvertImageToCode(bitmap); return $"~DGR:{name}.GRF,{text},{text2},{text3}"; } private bool HasChinese(string str) { return Regex.IsMatch(str, "[\\u4e00-\\u9fa5]"); } private string replaceGXStr(string list, string boxStr) { string text = boxStr; string[] array = list.Split('~'); if (!HasChinese(list)) { for (int num = array.Length; num >= 1; num--) { text = text.Replace("%%" + num, array[num - 1]); } } else { for (int num2 = array.Length; num2 >= 1; num2--) { string text2 = array[num2 - 1]; if (HasChinese(text2)) { float size = Convert.ToInt16(dt.Select("Name = '%%" + num2 + "'")[0]["Size"].ToString()); string text3 = ZPLStr(text2, num2.ToString(), size); text = text.Replace("^LS0", "^LS0\r\n" + text3); text = text.Replace("FD%%" + num2, "XGR:" + num2 + ".GRF"); text = text.Replace("FD##" + num2, "XGR:" + num2 + ".GRF"); text = text + "\r\n^XA^ID" + num2 + ".GRF^FS^XZ"; } else { text = text.Replace("%%" + num2, array[num2 - 1]); } } } return text; } private string getBoxFlie(string _path) { FileStream fileStream = new FileStream(_path, FileMode.Open); fileStream.Seek(0L, SeekOrigin.Begin); BinaryReader binaryReader = new BinaryReader(fileStream, Encoding.Default); byte[] array = new byte[fileStream.Length]; ASCIIEncoding aSCIIEncoding = new ASCIIEncoding(); string text = ""; array = binaryReader.ReadBytes(array.Length); text = Encoding.Default.GetString(array); fileStream.Close(); binaryReader.Close(); return text; } } }