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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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