public class Printer_SBPL_SDK
{
/// <summary>
/// 命令头 ESC →16进制1B
/// </summary>
char ESC = '\x1b';
public StringBuilder PrintCommand = new StringBuilder();
string EroMsg = "";
/// <summary>
/// 脚本开始编写
/// </summary>
/// <returns></returns>
public bool AddStart()
{
PrintCommand.Append(ESC + "A" + "\r");
return true;
}
/// <summary>
/// 设置打印速度
/// </summary>
/// <param name="speed">打印速度</param>
/// <returns></returns>
public bool AddPrintSpeed(int speed)
{
PrintCommand.Append(ESC + "Z" + "\r");
return true;
}
/// <summary>
/// 切纸 批量打印时如果4个标签一组就输入4 尾数自动切:: 7个就会出现一组4个一组3个
/// </summary>
/// <returns></returns>
public bool AddCut( int qty)
{
PrintCommand.Append(ESC + "~A" + qty.ToString()+ "\r");
return true;
}
/// <summary>
/// 设置打印数量
/// </summary>
/// <param name="qty">打印数量</param>
/// <returns></returns>
public bool AddPrintQty(int qty)
{
PrintCommand.Append(ESC + "Q" + qty.ToString() + "\r");
return true;
}
/// <summary>
/// 脚本编写结束
/// </summary>
/// <returns></returns>
public bool AddEnd()
{
PrintCommand.Append(ESC + "Z");
return true;
}
/// <summary>
/// 添加文本
/// </summary>
/// <param name="raotion">旋转角度 0:不旋转 1:逆时针旋转90° 2:逆时针旋转180° 3:逆时针旋转270°</param>
/// <param name="x">横坐标</param>
/// <param name="y">纵坐标</param>
/// <param name="FangDaX">横向放大</param>
/// <param name="FangDaY">纵向放大</param>
/// <param name="ZiJianJu">字间距</param>
/// <param name="ZiHao">字号</param>
/// <param name="Content">内容</param>
/// <returns></returns>
public bool AddText(int raotion, int x, int y, int FangDaX, int FangDaY, int ZiJianJu, int ZiHao, string Content)
{
//%3H0045V0030L0101P02K9DCARD NO.
if (raotion < 0 || raotion > 4)
{
EroMsg = "旋转角度错误!(备注范围0~3 以左上角为基点进行旋转 )";
return false;
}
if (FangDaX < 1 || FangDaX > 13)
{
EroMsg = "横向放大!(备注范围0~12)";
return false;
}
if (FangDaY < 1 || FangDaY > 13)
{
EroMsg = "纵向放大!(备注范围0~12)";
return false;
}
if (FangDaY < -4 || FangDaY > 255)
{
EroMsg = "纵向放大!(备注范围-3~255)";
return false;
}
if (ZiHao < 0 || ZiHao > 10)
{
EroMsg = "字号错误!(备注范围1-9)";
return false;
}
PrintCommand.Append(ESC + "%" + raotion.ToString() + ESC + "H" + x.ToString("D4") + ESC + "V" + y.ToString("D4") +
ESC + "L" + FangDaX.ToString("D2") + FangDaY.ToString("D2") + ESC + "P" + ZiJianJu.ToString("D2") + ESC + "K" + ZiHao.ToString() + "D" + Content + "\r");
return true;
}
/// <summary>
/// 画实线
/// </summary>
/// <param name="raotion">旋转角度</param>
/// <param name="StarX">横坐标</param>
/// <param name="StarY">纵坐标</param>
/// <param name="Lenth">线长度</param>
/// <param name="LineFit">线高度</param>
/// <param name="isHorizon">是否为横向线</param>
/// <returns></returns>
public bool AddLine(int raotion, int StarX, int StarY, int Lenth, int LineFit, bool isHorizon)
{
//%0H0008V0164FW0202V001H422
PrintCommand.Append(ESC + "%" + raotion.ToString() + ESC + "H" + StarX.ToString("D4") + ESC + "V" + StarY.ToString("D4") +
ESC + "FW" + LineFit.ToString("D2") + (isHorizon == true ? "H" : "V") + Lenth.ToString() + "\r");
return true;
}
/// <summary>
/// 画实线方框
/// </summary>
/// <param name="raotion">旋转角度</param>
/// <param name="StarX">横坐标</param>
/// <param name="StarY">纵坐标</param>
/// <param name="Lenth_X">横线长度</param>
/// <param name="Lenth_Y">纵线长度</param>
/// <param name="HorizonLineFit">横向线高度</param>
/// <param name="VerticalLineFit">纵向线高度</param>
/// <returns></returns>
public bool AddGridLine(int raotion, int StarX, int StarY, int Lenth_X, int Lenth_Y, int HorizonLineFit, int VerticalLineFit)
{
//%0H0008V0024FW0202V612H422
PrintCommand.Append(ESC + "%" + raotion.ToString() + ESC + "H" + StarX.ToString("D4") + ESC + "V" + StarY.ToString("D4") +
ESC + "FW" + VerticalLineFit.ToString("D2") + HorizonLineFit.ToString("D2") + "V" + Lenth_Y.ToString() + "H" + Lenth_X.ToString() + "\r");
return true;
}
/// <summary>
/// 画虚线
/// </summary>
/// <param name="raotion">旋转角度</param>
/// <param name="StarX">横坐标</param>
/// <param name="StarY">纵坐标</param>
/// <param name="Lenth">线长度</param>
/// <param name="LineFit">线高度</param>
/// <param name="isHorizon">是否为横向线</param>
/// <returns></returns>
public bool AddRuledLine(int raotion, int StarX, int StarY, int Lenth, int LineFit, bool isHorizon)
{
PrintCommand.Append(ESC + "%" + raotion.ToString() + ESC + "H" + StarX.ToString("D4") + ESC + "V" + StarY.ToString("D4") +
ESC + "FW" + LineFit.ToString("D2") + (isHorizon == true ? "H" : "V") + Lenth.ToString() + "PF0F0F0F0" + "\r");
return true;
}
/// <summary>
/// 画虚线方框
/// </summary>
/// <param name="raotion">旋转角度</param>
/// <param name="StarX">横坐标</param>
/// <param name="StarY">纵坐标</param>
/// <param name="Lenth_X">横向长度</param>
/// <param name="Lenth_Y">纵向长度</param>
/// <param name="HorizonLineFit">横向线高度</param>
/// <param name="VerticalLineFit">纵向线高度</param>
/// <returns></returns>
public bool AddRuledGridLine(int raotion, int StarX, int StarY, int Lenth_X, int Lenth_Y, int HorizonLineFit, int VerticalLineFit)
{
PrintCommand.Append(ESC + "%" + raotion.ToString() + ESC + "H" + StarX.ToString("D4") + ESC + "V" + StarY.ToString("D4") +
ESC + "FW" + VerticalLineFit.ToString("D2") + HorizonLineFit.ToString("D2") + "V" + Lenth_Y.ToString() + "H" + Lenth_X.ToString() + "PF0F0F0F0" + "\r");
return true;
}
/// <summary>
/// /添加一维码Code128B
/// </summary>
/// <param name="raotion">旋转角度</param>
/// <param name="StarX">横坐标</param>
/// <param name="StarY">纵坐标</param>
/// <param name="Content">内容</param>
/// <param name="Barcode_Narrow">窄条的宽度</param>
/// <param name="Barcode_height">高度</param>
/// <returns></returns>
public bool AddCode128(int raotion, int StarX, int StarY, string Content, int Barcode_Narrow, int Barcode_height)
{
if (Barcode_Narrow < 0 || Barcode_Narrow > 13)
{
EroMsg = "一维码窄条宽度无效!(备注范围1~12)";
return false;
}
if (Barcode_height < 0 || Barcode_height > 1000)
{
EroMsg = "一维码高度无效!(备注范围1~999)";
return false;
}
//V100H200BG02120ABCD123456 --Code128B 大写字符+小写字符+数字
PrintCommand.Append(ESC + "%" + raotion.ToString() + ESC + "H" + StarX.ToString("D4") + ESC + "V" + StarY.ToString("D4") +
ESC + "BG" + Barcode_Narrow.ToString("D2") + Barcode_height.ToString("D3") + Content + "\r");
return true;
}
/// <summary>
/// 添加二维码
/// </summary>
/// <param name="raotion">旋转角度</param>
/// <param name="StarX">横坐标</param>
/// <param name="StarY">纵坐标</param>
/// <param name="Content">内容</param>
/// <param name="Pointsize">小方格大小</param>
/// <returns></returns>
public bool AddCode2(int raotion, int StarX, int StarY, string Content, int Pointsize)
{
//%0H0288V00602D30,H,06,0,0
//2D30,H,04,0,0 二维码(每种码不一样)\ 容错级别\ 一个小方格的大小\没看明白\没看明白
//L 7 % M 15 % Q 25 % H 30 %
PrintCommand.Append(ESC + "%" + raotion.ToString() + ESC + "H" + StarX.ToString("D4") + ESC + "V" + StarY.ToString("D4") +
ESC + "2D30,H," + Pointsize.ToString("D2") + ",0,0" + "\r");
//1数字2字母+数字3汉字
PrintCommand.Append(ESC + "DS2," + Content + "\r");
return true;
}
/// <summary>
/// 打印图片
/// </summary>
/// <param name="raotion">旋转角度</param>
/// <param name="StarX">横坐标 单位mm</param>
/// <param name="StarY">纵坐标 单位mm</param>
/// <param name="imgurl">图片路径</param>
/// <returns></returns>
public bool AddImage(int raotion, int StarX, int StarY, string imgurl)
{
Bitmap original = (Bitmap)Image.FromFile(imgurl);
var region = new Rectangle(0, 0, original.Width, original.Height);
using (var bmp1bpp = original.Clone(region, PixelFormat.Format1bppIndexed))
using (var memory = new System.IO.MemoryStream())
{
bmp1bpp.Save(memory, ImageFormat.Bmp);
var bmp = memory.ToArray();
if (!(1 <= bmp.Length && bmp.Length <= 99999))
{
EroMsg = string.Format("Reduce bitmap size. current:{0}, max:99999", bmp.Length);
return false;
}
//%0H0288V0060GM00801,xxxxxx
PrintCommand.Append(ESC + "%" + raotion.ToString() + ESC + "GB" + bmp.Length.ToString("D5")+ ","+ Encoding.ASCII.GetString(bmp) + "\r");
}
original.Dispose();
return true;
}
/// <summary>
/// 获取byte[]指令
/// </summary>
public byte[] GetCommand()
{
return Encoding.GetEncoding("gb18030").GetBytes(PrintCommand.ToString());
}
}
调用方法:
Printer_SBPL_SDK SBPL = new Printer_SBPL_SDK();
SBPL.AddStart();
SBPL.AddPrintSpeed(4);
SBPL.AddGridLine(0, 8, 8, 422, 628, 2, 2);
SBPL.AddLine(0,8,150,422,2,false);
SBPL.AddText(0,45,16,1,1,2,9, "CARD NO.");
SBPL.AddCode128(0,424,328, "CardNo!",2,40);
SBPL.AddPrintQty(1);
SBPL.AddEnd();
//1111
string a = SBPL.PrintCommand.ToString();
//2222
byte[] b= GetCommand();
把b转换成byte[]发送到打印机串口即可.