Zebra printer prints blank labels
The job goes through. The printer feeds. A perfectly clean, perfectly empty label comes out. Nothing errors, because from the printer's point of view nothing went wrong.
Almost always this is a mismatch between the media you loaded and how the printer thinks it makes marks. Start there before touching your ZPL.
First: what does the printer think it is doing?
~HS gives three lines, and the second one answers most of this:
(printf '~HS'; sleep 2) | nc 192.168.1.157 9100
Real output from a healthy GX430t:
030,0,0,1824,002,0,0,0,000,0,0,0
001,0,0,0,1,2,6,0,00000000,1,000
1234,0
Reading the second line, 001 0 0 0 1 2 6 0 ...:
| Field | Value | Meaning |
|---|---|---|
| 3rd | 0 |
Head up. 1 means the latch is open. |
| 4th | 0 |
Ribbon out. 1 means no ribbon detected. |
| 5th | 1 |
Thermal transfer mode. 1 = expects a ribbon, 0 = direct thermal. |
| 6th | 2 |
Print mode: 2 is tear-off. |
That fifth field is the one that causes blank labels, and you can cross-check it:
! U1 getvar "media.printmode" on the same printer returns "TEAR OFF", which
agrees with the sixth field, so the mapping is right.
Cause 1: thermal transfer mode with direct thermal media
If the fifth field is 1, the printer believes it makes marks by melting a
ribbon onto the label. Load direct thermal stock (which darkens under heat by
itself, no ribbon) and the printer dutifully does nothing at all. Blank labels,
no error.
The reverse also happens: direct thermal mode with ribbon-based stock, which also prints nothing.
Set it to match what is physically loaded:
^XA^MTD^XZ ; direct thermal (no ribbon)
^XA^MTT^XZ ; thermal transfer (ribbon)
How to tell which media you have, with no documentation: scratch the label surface briskly with a fingernail or a coin. Direct thermal darkens from the friction heat. Thermal transfer does not mark at all. This takes five seconds and settles the question.
Cause 2: media loaded upside down
Direct thermal stock is coated on one side only. Loaded with the coating facing away from the head, it cannot darken, and everything else looks correct.
The scratch test tells you which side is which: whichever side marks is the side that must face the printhead.
Cause 3: darkness too low
Not usually a blank label, more a very faint one, but at the bottom of the range with marginal media it is indistinguishable.
(printf '! U1 getvar "print.tone"\r\n'; sleep 1) | nc 192.168.1.157 9100
"20.0"
Raise it with ~SD (00 to 30):
~SD22
Change it a couple of steps at a time. Too dark bleeds barcodes into unscannable blocks, which trades this problem for a worse one.
Cause 4: the content is not on the label
If the printer is configured correctly, the marks may be landing outside the
printable area. A ^FO beyond the print width prints nothing, silently, exactly
like a blank label.
The quickest way to rule this out is to render the same ZPL somewhere that shows you the whole canvas. Paste it into the ZPL viewer: if the label is empty there too, the problem is your ZPL and the printer is innocent.
Labels printing cut off covers the
^PW/^LL arithmetic in full, because "off the edge" and "blank" are the same
fault at different severities.
Cause 5: the format never closes, or the fields never terminate
A ^FD without its ^FS swallows everything after it as data. A format without
^XZ is never executed. Both produce a feed with nothing on it.
^XA
^FO50,50^A0N,45,45^FDHello^FS ; ^FS required
^XZ ; ^XZ required
If pasting the same stream into the viewer produces a label, your ZPL is fine and the fault is upstream.
It printed fine yesterday
^MT persists in the printer between jobs, so a single job that set the wrong
method leaves every later job blank. Set ^MT explicitly in your format rather
than inheriting whatever was there.
Blank labels only after a media change
The new roll is the other type. Scratch test it, then match ^MT to it.
The printer feeds several blank labels per job
That is a calibration problem rather than a marking one: the printer cannot find
the gap between labels and is guessing at the length. Run ~JC and feed a few.
Published 2026-09-03 · Ben Faerber, software engineer, five years building warehouse fulfillment and label-printing systems; maintainer of pdf-to-zpl (27,000+ installs powering production label generation).