当前位置: 代码迷 >> C# >> 串口打印条码有关问题
  详细解决方案

串口打印条码有关问题

热度:91   发布时间:2016-05-05 02:38:20.0
串口打印条码问题
打印机是:酷道5803 安卓版 蓝牙打印机,支持ESC/POS打印指令,不知道是不是该打印机不支持条码的ESC指令还是什么问题,通过网上找的条码指令打印出来都是文字,并不是条码,很纠结,急!!!!!!!!!!!!!!!!!1[/u]
------解决思路----------------------
引用了Gma.QrCodeNet.Encoding自己网上找



        /// <summary>
        ///        ESC K 
        ///[名称]  打印点阵图形
        ///[格式] ASCII:ESC K n1 n2 …data…   十进制:27  75 n1 n2 …data… 
        ///十六进制: 1B   4B n1 n2 …data… 
        ///[说明] 
        ///该命令打印n1×8点阵图形。该图形的宽度为n1点,高度为8点。每一列的8个点可以由一个
        ///8位的字节来表示,最高位在上。
        ///n1,n2的数值代表一个16位的二进制数,n1为低8位字节,n2为高8位字节,表示ESC K 
        ///命令要打印的图形宽度为n2×256+n1。n2应是0或1,点数之和小于等于384,若超出则自动
        ///清除。n1应在1到该机型的每行最大点数之间。
        ///Data是该点阵图形从左到右每列的字节内容,字节数应等于n1。
        ///当图形的高度大于8点时,可按每8点行一个图形单元划分成多个单元。不足8点的用空点补
        ///齐。然后按顺序每个图形单元分别用ESC K命令打印出来,最后组成一个完整的图形。
        ///[注意] 
        ///当采用反向打印方式时,要按图形从下到上的顺序依次打印每个图形单元。
        /// </summary>
        /// <param name="width"></param>
        /// <param name="bitmap"></param>
        public void PrintBitmap(ushort width, byte[] bitmap)
        {
            byte[] data = new byte[bitmap.Length + 4];
            data[0] = 27;
            data[1] = 75;
            data[2] = (byte)width;
            data[3] = (byte)(width >> 8);
            Array.Copy(bitmap, 0, data, 4, bitmap.Length);
            _sender.SendData2Printer(data);
        }

        public void PrintBitmap(Bitmap bitmap)
        {
            if (bitmap.Width > 384) { throw new Exception("Width>384"); }
            ushort width = (ushort)bitmap.Width;

            for (int i = 0; i < bitmap.Height; i += 8)
            {
                byte[] bts = new byte[width];
                for (int j = 0; j < bitmap.Width; j++)
                {

                    for (int k = 0; k < 8; k++)
                    {
                        Color c = bitmap.GetPixel(j, k + i);
                        if (c.GetBrightness() < 0.3)
                        {
                            bts[j] = (byte)(bts[j] 
------解决思路----------------------
 (1 << k));
                        }
                    }

                }
                Return();
                PrintBitmap(width, bts);
            }
        }

        public void Print2DCode(int maxWidth, string content)
        {
            QrCode code = null;
            new QrEncoder(ErrorCorrectionLevel.H).TryEncode(content, out code);
            int pointWidth = maxWidth / code.Matrix.Width;

            var bars = TranslateFromMatrix(code.Matrix, pointWidth);

            var height = (code.Matrix.Width * pointWidth) / 8 +
                ((code.Matrix.Width * pointWidth) % 8 == 0 ? 0 : 1);
            var width = code.Matrix.Width * pointWidth;

            for (int r = 0; r < height; r++)
            {
                byte[] bts = new byte[width];
                for (int c = 0; c < width; c++)
                {
                    bts[c] = 0;

                    for (int i = 0; i < 8; i++)
                    {
                        if (r * 8 + i < width)
                        {
                            bts[c] = (byte)(bts[c] + ((bars[r * 8 + i, c] ? 1 : 0) << i));
                        }

                    }
                }

                PrintBitmap((ushort)(width), bts);
                Return();
            }

        }

        private bool[,] TranslateFromMatrix(BitMatrix matrix, int width)
        {
            bool[,] ret = new bool[matrix.Width * width, matrix.Width * width];
            for (int c = 0; c < matrix.Width; c++)
            {
                for (int r = 0; r < matrix.Height; r++)
                {
                    for (int cc = 0; cc < width; cc++)
                    {
                        for (int rr = 0; rr < width; rr++)
                        {
                            ret[c * width + cc, r * width + rr] = matrix[c, r];
                        }
                    }
                }
            }
            return ret;
        }


        public void Print2DCode(string content)
        {
            QrCode code = null;
            new QrEncoder(ErrorCorrectionLevel.H).TryEncode(content, out code);
            byte[,] bts = new byte[code.Matrix.Width, code.Matrix.Width * 8];

            for (int i = 0; i < code.Matrix.Height; i += 1)
            {
                for (int j = 0; j < code.Matrix.Width; j++)
                {
                    // if (i < 8 
------解决思路----------------------
 i >= 13 
------解决思路----------------------
 j < 8 
------解决思路----------------------
 j >= 13)
                    {
                        byte b = (byte)(code.Matrix[j, i] ? 255 : 0);
                        for (int k = j * 8; k < j * 8 + 8; k++)
                        {
                            bts[i, k] = b;
                        }
                    }
                }
            }

            byte[] bs = new byte[code.Matrix.Width * 8];
            for (int i = code.Matrix.Width - 1; i >= 0; i--)
            {
                for (int j = 0; j < code.Matrix.Width * 8; j++)
                {
                    bs[j] = bts[i, j];
                }
                PrintBitmap((ushort)(code.Matrix.Width * 8), bs);
                Return();
            }

        }

        /// <summary>
        ///       ESC E 
        ///[名称]  打印条型码
        ///[格式] ASCII: ESC  E  nq nc n1 n2 n3…nk NUL 
        ///十进制: 27   69  nq nc n1 n2 n3…nk 0 
        ///十六进制: 1B   45  nq nc n1 n2 n3…nk 00 
        ///[说明] 
        ///nq:条码第1条线离打印纸端的距离(点)。N的值应在0到64之间。
        ///nc:条码线纵向高度(点)。n的值应在1到255之间。
        ///nk:第k个条码线的参数:
        ///高4位(D7~D4)与前一个条码线之间的空白点数。n的值应在1到15之间。
        ///低4位(D3~D0)该条码线的宽度(点)。K为条码线数量,k的值应在1到15之间。
        ///[注意] 
        ///本命令只适用热敏系列。
        /// </summary>
        /// <param name="bardata"></param>
        /// <param name="nq"></param>
        /// <param name="nc"></param>
        public void PrintBarCode(byte nq, byte nc, byte[] bardata)
        {

            var bar = bardata.Select(a => (byte)a).ToArray();
            byte[] data = new byte[bar.Length + 5];
            data[0] = 27;
            data[1] = 69;
            data[2] = nq;
            data[3] = nc;
            data[data.Length - 1] = 0;
            Array.Copy(bar, 0, data, 4, bar.Length);
            _sender.SendData2Printer(data);
        }
  相关解决方案