You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

207 lines
7.2 KiB
C#

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;
}
}
}