如何在标签上使用Zebra打印机打印logo并发送ZPL指令

12
我想给Zebra打印机 (当前使用GK420t) 发送ZPL指令。 我要打印50mm x 20mm的标签。 我想在标签的左上角打印一个小的 ~5mm x 5mm 的图片。
我想知道应该遵循哪些步骤来完成这个过程。 我已经阅读并尝试了一些ZPL手册中的东西,但我真的不理解它是如何工作的,并且找不到可行的示例。
看起来我首先需要在打印机中“加载”图片(在所谓的“存储区”/DRAM中?),然后再进行打印。
手册中多次提到 .GRF 文件扩展名。 我找不到将 .PNG 或 .BMP 图像转换为 .GRF 文件的工具。 我读到 .GRF 文件是图形图像的 ASCII HEX 表示…但这并没有帮助我完成工作。
我可以使用“Zebra设置实用程序”通过“下载字体和图形”,选择任何可用的 .MMF 文件、添加 .BMP 图片、下载它 [到打印机] 并打印测试页来在标签上打印标志。 但到目前为止,我还无法使用 ZPL 指令完成此操作。
我还想知道,考虑到我需要在标签上打印一个小的 ~5mm x 5mm 的图片,最佳尺寸是什么。 我打印的图片尺寸为 40px x 40px。 此外,如果我必须从原始图像创建 .GRF 文件,那么该文件的类型应该是什么(.BMP、.PNG、.JPG)?
请指导我如何操作?

我认为我需要的是一个实用程序,它将获取原始图像并创建其字节表示(.GRF文件?)。我似乎找不到这个工具。 - Léa Massiot
8个回答

27

看起来您有一些现有的ZPL代码,而您想做的只是在其中添加一个图像。

如果是这种情况,最简单的解决方案可能是转到Labelary在线ZPL查看器,将您的ZPL粘贴到查看器中,点击“添加图像”,并上传您想要添加到ZPL的图像。

这将通过添加所需的图像ZPL命令来修改您的ZPL,您可以调整其位置等参数。


6

这里还有一个选择:我用Python创建了自己的图像转.GRF转换器,可以随意使用。

from PIL import Image, ImageOps
import re
import itertools
import numpy as np

# Use: https://www.geeksforgeeks.org/round-to-next-greater-multiple-of-8/
def RoundUp(x, multiple_of = 8):
    return ((x + 7) & (-1 * multiple_of))

