斑马打印机-不打印PNG流*提供我自己的答案*



我想我很快就能把这个打印出来了。然而,它仍然不是。没有抛出异常,它似乎击中了斑马打印机,但什么也没有。这是一个很长的机会,因为我想大多数人都和我一样,对它知之甚少。任何人给予的任何帮助,无论多么小,都会受到欢迎,我正在失去活下去的意志。

using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (var stream = new MemoryStream())
{
if (responseStream == null)
{
return;
}
responseStream.CopyTo(stream);
stream.Position = 0;
using (var zipout = ZipFile.Read(stream))
{
using (var ms = new MemoryStream())
{
foreach (var e in zipout.Where(e => e.FileName.Contains(".png")))
{
e.Extract(ms);
}
if (ms.Length <= 0)
{
return;
}
var binaryData = ms.ToArray();
byte[] compressedFileData;
//  Compress the data using the LZ77 algorithm.
using (var outStream = new MemoryStream())
{
using (var compress = new DeflateStream(outStream, CompressionMode.Compress, true))
{
compress.Write(binaryData, 0, binaryData.Length);
compress.Flush();
compress.Close();
}
compressedFileData = outStream.ToArray();
}
//  Encode the compressed data using the MIME Base64 algorithm.
var base64 = Convert.ToBase64String(compressedFileData);
//  Calculate a CRC across the encoded data.
var crc = Calc(Convert.FromBase64String(base64));
//  Add a unique header to differentiate the new format from the existing ASCII hexadecimal encoding.
var finalData = string.Format(":Z64:{0}:{1}", base64, crc);
var zplToSend = "~DYR:LOGO,P,P," + finalData.Length + ",," + finalData;
const string PrintImage = "^XA^FO0,0^IMR:LOGO.PNG^FS^XZ";
try
{
var client = new System.Net.Sockets.TcpClient();
client.Connect(IpAddress, Port);
var writer = new StreamWriter(client.GetStream(), Encoding.UTF8);
writer.Write(zplToSend);
writer.Flush();
writer.Write(PrintImage);
writer.Close();
client.Close();
}
catch (Exception ex)
{
// Catch Exception
}
}
}
}
}
}
private static ushort Calc(byte[] data)
{
ushort wCrc = 0;
for (var i = 0; i < data.Length; i++)
{
wCrc ^= (ushort)(data[i] << 8);
for (var j = 0; j < 8; j++)
{
if ((wCrc & 0x8000) != 0)
{
wCrc = (ushort)((wCrc << 1) ^ 0x1021);
}
else
{
wCrc <<= 1;
}
}
}
return wCrc;
}

下面的代码为我工作。问题是命令,这些是非常非常重要的!下面是我使用的命令的概述,更多信息可以在这里找到

PrintImage

^ XA^XA命令用于ZPL II代码的开头。它是左括号,表示新标签格式的开始。该命令被替换为单个ASCII控制字符STX (control- b,十六进制02)。有效的ZPL II格式要求标签格式应该以^XA命令开始,以^XZ命令结束。

^ FO字段原点说明^FO命令设置相对于标签home (^LH)位置的字段原点。^FO通过定义与旋转无关的x轴和y轴上的点来设置场区域的左上角。格式^福克斯,y, z

  • x = x轴位置(点)接受范围:0 ~ 32000默认值值:0
  • y = y轴位置(点)取值范围:0 ~ 32000默认值:0
  • z = justification参数z为only固件版本V60.14支持。x, V50.14。X,或者更晚。接受取值范围:0 =左对齐1 =右对齐2 = auto(依赖于脚本)默认值:最后接受^FW^FW默认值

^我^IM命令直接将图像从存储区移动到位图中。该命令与^XG命令(Recall Graphic)相同,只是没有大小参数。格式^ IMd: o.x

  • d =存储对象的位置。取值范围:R:、E:、B:、A:默认值:搜索优先级
  • o =对象名称取值范围:1 ~ 8个字母数字字符默认值:如果不指定名称,则使用UNKNOWN
  • x =扩展名固定值:.GRF, .PNG

^ FS^FS命令表示字段定义的结束。另外,^FS命令也可以作为单个ASCII控制码SI (control - o,十六进制0F)发出。格式^ FS

^ XZ结束格式说明^XZ命令为结束(右)括号。它表示标签格式的结束。当接收到这个命令时,打印一个标签。该命令也可以作为单个ASCII控制字符ETX (control - c,十六进制03)发出。格式^XZ注释标签格式必须以^XA命令开始,以^XZ命令结束,才能成为有效的ZPL II格式。

zplToSend

^ MN媒体跟踪描述该命令指定正在使用的媒体类型和以点为单位的黑色标记偏移量。此项目符号列表显示与此命令关联的媒体类型:

  • 连续介质-该介质没有分隔标签的物理特征(如卷筒纸、缺口、穿孔、黑色标记)。标签长度由^LL命令决定。
  • 连续媒体,可变长度-与连续媒体相同,但如果打印标签的部分超出定义的标签长度,则标签尺寸将自动扩展以包含它们。此标签长度扩展仅适用于当前标签。注意,^MNV仍然需要使用^LL命令来定义所需的初始标签长度。
  • 非连续介质-该介质具有某种物理特征(如卷筒纸、缺口、穿孔、黑色标记)来分隔标签。

