我想向Zebra打印机(目前为GK420t)发送ZPL指令。我正在打印50毫米x 20毫米的标签。我想在标签的左上角印一个标志(小~5mm x 5mm的图像)。
我想知道我应该采取哪些步骤来做到这一点。
我一直在阅读和尝试ZPL手册中的一些内容,但我真的不明白它是如何工作的,也找不到一个工作示例。
看起来我必须先将图像"加载"到打印机中(在所谓的"存储区"/DRAM?中),然后打印。
.GRF
文件扩展名在手册中被多次提及。我找不到将.PNG或.BMP图像转换为.GRF文件的工具。我读到.GRF文件是图形图像的ASCII HEX表示。。。但这对我的工作没有帮助。
我可以使用"斑马设置实用程序",通过"下载字体和图形",选择任何可用的.MMF文件,添加.BMP图片,下载到打印机并打印测试页,在标签上打印徽标。但直到现在,我还不能使用ZPL的指令。
我还想知道我应该使用什么样的最佳尺寸,因为我需要一个~5mm x 5mm的小图像来打印在标签上。我打印的图像是一个40px x 40px的图像。此外,如果我必须从原始图像制作一个.GRF文件,这个文件的类型应该是什么(.BMP、.PNG、.JPG)?
你能告诉我如何进行吗?
听起来你有一些现有的ZPL代码,你只想添加一个图像。
如果是这种情况,最简单的解决方案可能是转到Labelary在线ZPL查看器,将您的ZPL粘贴到查看器中,单击"添加图像",然后上传您想要添加到ZPL的图像。
这应该通过添加您需要的图像ZPL命令来修改您的ZPL,然后您可以调整位置等。
这里是另一个选项:我在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文件
只需安装ZebraDesigner,创建一个空白标签,在模板中插入一个图像对象,并添加所需的徽标图像。
打印以归档此标签(*.prn文件),并使用Notepad++打开最近创建的文件(如果使用打开并保存,MS Notepad将破坏数据)。找到一个看似随机的巨大字符串,就有了你的图像数据。注意不要丢失这些字符中的任何一个,包括控件字符,因为整个字符串是图像的文本表示(如果它是base64的话)。
Tip0:随时准备好ZPLII程序员指南,您需要/想要检查ZebraDesigner是否将图像发送到内存或直接发送到打印机缓冲区。
Tip1:在将徽标添加到标签并获取文本之前,请准备图像使其变灰(记得检查打印机的抖动配置!),或者在我的情况下,为纯黑白(最佳效果IMHO)。图像可以是彩色的,ZebraDesigner将使打印机在转换为命令和文本之前将图像转换为灰度级。
我创建了一个PHP脚本,将PNG图像转换为.GRF,类似于Josh Mayberry的image2grf.py:https://gist.github.com/thomascube/9651d6fa916124a9c52cb0d4262f2c3f
它使用PHP的GD图像函数,因此可以使用GD可以打开的所有文件格式。经过小的修改,可以使用Imagick扩展,但GD的性能似乎更好。
我今天不得不再次解决这个问题。在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
我需要做的是将其重新格式化为CCD_ 3,这样我就可以用CCD_。打印运行后,我需要使用:^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
试试codeproject的sharpzebra项目。作为项目一部分的测试程序会打印一张图形,我知道这至少在ZM400 上有效。。当它改变后,点击工作区和一个对话框iwll apear。。。所以在那里选择图像,这样你就可以看到你想在打印机上打印的图像,我使用GT800,所以对我来说,我希望这能帮助你