打印机是:酷道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);
}