ZPL如何使条形码(Code 128)居中

16

我希望了解如何将条形码Code 128居中对齐。您应该能够看到图片目前是左对齐的。 Label

我的ZPL代码:

^XA
^LH10,10
^FO0,0^XGE:SWESE001.GRF^FS
^FO440,0^XGE:SWESE000.GRF^FS
^FO0,70^FB550,50,0,C,0^AQN,25,30^FDSpraynozzle 50mm^FS
^FO0,130^BY2^BCN,30,Y,Y,N,N^FDS/N:941001-0114-0001^FS
^FO180,170^AQN,23,20^FDwww.swepro.com^FS
^XZ
5个回答

29

我将我的解决方案发布在这里,以防有人正在寻找它。正如E_S所提到的,为了将条形码居中在标签上,您需要通过以下步骤计算代码:

  • 检查您的窄条宽度,在您的情况下为2 (^BY2)
  • 找出标签总宽度(以点为单位)。为此,您必须知道打印机的分辨率(例如:8个点/毫米)。因此,如果您有一个宽为80mm的标签,则80*8=640个点
  • 计算您的条形码中的每个字符,包括调用代码和校验位,如下所示。关于调用代码的信息请参见:https://www.zebra.com/content/dam/zebra/manuals/en-us/software/zpl-zbi2-pm-en.pdf(第95页)
  • 请注意,调用代码(">:",">5"等)计为一个字符,并且模式C中的字符会成对存储。有关模式C的更多信息,请参见http://en.wikipedia.org/wiki/Code_128
  • 如果您的条形码是>:S/N:941001-0114-0001,则必须计算[起始代码B]+[20个字符]+[校验位]=22个
如果您的条形码是>:S/N:>5941001>6->50114>6->50001,您需要计算[起始识别码B] + [4个字符的'S/N:'] + [C模式调用] + [3个数字'941001'] + [B模式调用] + [一个字符'-'] + [C模式调用] + [2个数字'0114'] + [B模式调用] + [一个字符'-'] + [C模式调用] + [2个数字'0001'] + [校验位]=20
  • 除了停止码有2个额外的单元(即总共13个单元),每个字符占用11个单位,包括空格和条形码
  • 重点来了... 条形码宽度为:((计算后的字符[22或20]* 11) + (停止字符* 13)) * 窄条宽度 = 510个点或466个点
  • 现在我们要做的就是round((标签宽度-条形码宽度)/2),并使用^FT来定位条形码。
  • 就这样!希望对大家有所帮助!


    所以该数据长度为22个字符。那么条形码的起始、校验和停止部分呢?看起来你只考虑了停止字符,而没有考虑条形码的起始和校验部分。起始、校验和停止部分的宽度都是11个点吗? - SQL and Java Learner
    我不确定 stop char * 13 是什么意思。因为只有一个停止字符,所以它不应该简单地是 13 吗? - But those new buttons though..

    4

    没有ZPL命令可以让二维码居中。您生成ZPL的程序需要根据二维码的大小和位置自动计算其位置坐标。


    2
    另一个解决这个问题的方法不像Nicolas Garfinkiel的那么优雅,但要简单得多,如下所示。基本上,Code 128的问题在于它是可变宽度的。但在现实生活中,我们无论如何都将其用作固定宽度。这需要解释。我们将代码放置在某个位置,并期望它的宽度不超过某些限制,否则它就不适合,并且我们必须保留(保持空白)它可以填充的空间。因此,即使它的宽度可变,我们始终需要为其在标签上分配固定区域。因此,解决居中问题的方法是使Code 128具有固定长度。如果这是子集C(一对数字),则需要:
    1. 获取任何足够大的数字,形式为100000...,因此总共有偶数位数字。 2. 将您的代码添加到其中。
    例如,如果您的代码是94100101140001,则可以将其与10 ^ 16相加,然后得到以下结果:
    10000000000000000
       94100101140001
    =================
    10094100101140001
    

    因此,代码变成固定宽度,可以居中对齐。

    如果您的代码不是C子集,并且包含文本,则执行以下操作(伪代码):

    my_code = "S/N:941001-0114-0001"
    const_max_code_length = 24  (for example)
    if my-code.length > const_max_code_length then error
    padding_char = "="
    result = ""
    for (0..(const_max_code_length - my_code.length)) do
        result += padding_char
    end_for
    result += my_code
    

    在您的代码情况下,它将产生:

    ====S/N:941001-0114-0001
    

    无论您输入什么文本,它都将始终具有固定长度,并且位置将保持一致。
    在找到这篇文章之前,我自己使用了它。 这不是很好的解决办法,它是一种hack,而Nicolas Garfinkiel建议的更正确。 最合适的解决方案是,如果ZPL本身支持代码居中,但不幸的是它不支持。

    -3

    你必须尝试使用:

     ^FO10,170^AQN,23,20^FDwww.swepro.com^FS
    

    其中
    . ^FOX,Y^AQN,...^FSX=横坐标位置,Y=纵坐标位置


    -4

    在条形码属性中,点击复选框"将条形码作为图形打印"。

    这在我的情况下起作用了。


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