zpl.tools
Fonts and text

~DS - Download Scalable Font

Downloads a scalable Zebra font.

~DS downloads an Intellifont, the outline format Zebra used before TrueType, so that text scales smoothly rather than magnifies in whole multiples like a bitmapped font. Zebra's ZTools converter writes the command and its payload. The guide is blunt about a change to either. The printer does not check a downloaded scalable font for integrity, and a corrupt font gives unpredictable results.

Syntax

~DSd:o.x,s,data

Support

Not implementedparsed: none · state: none · rendered: none

Recognised as valid ZPL and not implemented, with no plan to.

Labelary does not support it either. Fields with the downloaded font default to a built-in font. — not pinned by a test

Labelary does not implement it either, so there is no parity reference.

Parameters

d:o.xFont fileoptional · text

Where to store the font: device R:, E:, B: or A:, a name of up to eight characters, and the fixed extension .FNT.

Default
R:UNKNOWN.FNT
Invalid value
discarded, and the default applies
Test coverage
The invalid-value rule is not pinned by a test.
sFont sizerequired · integer

Size of the font data in bytes, as the conversion tool writes it. The guide says not to edit it.

Invalid value
enough to make the whole command be ignored
Test coverage
The invalid-value rule is not pinned by a test.
dataFont datarequired · hexadecimal

The font itself, as ASCII hexadecimal.

Invalid value
enough to make the whole command be ignored
Test coverage
The invalid-value rule is not pinned by a test.

Behavior

~DS acts on receipt and belongs outside ^XA^XZ. It prints nothing. The printer stores the font under the given path, in volatile memory by default. A power cycle then needs the font again, unless it went to flash or a card.

The converter writes the size, and it must match the payload. The payload is the converted font as hexadecimal, so these commands run to tens of thousands of characters. The guide's example is a 37,080-byte CGTIMES.FNT.

After storage, ^CW binds the font to a letter that ^A and ^CF can name, or ^A@ names it directly. The font is scalable, so it takes the height and width from ^A as dots rather than as a magnification factor.

New work must use ~DU with a TrueType file instead. The renderer implements neither command, so a field that names the font defaults to a built-in one, and its metrics and line breaks differ from the intended typeface.

Differences from the specification

Labelary against the ZPL II guide

Where Labelary — our compatibility target — behaves differently from the printed specification.

  • Labelary's table marks ~DS unsupported. — not pinned by a test

zpl.tools against Labelary

Where our output differs from Labelary for the same input. These are the differences that break a migration.

  • Both engines ignore the download and report it on the same bytes, in a different sentence. Labelary says This ZPL command is not implemented and was ignored; the report here says the command is valid ZPL the renderer does not support yet (measured 2026-08-21). The wording is the renderer's one message for every command it recognizes and does not act on, so ~DT reads the same way. — pinned by test_example_ds_scalable_font_download

Example

The download, then a field asking for the font through a ^CW alias:

~DSR:CGTIMES.FNT,37080,00FF00FF00FF00FF
^XA
^CWM,R:CGTIMES.FNT
^FO50,50^AMN,40,40^FDDownloaded font, or a fallback^FS
^XZ

Open in viewer