|
本帖最后由 yuzhongyang 于 2019-4-23 14:47 编辑
管理员大大不删帖.我就把代码贴出来吧.希望可以帮到大家.注意: 蓝牙打印机需支持TSC指令. 并且需将打印机切换至TSC指令模式. (ESC模式思路相同,欢迎补充.)
using System;
using System.Data;
using YULIANAPP.ServerClass;
namespace YULIANAPP.Froms
{
partial class appFrmTranWaybillPrint : Smobiler.Core.Controls.MobileForm
{
DataTable dt = new DataTable();
private string _WaybillNo;
public string WaybillNo
{
get { return _WaybillNo; }
set
{
txtWaybillNo.Text = value;
_WaybillNo = value;
}
}
public appFrmTranWaybillPrint() : base()
{
//This call is required by the SmobilerForm.
InitializeComponent();
}
private void btnOpenBt_Press(object sender, EventArgs e)
{
bluetooth1.Open((abj, args) =>
{
if (args.isError == true)
Toast(args.error);
else
Toast("蓝牙已打开!");
});
}
private void btnCloseBt_Press(object sender, EventArgs e)
{
bluetooth1.Close((abj, args) =>
{
if (args.isError == true)
Toast(args.error);
else
{
txtBtName.Text = "";
txtBtMacAddress.Text = "";
Toast("蓝牙已关闭!");
}
});
}
private void btnScanBt_Press(object sender, EventArgs e)
{
bluetooth1.Search((abj, args) =>
{
if (args.isError == true)
Toast(args.error);
else
{
txtBtName.Text = args.Name;
txtBtMacAddress.Text = args.MacAddress;
Toast("连接成功!");
}
});
}
private void btnContentBt_Press(object sender, EventArgs e)
{
if (txtBtMacAddress.Text.Trim() == string.Empty) return;
bluetooth1.CloseConnect((abj, args) =>
{
if (args.isError == true)
Toast(args.error);
else
Toast("蓝牙设备关闭成功!");
});
bluetooth1.Connect(txtBtMacAddress.Text, (abj, args) =>
{
if (args.isError == true)
Toast(args.error);
else
Toast("蓝牙设备连接成功!");
});
}
private void appFrmTranWaybillPrint_Load(object sender, EventArgs e)
{
try
{
bluetooth1.GetStatus((abj, args) =>
{
if (args.isError == true)
Toast(args.error);
else
{
txtBtName.Text = args.Name;
txtBtMacAddress.Text = args.MacAddress;
}
});
}
catch
{
Toast("载入蓝牙设备异常!");
}
btnSearch_Press(sender, new EventArgs());
}
private void btnSearch_Press(object sender, EventArgs e)
{
dt = new bllReport().Search_sp_TMS_GetPrintReportWaybill(txtWaybillNo.Text, "tb_TranWaybill").Tables[0];
if (dt != null && dt.Rows.Count > 0)
{
txtWaybillNo.BackColor = System.Drawing.Color.OldLace;
txtQty.Text = dt.Rows[0]["数量"].ToString();
}
else
{
txtWaybillNo.BackColor = System.Drawing.Color.White;
Toast("未获取到该运单编号的任何信息!");
}
}
private void btnPrint_Press(object sender, EventArgs e)
{
if (ConvertEx.ToInt(txtQty.Text) <= 0)
{
Toast("打印份数异常!");
return;
}
if (txtWaybillNo.BackColor != System.Drawing.Color.OldLace)
{
Toast("请先点击查询按钮检查运单编号!");
return;
}
if (txtBtMacAddress.Text.Trim() == string.Empty)
{
Toast("请先连接蓝牙打印机!");
return;
}
if (dt == null || dt.Rows.Count <= 0)
{
Toast("未发现任何打印资料!");
return;
}
DataRow dr = dt.Rows[0];
btnPrint.Enabled = false;
for (int i = 1; i <= ConvertEx.ToInt(txtQty.Text.ToString()); i++)
{
try
{
string print1 =
TSPLPrintClass.FEED(0) +
//TSPLPrintClass.BOX(0,0,70,40,2)+
//TSPLPrintClass.BAR(0, 1, 50, 2)+
TSPLPrintClass.TEXT(0, 0, "ROMAN.TTF", 0, 2, 2, 0, "运单编号:" + txtWaybillNo.Text.Trim()) +
TSPLPrintClass.TEXT(0, 8, "ROMAN.TTF", 0, 1, 1, 0, "起始网点: " + dr["始发网点名称"].ToString()) +
TSPLPrintClass.TEXT(0, 12, "ROMAN.TTF", 0, 1, 1, 0, "目的网点: " + dr["目的网点名称"].ToString() + " / " + dr["目的地名称"].ToString()) +
TSPLPrintClass.TEXT(0, 16, "ROMAN.TTF", 0, 1, 1, 0, "收货信息: " + dr["收货人"].ToString() + "/" + dr["收货电话"].ToString() + "/" + dr["交货方式"].ToString()) +
TSPLPrintClass.TEXT(0, 18, "ROMAN.TTF", 0, 1, 1, 0, "收货地址: " + dr["目的省"].ToString() + dr["目的市"].ToString() + dr["目的县"].ToString() + "," + dr["收货地址"].ToString()) +
TSPLPrintClass.TEXT(0, 29, "ROMAN.TTF", 0, 1, 1, 0, "其他信息: " + dr["货物名称"].ToString() + "/" + dr["数量"].ToString() + "件/" + dr["重量"].ToString() + "KG/" + dr["体积"].ToString() + "方/" + dr["备注"].ToString()) +
//TSPLPrintClass.BAR(0, 37, 70, 2) +
TSPLPrintClass.BARCODE(0, 37, "128M", 50, 1, 0, 4, 4, 0, txtWaybillNo.Text.Trim()) +
TSPLPrintClass.REFERENCE(1, 1) +
TSPLPrintClass.SPEED(15) +
TSPLPrintClass.DENSITY(4) +
TSPLPrintClass.printset() +
TSPLPrintClass.DIRECTION(0, 0) +
TSPLPrintClass.SHIFT(0) +
TSPLPrintClass.OFFSET(0) +
TSPLPrintClass.CLS() +
TSPLPrintClass.QRCODE(55, 0, "H", 5, "A", 0, "M2", "S8", txtWaybillNo.Text.Trim()) +
TSPLPrintClass.PRINT(1, 1);
byte[] printByte = System.Text.Encoding.GetEncoding("gbk").GetBytes(print1);
bluetooth1.WriteData(printByte, (abj, args) =>
{
if (args.isError == true)
{
Toast(args.error);
}
});
}
catch (Exception ex)
{
Toast(ex.ToString());
break;
}
}
btnPrint.Enabled = true;
Toast("打印成功!");
}
private void bluetooth1_DataReceived(object sender, Smobiler.Plugins.BluetoothDataReceivedEventArgs e)
{
//Toast(e.Data.ToString());
//MessageBox.Show(System.Text.Encoding.GetEncoding("gbk").GetString(e.Data));
}
}
}
-------------------------------------------------------分割线---------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace YULIANAPP.ServerClass
{
public class TSPLPrintClass
{
/// <summary>
/// dpi200 1:8 dpi300 1:12
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
private static int dpi(int m)
{// 1 mm = 8 dots
return m * 8;
}
/// <summary>
/// 此条指令将会定义打印机的打印方向及内容是否镜面反射,此设置将会保存在打印机的内存中。
/// </summary>
/// <param name="m">0 or 1</param>
/// <param name="n">0: 正常的图片 1: 镜面反射后的图片 </param>
/// <returns></returns>
public static string DIRECTION(int m, int n)
{
return string.Format("DIRECTION {0},{1}\r\n", m.ToString(), n.ToString());
}
/// <summary>
/// 此条指令用来调整标签图像的横坐标及纵坐标。数值为正值时,会向标签打印的方向移动;负值 时,会背离所打印的方向
/// </summary>
/// <param name="y">最大可设置尺寸为 1 inch。对于 203DPI 的机器,范围是 -203 到 203,对于 300DPI,范围是-300 到 300,单位为 DOT. </param>
/// <returns></returns>
public static string SHIFT( int y)
{
return string.Format("SHIFT {0}\r\n", dpi(y).ToString());
}
/// <summary>
/// 此条指令将为每一张标签定义额外的送纸偏移,对于剥纸模式及裁切模式下,调整此条指令,可 以使打印机将纸张停留在预期的位置上。打印机在每次打印前会将额外设定的距离回卷后再打yin
/// </summary>
/// <param name="m">长度</param>
/// <returns></returns>
public static string OFFSET(float m)
{
return string.Format("OFFSET {0} mm\r\n", m.ToString());
}
/// <summary>
/// 此条指令用来定义标签打印的起始参考点。参考原点的位置将会收到打印方向的影响,如下图
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public static string REFERENCE(int x, int y)
{
return string.Format("REFERENCE {0},{1}\r\n", dpi(x).ToString(), dpi(y).ToString());
}
public static string printset()
{
return "SET PEEL OFF\r\n" +
"SET CUTTER OFF\r\n" +
"SET TEAR ON\r\n";
}
/// <summary>
/// 此命令定义标签的宽度和长度。
/// </summary>
/// <param name="m">标签宽度 单位 mm</param>
/// <param name="n">标签长度 单位 mm</param>
/// <returns></returns>
public static string Size(int m ,int n)
{
return string.Format("SIZE {0} mm,{1} mm\r\n",m.ToString(),n.ToString());
}
/// <summary>
/// 定义两张标签纸中间的间隙高度
/// </summary>
/// <param name="m">两张标签中间的间隙高度 单位 mm</param>
/// <param name="n">间隙偏移量 单位 mm</param>
/// <returns></returns>
public static string GAP(int m, int n)
{
return string.Format("GAP {0} mm,{1} mm\r\n", m.ToString(), n.ToString());
}
/// <summary>
/// 打印速度
/// </summary>
/// <param name="n">1-18</param>
/// <returns></returns>
public static string SPEED(int n)
{
return string.Format("SPEED {0}\r\n", n.ToString());
}
/// <summary>
/// 打印浓度 默认的 DENSITY 设置为 8
/// </summary>
/// <param name="n">0-15</param>
/// <returns></returns>
public static string DENSITY(int n)
{
return string.Format("DENSITY {0}\r\n", n.ToString());
}
/// <summary>
/// 此条指令用来清除打印机中的图像缓存
/// </summary>
/// <returns></returns>
public static string CLS()
{
return "CLS\r\n";
}
/// <summary>
/// 此条指令用来命令打印机送出规定长度的纸张
/// </summary>
/// <param name="n">1 ≤ n ≤ 9999 /8 单位 mm</param>
/// <returns></returns>
public static string FEED(int n)
{
return string.Format("FEED {0}\r\n", dpi(n).ToString());
}
/// <summary>
/// 此条指令用于将打印机中图像缓存印出
/// SIZE 50 mm,25 mm
/// GAP 3 mm,0
/// DIRECTION 1
/// SET COUNTER @1 1
/// @1="0001"
/// CLS TEXT 10,10, "3",0,1,1,@1
/// PRINT 3,2
/// </summary>
/// <param name="m">如设置了序列号,指定列印多少序列号的标签 </param>
/// <param name="n">指定每一张序列号打印多少份 </param>
/// <returns></returns>
public static string PRINT(int m , int n)
{
return string.Format("PRINT {0},{1}\r\n", m.ToString(), n.ToString());
}
/// <summary>
/// 汇制线条。
/// </summary>
/// <param name="x">左上角的 X 坐标 (单位 mm) </param>
/// <param name="y">左上角的 Y 坐标 (单位 mm) </param>
/// <param name="weight">线条宽度 (单位 mm) </param>
/// <param name="height">线条高度 (单位 dot) </param>
/// <returns></returns>
public static string BAR(int x, int y ,int weight, int height)
{
return string.Format("BAR {0},{1},{2},{3}\r\n", dpi(x).ToString(),dpi(y).ToString(), dpi(weight).ToString(), height.ToString());
}
/// <summary>
/// 在标签中绘制一维条码
/// </summary>
/// <param name="x">指定条码的 X 坐标 (单位 mm) </param>
/// <param name="y">制定条码的 Y 坐标 (单位 mm) </param>
/// <param name="CodeType">128M</param>
/// <param name="Height">条码高度(单位 dot) </param>
/// <param name="HumanReadable">0: 不显示码文 1: 显示码文,码文左对齐 2: 显示码文,码文居中 3: 显示码文,码文右对齐 </param>
/// <param name="rotation">0 : 不旋转 90 : 顺时针旋转 90 度 180 : 顺时针旋转 90 度 270 : 顺时针旋转 270 度 </param>
/// <param name="narrow">窄比例因子宽度 (单位 dot) </param>
/// <param name="wide">宽比例因子宽度 (单位 dot) </param>
/// <param name="alignment">指定条码的对齐方式 0 : 默认 (居左) 1 : 居左 2 : 居中 3 : 居右 </param>
/// <param name="content">条码数据内容 </param>
/// <returns>BARCODE 10,50,"128",100,1,0,2,2,"123456abcd123456" </returns>
public static string BARCODE(int x, int y, string CodeType, int Height, int HumanReadable ,int rotation , int narrow , int wide , int alignment , string content)
{
return string.Format("BARCODE {0},{1},\"{2}\",{3},{4},{5},{6},{7},{8},\"{9}\"\r\n",
dpi(x).ToString(),
dpi(y).ToString(),
CodeType.ToString(),
Height.ToString(),
HumanReadable.ToString(),
rotation.ToString(),
narrow.ToString(),
wide.ToString(),
alignment.ToString(),
content.ToString()
);
}
/// <summary>
/// 绘制方框
/// </summary>
/// <param name="x">指定左上角的 X 坐标 (单位 mm)</param>
/// <param name="y">指定左上角的 Y 坐标 (单位 mm) </param>
/// <param name="x_end">指定右下角的 X 坐标 (单位 mm) </param>
/// <param name="y_end">指定右下角的 Y 坐标 (单位 mm) </param>
/// <param name="LineThicknes">线条粗细 单位dot </param>
/// <returns>BOX 120,120,550,150,4,20</returns>
public static string BOX(int x, int y, int x_end, int y_end, int LineThicknes)
{
return string.Format("BOX {0},{1},{2},{3},{4}\r\n",
dpi(x).ToString(),
dpi(y).ToString(),
dpi(x_end).ToString(),
dpi(y_end).ToString(),
LineThicknes.ToString()
);
}
/// <summary>
/// 绘制 QR code
/// </summary>
/// <param name="x">QR code 的左上角 X 坐标(单位 mm) </param>
/// <param name="y">QR code 的左上角 Y 坐标 (单位 mm)</param>
/// <param name="ECCLevel">纠错等级 L : 7% M : 15% Q : 25% H : 30% </param>
/// <param name="CellWidth">1-10</param>
/// <param name="mode">自动 / 手动编码 A : 自动 M : 手动 </param>
/// <param name="rotation">0 : 0 旋转 90 : 90 旋转 180 : 180 旋转 270 : 270 旋转 </param>
/// <param name="model">M1: (默认), 原始版本 M2: 扩大版本 (大部分的智能手机支持此版本) </param>
/// <param name="mask">S0~S8, 默认为 S7 </param>
/// <param name="content">内容</param>
/// <returns>QRCODE 310,310,M,4,A,0,M2,"印表機 ABCabc123" </returns>
public static string QRCODE(int x, int y, string ECCLevel, int CellWidth, string mode, int rotation, string model, string mask, string content)
{
return string.Format("QRCODE {0},{1},{2},{3},{4},{5},{6},{7},\"{8}\"\r\n",
dpi(x).ToString(),
dpi(y).ToString(),
ECCLevel.ToString(),
CellWidth.ToString(),
mode.ToString(),
rotation.ToString(),
model.ToString(),
mask.ToString(),
content.ToString()
);
}
/// <summary>
/// 打印一段文字
/// </summary>
/// <param name="x">X 起始坐标 (单位 mm)</param>
/// <param name="y">Y 起始坐标 (单位 mm)</param>
/// <param name="font">字体名称 </param>
/// <param name="rotation">文本旋转方向 0 : 不旋转 90 : 顺时针旋转 90 度 180 :顺时针旋转 180 度 270 :顺时针旋转 270 度 </param>
/// <param name="x_multiplication">水平放大比率,最大放大 10 倍 有效参数: 1~10 </param>
/// <param name="y_multiplication">垂直放大比率,最大放大 10 倍 有效参数: 1~10 </param>
/// <param name="alignment">文本的对齐模式. (V6.73EZ) 0 : 默认 (居左) 1 : 居左 2 : 居中 3 : 居右 </param>
/// <param name="content"></param>
/// <returns>TEXT 10,560,"ROMAN.TTF",0,12,12,"FONT ROMAN.TTF" </returns>
public static string TEXT(int x, int y, string font, int rotation, int x_multiplication, int y_multiplication, int alignment, string content)
{
return string.Format("TEXT {0},{1},\"{2}\",{3},{4},{5},{6},\"{7}\"\r\n",
dpi(x).ToString(),
dpi(y).ToString(),
font.ToString(),
rotation.ToString(),
x_multiplication.ToString(),
y_multiplication.ToString(),
alignment.ToString(),
content.ToString()
);
}
}
}
|
|