ZPL how-to
Code 128 barcodes in ZPL
A Code 128 barcode in ZPL has no width setting. Its width comes from the module width in ^BY and from how many characters it encodes, and its height and the text under it are set in ^BC.
In plain ZPL
^XA
^BY3
^FO40,40^BCN,100,Y,N,N^FDHB-M8-40-Z^FS
^XZ^BY3sets the module width, the narrowest bar, to 3 dots. It runs from 1 to 10 and stays set for every barcode after it, until the next^BY. Its second value, the wide-to-narrow ratio, has no effect on Code 128.^BCN,100,Y,N,N: Code 128, normal orientation, 100 dots tall, with the human-readable text printed under the bars (Y, the default), not above them (N), and no UCC check digit (N). Leave the height out and it comes from the third value of^BY, as in^BY3,,100, which is 10 dots if nothing set it.
Working out the width
Every Code 128 character is 11 modules wide. A barcode is a start character, the data, a check character and a 13-module stop: 11 × (characters + 2) + 13 modules. Multiply by the module width to get dots.
HB-M8-40-Zis 10 characters, so 145 modules: 290 dots wide at^BY2and 435 at^BY3, about 2.1 inches at 203 dpi.- Leave at least 10 modules of blank space on each side, so a scanner can find where the barcode starts and ends.
- A 4 inch label is 812 dots wide at 203 dpi. A long value at
^BY3runs off the edge, and the printer prints what fits, with no error. Lower the module width before you shorten the data.
Subsets A, B and C
Code 128 has three character sets. Subset A has capitals, digits and control characters, subset B has capitals, lower case and digits, and subset C packs two digits into each character, so a run of digits takes half the width.
^XA
^BY2
^FO40,40^BCN,100,N,N,N,A^FD12345678^FS
^XZ- The
Aat the end of^BCis automatic mode: the printer picks the subsets, and switches to C for runs of digits. These 8 digits print 158 dots wide at^BY2. - Without it, the barcode starts in subset B and stays there: the same 8 digits print 246 dots wide.
- To choose a subset yourself, leave the
Aoff^BCand start the field data with>9for A,>:for B or>;for C. In automatic mode they are not start codes: they print as characters. - Give subset C an even number of digits. With an odd number, the last digit can be dropped, with no error.
- Without the
A, a>in your data starts an invocation code. Write it as><to print a>. Automatic mode prints it as it is.
The same label with zeepler
Send this body to POST https://api.zeepler.com/v1/zeeplify with your API key in the x-api-key header. It is a working request, not an illustration: on every change, our tests run this same file through the API's code and compare the result with the ZPL below.
1{2 "config": {3 "size": "4x2"4 },5 "data": {6 "sku": "HB-M8-40-Z"7 },8 "templates": [9 {10 "type": "BarCode",11 "dataPath": "sku",12 "coords": [40, 40]13 },14 {15 "type": "Text",16 "dataPath": "sku",17 "coords": [40, 110],18 "font": "0,30"19 }20 ]21}And the ZPL that comes back, ready to send to the printer:
^XA^MCY^XZ
^XA
^SZ2
^MMT
^MNY
^LL406
^PW812
^LH0,0
^BY2,2,59^FO40,40^BCN,,N,N,N,A^FDHB-M8-40-Z^FS
^CF0,30^FO40,110^FDHB-M8-40-Z^FS
^XZzeepler's BarCode element is Code 128 in automatic mode, so runs of digits are packed into subset C for you. Its module width is fixed at 2 dots and its height at 59, and it prints no text under the bars: the request adds a Text element with the same value instead. None of those can be changed today, so if you need a wider, taller barcode or the printer's own text line, use the plain ZPL above.
A ^, ~ or _ in the value is escaped for you, as the guide on printing them explains.
Sending it
- Call the API from your own server or integration engine, not from a web page. An API key in a browser is a key anyone can copy.
- A successful call answers
200with the ZPL as plain text. A request the API cannot turn into a label answers400with every problem listed by field, and is not billed. - Send the ZPL to a Zebra or other ZPL printer at 203 dpi. At 300 dpi the same label prints at two-thirds of the size.
The API reference has every field and status code.
Before you go live
- Scan the barcode with your own scanners, at the module width you plan to use.
- Text does not wrap. A value longer than the space you left runs off the edge of the label, so set
maxLengthon any field whose length you do not control. - Coordinates are in dots from the top-left corner. Print one label, measure it, and adjust: there is no preview.
- Scan every barcode and QR code on a printed label before relying on it.
Related guides
- QR code size in ZPL: How ^BQ magnification sets the size of a QR code, and how to work out the size in dots.
- Printing ^, ~ and _ in ZPL: Why a caret or tilde in your data cuts the field short, and how ^FH prints them.
- Font size in ZPL: Setting text height with ^A and ^CF, converting points to dots, and why ^CF carries over.
- Send ZPL to a Zebra printer from C#: Send ZPL from .NET to a network printer on port 9100, or to a USB printer through the Windows spooler, without the driver redrawing it.
Help with an integration
Email info@zeepler.com. You will get a reply within 2 business days. The support policy covers response times and version changes.