ZPL:二进制 B64 和压缩 Z64 编码

ZPL: Binary B64 and compressed Z64 encoding

也许有人可以帮我解决我的 Zebra ZPL 问题。 ZPL 手册并没有真正帮助我。 我想将二进制(使用 ZPL B64)和压缩二进制(使用 ZPL Z64)图像数据传输到打印机。

我找到了以下信息:

你们有人做过吗?

非常感谢。

The ZPL manual doesn't really help me.

告诉我吧!

  • 手册中提到的"LZ77"算法其实就是ZLIB格式。为此我使用了 http://zlib.net
  • 手册中提到的"CRC"其实就是CRC16-CCITT。我使用的代码:http://sanity-free.com/133/crc_16_ccitt_in_csharp.html.

    为了正确计算它:

    • 使用ZLIB压缩图片位(图片必须是PixelFormat.Format1bppIndexed,图片位最好用Bitmap.LockBits访问)。
    • 将压缩数据编码成Base64。 不允许有空格或换行符。
    • 将Base64字符串按照ASCII编码(System.Text.Encoding.ASCII.GetBytes(base64string))转换为字节数组。
    • 计算该字节数组的 CRC。 初始 CRC 值必须为零。

这两页在 Java 中包含有趣的代码,用于编写将图像文件编码为 Z64 的转换器:

http://www.jcgonzalez.com/img-to-zpl-online

https://gist.github.com/trevarj/1255e5cbc08fb3f79c3f255e25989a18

我写了第一个link的Javaclass的Python端口,形式为Python3class: https://github.com/ftheeten/python_zebra_adapter/blob/main/class_zebra.py

之后您可以使用 Python Pillow 库来生成要转换的图像。这种方法非常灵活,因为您可以使用任何具有 TTF 文件的字体。

例如

import socket
from PIL import ImageFont, ImageDraw, Image
import numpy as np
...

img=FUNCTION_GENERATING_A_PILLOW
zpl=Class_zpl()
zpl.set_compress(False)
zpl.set_blacklight_percentage(60)
str_label=zpl.process(img)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((PRINTER_IP, PORT_PRINTER))
s.sendall(str.encode(str_label))
#data = s.recv(1024)
s.close()