格式^ MNa, b

  • a =正在使用的介质接受值:N =连续介质Y =非连续介质web传感d, e W =非连续介质web传感d, e M =非连续介质标记传感a =校准时自动检测介质类型d, f V =连续介质,可变长度g默认值:必须输入或忽略
  • b =以点为单位的黑标记偏移设置媒体标记相对于文档之间的分隔点的预期位置。如果设置为0,则期望在分隔点找到媒体标记。(即穿孔、切割点等)所有数值均以圆点表示。除非a参数设置为m,否则该参数将被忽略。如果缺少该参数,则使用默认值。可接受值:仅直接热敏打印机-80 ~ 283 - 600 dpi打印机240 ~ 566 - KR403打印机75 ~ 283 -所有其他打印机120 ~ 283默认值:0

~ DY下载对象说明~DY命令以任何支持的格式下载图形对象或字体到打印机。这个命令可以代替~DG来获得更多的保存和加载选项。~DY是在固件版本高于X.13的打印机上下载TrueType字体的首选命令。它比~DU快。~DY命令还支持下载无线证书文件。Format ~DYd:f,b,x,t,w,data

注意使用证书文件时,您的打印机支持:—使用PEM格式的证书文件。—使用客户端证书和私钥作为两个文件,分别下载。- EAP-FAST使用可导出的PAC文件。- Zebra推荐使用Linear sty

  • d =文件位置。nrd和。pac文件驻留在固件版本V60.15的E:上。x, V50.15。X,或者更晚。取值范围:R:、E:、B:、A:默认值:R:
  • f =文件名取值范围:1 ~ 8个字母数字字符默认值:如果不指定文件名,则使用UNKNOWN
  • b =在数据字段中下载的格式。tte和。ttf仅在固件版本V60.14中支持。x, V50.14。X,或者更晚。取值范围:A = uncompressed (ZB64, ASCII) B = uncompressed(。TTE, .TTF,二进制)C = ar压缩(仅适用于Zebra的BAR-ONE®v5) P =便携式网络图形(.PNG) - ZB64编码默认值:必须指定一个值

clearDownLabel

^ ID^ID命令用于删除存储区域中的对象、图形、字体和存储格式。对象可以选择性删除,也可以分组删除。该命令可以在打印格式中使用,以便在保存新对象之前删除对象,也可以在独立格式中使用,以便删除对象。

图像名称和扩展名支持使用星号(*)作为通配符。这允许您轻松地删除选定的对象组。格式^ IDd: o.x

  • d =存储对象的位置。取值范围:R:、E:、B:、A:默认值:R:
  • o =对象名称。取值范围:1 ~ 8个字符的任意名称。默认值:如果未指定名称,则使用UNKNOWN
  • x = extension接受值:任何符合Zebra约定的扩展名默认值:.GRF

    const string PrintImage = "^XA^FO0,0,0^IME:LOGO.PNG^FS^XZ";
    var zplImageData = string.Empty;
    using (var response = request.GetResponse())
    {
    using (var responseStream = response.GetResponseStream())
    {
    using (var stream = new MemoryStream())
    {
    if (responseStream == null)
    {
    return;
    }
    responseStream.CopyTo(stream);
    stream.Position = 0;
    using (var zipout = ZipFile.Read(stream))
    {
    using (var ms = new MemoryStream())
    {
    foreach (var e in zipout.Where(e => e.FileName.Contains(".png")))
    {
    e.Extract(ms);
    }
    if (ms.Length <= 0)
    {
    return;
    }
    var binaryData = ms.ToArray();
    foreach (var b in binaryData)
    {
    var hexRep = string.Format("{0:X}", b);
    if (hexRep.Length == 1)
    {
    hexRep = "0" + hexRep;
    }
    zplImageData += hexRep;
    }
    var zplToSend = "^XA" + "^FO0,0,0" + "^MNN" + "~DYE:LOGO,P,P," + binaryData.Length + ",," + zplImageData + "^XZ";
    var label = GenerateStreamFromString(zplToSend);
    var client = new System.Net.Sockets.TcpClient();
    client.Connect(IpAddress, Port);
    label.CopyTo(client.GetStream());
    label.Flush();
    client.Close();
    var cmd = GenerateStreamFromString(PrintImage);
    var client2 = new System.Net.Sockets.TcpClient();
    client2.Connect(IpAddress, Port);
    cmd.CopyTo(client2.GetStream());
    cmd.Flush();
    client2.Close();var clearDownLabel = GenerateStreamFromString("^XA^IDR:LOGO.PNG^FS^XZ");
    var client3 = new System.Net.Sockets.TcpClient();
    client3.Connect(IpAddress, Port);
    clearDownLabel.CopyTo(client3.GetStream());
    clearDownLabel.Flush();
    client3.Close();
    }
    }
    }
    }
    }
    }
    

一旦你知道怎么做就很容易了。基于base64的斑马ZPL标志示例

Python3

import crcmod
import base64
crc16 = crcmod.predefined.mkCrcFun('xmodem')
s = hex(crc16(ZPL_LOGO.encode()))[2:]
print (f"crc16: {s}")

文档不完整

最新更新