def image2grf(filePath, width = None, height = None, rotate = None):
    image = Image.open(filePath).convert(mode = "1")

    #Resize image to desired size
    if (width != None):
        size = (width, height or width)
        if (isinstance(size[0], float)):
            size = (int(size[0] * image.width), int(size[1] * image.height))

        #Size must be a multiple of 8
        size = (RoundUp(size[0]), RoundUp(size[1]))


        # image.thumbnail(size, Image.ANTIALIAS)
        image = image.resize(size)

    if (rotate != None):
        image = image.rotate(rotate, expand = True)

    image_asArray = np.asarray(np.asarray(image, dtype = 'int'), dtype = 'str').tolist()
    
    bytesPerRow = len(image_asArray[0])
    nibblesPerRow = bytesPerRow // 4
    totalBytes = nibblesPerRow * len(image_asArray)

    #Convert image to hex string
    hexString = "".join(
        format(int("".join(row[i*4:i*4 + 4]), 2) ^ 0xF, "x")
        for row in image_asArray
        for i in range(nibblesPerRow) 
    )

    #Compose data
    data = "~DGimage," + str(totalBytes // 2) + "," + str(nibblesPerRow // 2) + "," + hexString

    #Save image
    fileHandle = open(r"labelPicture.grf", "w")
    fileHandle.write(data)
    fileHandle.close()

if __name__ == '__main__':
    # image2grf(r"warning.bmp")
    image2grf(r"pallet_label_icons.png", rotate = 90)

编辑:我更新了上面的代码,使用了我的新转换方法,可以生成更高分辨率的GRF文件。


Bug ?: 在第26行出现了 NameError: name 'totalBytes' is not defined 的错误...所以我用之前定义的 bytesPerRow 替换了 totalBytes,只是因为这样似乎有意义。Et voilá,没有更多的错误,.GRF 文件正在生成,我可以用编辑器打开它,但是 .GRF 格式似乎已经损坏了。没有任何查看器/转换器能够处理它而不出错。 :-( - ddlab
@ddlab 哎呀!看起来我的脚本缺少一行。好发现。我已经更新了答案。 - Kade
感谢您的努力,但仍然没有成功。我添加了ZPL代码,图像正在打印,但仍然混乱。以下是ZPL文件的代码片段:您的代码(文件名已调整)~DGR:AVATAR.GRF,3485,20,aed89d2522912245b40e2524a4...,接着是这一行 ^XA^FO20,20^XGR:AVATAR.GRF,1,1^FS^XZ。您可以尝试这个吗? - ddlab
@ddlab 看起来你的代码由于字符长度被截断了。你能发邮件给我吗?我会在下一个评论中发布我的电子邮件地址,以便稍后删除它。 :) 我会帮助你解决问题- 然后将需要更改的答案发布上去,以便其他人也可以受益。 - Kade
1
当我们按照上面所写的方式运行代码时,它对他起作用了。 - Kade
1
感谢您对代码进行纠正的努力。现在它已经运行了,加1。 - ddlab

3

只需安装 ZebraDesigner,创建一个空白标签,在模板中插入图像对象并添加所需的 logo 图像。

将此标签打印到文件(*.prn 文件),然后使用 Notepad++(如果使用 MS Notepad 打开并保存,则会破坏数据)打开最近创建的文件。找到一大串看似随机的字符,那里就是您的图像数据。小心不要丢失任何这些字符,包括控制字符,因为整个字符串是图像的文本表示形式(如果它是 base64,则是这样)。

提示0: 始终手边备有 ZPLII 程序员指南,您需要/想要检查 ZebraDesigner 是否将图像发送到内存还是直接发送到打印机缓冲区。

提示1: 在向标签添加徽标并获取文本之前,准备图像使其灰度化(记得检查打印机抖动配置!)或者如我的情况一样,纯黑色和白色(我认为是最佳结果)。图像可以着色,ZebraDesigner 将通过将图像转换为灰度图像再转换为命令和文本使其适用于打印机。


1

我今天又不得不重新弄清楚这个问题。在ZPL代码中,您可以输出每个单独标签的图形字节(这意味着打印几千张标签时会有大量附加数据),或者您可以先定义图像,然后引用它。

我使用了在线ZPL查看器,以减少测试时打印的标签数量。我使用的网址如下: http://staging.advanced-technology-group.com/ 以下是另一个具有相同功能的网址: http://labelary.com/viewer.html

这些网站(目前)都具有“添加图像”功能。这将把PNG文件转换成ZPL所使用的GRF格式(如果需要自己生成这些字节,请参考其他答案)。

对于每个标签输出字节

使用“添加图像”功能将生成一个命令和图形字节,看起来像:

^FO50,50^GFA,11118,11118,17,,<lots of data>

您可以调整FO,以便告诉打印机图形的位置。 对于较短的运行/较小的图片/您急需完成,这应该是可以接受的。

下载一次图像,然后引用

这就是我不得不做的事情,所以我需要稍微重新排列一下字节(好玩的双关语?)。 ^GF命令代表图形字段:^GFa,b,c,d,数据。

a: A|B (A, non-binary, B = binary)
b: number of bytes transmitted
c: number of bytes comprising the graphic format
d: number of bytes per row

我需要做的是将其重新格式化为~DGR:000.GRF,11118,17,,,以便我可以使用^XGR:000.GRF,1,1引用它。打印运行后,我需要再次从内存中删除图形:^ID000.GRF

~DGd:o.x,t,w,data的属性意义如下:

d: memory destination - R for RAM
o: image name (1-8 alphanumeric chars)
x: filename extension, always GRF
t: number of bytes in the graphic
w: number of bytes per row

所以我把: ^FO50,50^GFA,11118,11118,17,,<data> 转换成了: ~DGR:000.GRF,11118,17,,<data>

这个定义要放在标签定义之前,所以:

~DGR:000.GRF,11118,17,,<data>
^XA (start of label)
...
^FT360,700^XGR:000.GRF,1,1^FS <-- this outputs the graphic
...
^XZ (end of label)
^ID000.GRF

1

代码中没有指定许可证...我们可以复制、修改和用于任何目的吗? - TheStoryCoder

0
尝试使用codeproject的sharpzebra项目。该项目的测试程序可以打印图形,我知道这至少在ZM400上有效。

0

进入“对象”==>“图片”,您的光标将变成其他东西...当它改变时,转到工作区并出现对话框...然后在那里选择图像,这样您就可以看到想要打印在打印机上的图像。我正在使用GT800,所以我就这样做了,希望这能帮助到您。


0
使用ZebraNet Bridge企业软件将BMP文件转换为GRF文件格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接