发新帖

[C#/ASP.NET] [其他] 标签设计语言ZPL快速入门

零下一度 2023-3-23 791

最近由于工作需要,想快速入门学习一下ZPL语言,可逛了一圈度娘都没有找到什么好的入门指南,无奈自己提笔操刀,潦草的写一点,就当是学习笔记了。本人也还在学习当中,如有错误,欢迎指正。

先简单介绍一下ZPL语言。ZPL是Zebra Programming Language的缩写,命名简单粗暴,字面意思就是Zebra公司开发的一种标签编程语言,到现在已经更新到第二代了,据说被90%的世界500强公司所使用,总体来说还是一种比较先进的编程语言。

声明一下,本文中的例子来源于An Introduction to ZPL,部分图片来源于https://support.zebra.com/cpws/docs/zpl/13979l-010_ra.pdf

下面正式开始


引入

假设现在我们希望为一件商品创建一张标签,标签含有如下内容:

商品名

条形码

价格

黑色边框

显然,我们需要告诉打印机以下一些对应信息:

商品名的内容、价格是多少、各自在标签上的位置,以及字体大小

条形码的内容、编码规则,以及在标签上的位置

黑色边框的形状、大小、粗细,以及在标签上的位置

使用ZPL实现这一切非常简单。先放一个例子


以及它对应的代码

^XA
^LH0,0
^FO240,50^A0,50^FDApple Pen^FS
^FO60,120^BCN,60,N,,,^FDpen pineapple apple pen^FS
^FO310,190^A0,25^FD$99.99^FS
^FO25,25^GB650,200,3^FS
^XZ

下面我们一步步来分析一下这段代码。


基本编码规则

首先给出一些ZPL最基本的编码规则

ZPL是基于指令的。代码有且仅有两个组成部分:指令和指令参数。

ZPL使用^与~作为指令指示符,所有的指令都以他们为开头,并在后面紧跟指令内容,如^A。 指令长度为1-2个字母,不区分大小写(从习惯上来讲,指令通常采用大写字母来表示)。

每个指令后面跟着指令参数。参数可以是一个也可以是多个,互相之间用逗号(,)隔开。

一般情况下,空格和换行在ZPL代码中会被忽略,但有一些例外(如^FD指令)。

ZPL使用坐标系对标签内容进行定位,空间坐标原点在标签左上角,x轴指向右,y轴指向下。


此外,在一张标签中,ZPL代码总是以^XA开始,以^XZ结尾,形式大概就是^XA+标签内容+^XZ。ZPL允许在一段代码中描述多张标签,识别规则也很简单,一堆代码里面有几段^XA+标签内容+^XZ,就是有几张标签。


在上面的例子中,第一行和第七行就分别对应了标签的起始符和终止符。


1、标签设置

ZPL语言在^XA起始符之后和标签正文开始之前,经常会有一些对标签和打印机参数进行配置的语句,作为标签解析的准备部分。就好比开油锅之前先把葱姜蒜给备齐了。当然,这部分并不是必须的,但在正式的标签上还是经常存在。


这里举几个简单的例子,比如上面例子中的第二行使用的^LH(Label Home)指令就是用来设置标签坐标系原点的。上面我们提到ZPL使用坐标对标签内容进行定位,而默认的坐标原点就在标签左上角(0,0)的位置。如果你不想使用默认值,而想自己设置坐标原点,就可以使用^LH指令。而在ZPL header部分设置完新的坐标原点之后,接下来所有的指令就会在新定义的远点下执行了。显然,直观来看,原点偏移后,标签上的所有内容也会跟着移动。


比较常见的还有^LL(Label Length)指令定义标签长度,^PW(Print Width)指令定义打印宽度,^PO(Print Orientation)定义标签方向,^CI(Change International Encoding)指令定义全文解码规则等等。


^LH(Label Home)//坐标系原点

^LL(Label Length)//定义标签长度

^PW(Print Width)//定义打印宽度

^PO(Print Orientation)//定义标签方向

^CI(Change International Encoding)//定义全文解码规则


2、标签坐标系统

ZPL使用坐标系对标签内容进行定位,空间坐标原点在标签左上角,x轴指向右,y轴指向下(有点类似二维数组)。使用坐标就可以轻松定位标签上每一个字符串的具体位置,因此ZPL中的很多指令都是使用坐标作为指令参数的。

坐标的单位是点(dot),通常默认对应每台打印机的最小分辨率(打印机能打出来的最小的点)。比如,最长见的打印机分辨率是8dpmm(dots per millimeter),那它对应的每个坐标单位就是1mm/8=0.125mm。通常打印机常见的分辨率还有150dpi(dots per inch),300dpi等。

需要特别注意的是,ZPL的坐标系是以点作为单位的,而不同打印机的分辨率可能不同,因此同一段ZPL代码在不同分辨率的打印机上打出来的的结果是不一样的。比如打印一条100个点长的线段,在一台分辨率是10dpmm的打印机上打出来的线段长度为10mm,而在一台分辨率是5dpmm的打印机上打出来的长度则是20mm。虽然ZPL也有^MU等指令可以对单位坐标对应长度进行缩放,但Zebra官方并不推荐这样做,通常编码的时候也不会这样做。其实这也不难理解,因为人家最小分辨率摆在那儿了,你让它打1.5个点,人家也打不出来啊!

结合我们上面的例子来看一看,上面代码的3-6行,每行都是以^FO指令开头的。简单来说,^FO(Field Origin)指令定位了一个输入区域,你可以在标签上你定义的输入区域里面输你想输的东西。^FO指令后面需要跟三个个参数,分别是x坐标,y坐标,以及z对齐方式,指令输入格式为^FO x, y, z。对齐方式一般默认就可以了。而xy坐标则定义了当前输入区域的左上角在全局中的坐标。换句话说,定义了FO的坐标之后,后面你想输入的东西就会以该点为基准向右或向下延申(取决于你字是横着还是竖着),输入的东西越多,延申的也就越多。比如说第三行的代码,^FO60,120 就是在(60,120)这个点的基础上向右下延申的。

与^FO指令功能相类似的还有^FT指令。但与^FO指令总是处于输入框左上角不同的是,^FT指令所定义的点在输入框中的相对位置是根据文本方向而变化的。具体来说,^FT指令所定义的点总是位于文本正方向的左下方,或者说,^FT指令指令定义了文本内容的起始点。

来看一个简单的例子就能明白。先来看^FO指令:

^XA
^FX FO command defines left up corner of the text box.
^FO500,500^A0N,80,80^FDAppel Pen^FS
^FO500,500^A0B,80,80^FDAppel Pen^FS
^XZ

对应的输出结果为:


可以看到,无论文字方向是横的还是竖的,^FO指令永远定义了文本框的左上角。

再来看看FT指令:

^XA
^FX FT command defines the starting point of the text.
^FT500,500^A0N,80,80^FDAppel Pen^FS
^FT500,500^A0R,80,80^FDAppel Pen^FS
^FT500,500^A0I, 80,80^FDAppel Pen^FS
^FT500,500^A0B,80,80^FDAppel Pen^FS
^XZ

对应的输出结果为:


可以看到,^FT指令定义了文本内容的起始点,其在文本框中的相对位置和文本方向是有关的。如果文本是从左往右的,那么起始点就在文本框左下方。而如果文本是从下往上的,那么起始点就在文本框右下方。

事实上,由于打印机尺寸的限制,我们平时设计标签时大多数时候都是竖着设计的--标签的窄边在下,打印的时候窄边先出来,沿着长边慢慢向后打印。因此,很多情况下标签上的文字方向都是从下到上(或者从上到下)的。这个时候使用^FO指令就显得不是那么方便了。而^FT指令就很好的解决了这个问题。


^FO(Field Origin)//定位了一个输入区域,设置文本标签的位置。  ^FO指令后面需要跟三个个参数,分别是x坐标,y坐标,以及z对齐方式,指令输入格式为^FO x, y, z

^FT //指令定义了文本内容的起始点。 



3、文字输入

定义完了文本在标签中的位置后,在输入文本之前,你还需要告诉系统你输入文本的字体以及大小。这是通过指令^A来完成的。其指令格式为^Afo,h,w,其中f定义字体,o定义文字方向,h和w定义文本的高度和宽度。

关于字体,ZPL语言给出了16种标准字体模板:


当然,用户也可以自行上传字体,这里就不详细展开了。

关于文字方向,o接受4种参数输入:


N = 从左往右

R = 从下往上

I = 从右往左(颠倒)

B = 从上往下

关于高宽,是字体本身的高度和宽度,单位也是点,不填的话就是默认值。填的值不能小于默认字体大小,否则没用。其中字体大小比较自由的是0字体,可以自由缩放,且如果只填高度,宽度会根据高度值自动进行匹配。

定义完文字宽度,接下来就可以输入文字了。一般文本字符串输入,可以使用^FD指令来完成。^FD(Field Data)指令只有一个输入参数,那就是你想输入的字符串。这样配合^FO和^A指令,就可以完成一次在标签上的输出了。

最后,还需要一个^FS指令来告诉系统,对当前输入区域的操作已经完成,可以关闭该区域了。^FS(Field Seperator)指令没有指令参数。


指令:^A

格式:^Afo,h,w     //其中f定义字体,o定义文字方向,h和w定义文本的高度和宽度

解释:

文字方向,o接受4种参数输入:

N = 从左往右

R = 从下往上

I = 从右往左(颠倒)

B = 从上往下



4、绘制条形码/二维码

条形码其实是另一种信息输出的方式--只不过我们看不懂。因此,对于绘制条形码的指令和输出文本类似:在标签上规定输入域->规定输入字体和大小(输入信息编码规则)-> 规定输入信息 ->结束输入。

因此,第四行代码的开头和结尾指令和第三行一样,先使用^FO规定输入域起始点坐标,最后用^FS关闭输入域。

再来看看中间部分。中间部分规定了输入信息的编码规则。^BC对应了条形码Code 128,其指令格式为^BC o,h,f,g,e,m, 来看看含义:

o - 方向。可选值为NRIB,和上面一样。

h - 条形码高度,单位为点

f - 是否打印条形码内容,可选值Y或者N,默认是Y,即会把条形码中的内容显示在条形码下方

g - 条形码内容打印位置,可选值为Y或N,默认是N。等等...只能把条形码内容打印在条形码下方吗,想打印在条形码上面怎么办?这里改成Y就可以了!

e, m - 不了解,不关心。

设定完了条形码格式,接下来就可以告诉系统条形码码里要存点啥了。这里的文本信息输入也可以采用^FD指令来完成,上面说过,这里就不赘述了。

标签上除了条形码外,非常常见的还有二维码。它对应的操作指令为^BQ,其指令格式为^BQ a,b,c,有三个参数,分别来看看:

a - 方向。可选值为NRIB,和上面一样。但其实二维码本身自带定位符,所以它的朝向无关痛痒,横的竖的斜的都能扫。

b - model。可选值为1和2,和QR码的标准有关,2会比1更好识别一点。默认是2,一般保留默认值就可以。

c - 放大系数。可选1-10,数字越大二维码就越大。

不过比一维码复杂的是,二维码编码的时候需要^FD指令额外的给出一些信息:

^FD

<Error Collection Level><Input Mode>,

<QR Code Content>

^FS

可以看到,在^FD中我们需要给出两位额外的指令符,其中

Error Collection Level - 纠错能力。ECC标准中规定了4档二维码纠错能力,分别为L(7%), M(15%), Q(25%) 和H(30%),纠错百分比越高,纠错能力越强。二维码纠错一般采用里德-所罗门码(RS码),基本原理简单来说就是把需要编码的信息进行分段,并向每段中添加冗余信息后再进行保存。

Input Mode - 输入模式。支持参数A或M,对应自动(默认)或者手动。如果选择M,则还需要再额外加一位控制输入,告诉系统需要编码的是什么东西。这通常用于需要中文输入的情况。

也来看一个简单的例子:

^XA

^FO500,500^BQN,2,10^FDQA,Pen Pineappel Apple Pen^FS

^FO570,830^A0N,40,40^FDApple Pen^FS

^XZ

对应输出:


绘制图形

再来看看怎么绘制图形。绘制图形其实就更简单啦,因为都不需要文本输入了--告诉系统在哪里画,画个啥就好了。

在上面的例子中,我们想要话画个框框把所有信息都框起来。这里用到的是^GB(Graphic Box)指令,其指令格式为^GB w,h,t,c,r,来看一看:

w,h - 矩形的宽和高,单位是点

t - 线宽,单位还是点

c - 颜色,可选值W和B,White or Black。ZPL一个很大的优势就是它支持黑底标签的编写,所以会有画白线的选项。这里容我吐槽一句,公司最近在做特斯拉的标签,就是因为特斯拉标签是黑底的所以才会转投ZPL,马斯克我谢谢你。

r - 圆角度数,可选值0-8,默认是0,也就是标准矩形。

也不需要什么别的指令,开头^FO规定输入域起始点坐标,中间^GB画图,最后用^FS关闭输入域就好了,是不是很easy。

需要特别说明的是,^GB指令也可以用来画线段,只要将宽或者高设置成1就可以了。比如^GB250,1,3,B,0就画了一条长250个点,宽3个点的线段。

此外,常见的画图指令还有^GC圆,^GD斜线等。


6、其他指令

上面的内容当然只是冰山一角啦,入个门勉强算是可以吧,至少应该可以看懂一些ZPL文档了。其实个人感觉ZPL不难,稍微有点信息学基础,简单入个门,剩下的就可以通过自学掌握(欢迎打脸)。

Naja~ 好在Zebra公司对于ZPL语言也有非常详细的说明文档,如果还有别的需要,戳链接:

https://support.zebra.com/cpws/docs/zpl/13979l-010_ra.pdf

最后,再附上一个ZPL代码可视化的网站,非常适合练习:

Labelary Online ZPL Viewer

当然,市面上也有很多标签设计的辅助软件,不过那就不是本文讨论范围啦。

以上。


@知乎@风度翩翩





最新回复 (0)
返回
零下一度
主题数
931
帖子数
0
注册排名
1