用户
 找回密码
 立即注册

1

主题

4

帖子

139

积分

注册会员

Rank: 2

积分
139
发表于 2019-4-15 21:15:12
本帖最后由 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()
              );
        }

    }
}





使用道具 举报 回复
发表于 2019-4-15 22:00:56
貌似是打印机无法解码导致的...
使用道具 举报 回复 支持 反对
发表于 2019-4-15 22:01:48
不会删帖.管理员大大帮忙删掉吧.
使用道具 举报 回复 支持 反对
就不删
---分割线---
这个帖子也可以给其他人以参考帮助
使用道具 举报 回复 支持 反对
发表于 2019-4-23 15:08:47
亲测可用
使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册