Download TrueType and OpenType Fonts to a Zebra Printer (~DU, ^A@)
Step-by-step ways to load a .TTF font onto a ZPL printer and print with it using ^A@ or ^CW.
Most current ZPL printers can store TrueType (.TTF) fonts and render them at any size. OpenType fonts with TrueType outlines (.TTF/.OTF with glyf data) generally work too; fonts with PostScript outlines may not, so test first.
Method 1: Zebra tools (easiest)
Use Zebra Setup Utilities, ZebraNet Bridge or Zebra Font Downloader. Choose the .TTF file and the target drive (usually E:). The tool wraps the file in the right ZPL download command for you.
Method 2: Send the ZPL yourself with ~DU
~DU downloads a TrueType font as hex data:
~DUd:o.x,s,data
| Parameter | Meaning |
|---|---|
d: |
Destination drive: E: flash (persistent) or R: RAM (temporary) |
o.x |
Name and extension to store the font as, for example ARIAL.TTF |
s |
Font file size in bytes |
data |
The file bytes encoded as ASCII hex |
You will almost never type this by hand. Generate it with a script. For example, in Python:
import binascii, socket
with open("ARIAL.TTF", "rb") as f:
raw = f.read()
zpl = f"~DUE:ARIAL.TTF,{len(raw)},{binascii.hexlify(raw).decode().upper()}"
with socket.create_connection(("192.168.1.50", 9100)) as s:
s.sendall(zpl.encode("ascii"))
Replace the IP with your printer’s address. Port 9100 is the raw print port on most network printers.
Some firmware versions use
~DYinstead, which supports binary data and compression. If~DUis rejected, check your printer’s programming guide for~DYwith the TrueType type flag.
Print with the font
Call the stored file with ^A@:
^XA
^FO50,50^A@N,60,60,E:ARIAL.TTF^FDHello from Arial^FS
^XZ
Or alias it once with ^CW and use a short ^A thereafter:
^XA
^CWZ,E:ARIAL.TTF
^FO50,50^AZN,60,60^FDHello via alias Z^FS
^FO50,130^AZN,40,40^FDSecond line^FS
^XZ
Use ^CI28 as well if the text is Unicode (see Unicode and code pages).
Check that it is installed
^XA^WD*:*.TTF^XZ
This prints a list of every .TTF on all drives. If the font is missing, see font not printing.
Licensing and file size
- You need a license that allows embedding the font in a device. Free fonts such as Noto, Liberation or DejaVu are safe choices.
- A font with thousands of glyphs, like a full CJK font, is many megabytes. Check flash space first with
^XA^HH^XZ. - Subset the font to only the characters you use to save space.
No room or no font? Use graphics
If the printer cannot hold the font, convert the text into a ^GF graphic and print the image.
Before you download anything
Spend five minutes on preparation and you’ll avoid most of the pain. First, decide whether you really need a custom font. If font 0 already covers your characters, adding a TrueType file means more to maintain on every printer. A downloaded font earns its place when you need a specific look, a wider character range, or consistency across different printer models.
Second, check the license. Plenty of fonts that are free to use in documents don’t allow embedding in hardware. Open-licensed families such as Noto, Liberation and DejaVu are safe, and they cover a wide range of scripts. If your design team insists on a commercial typeface, ask the foundry whether device embedding is covered, and get that answer in writing.
Third, check the file size and the free space on the printer. A Latin-only font is small. A font with Chinese, Japanese and Korean glyphs can be tens of megabytes. Use ^XA^HH^XZ to print the configuration label and see how much room is left, and read fonts by printer model if you’re choosing hardware.
The easy way and the scripted way
If you’re setting up one printer, use Zebra’s own utilities. They handle the formatting of the download for you and report errors in plain language. For a handful of devices that’s the fastest route.
If you manage dozens of printers, script it. The example above builds the download command in Python and sends it over the network. The same idea works in any language that can open a TCP connection to port 9100. Make the script idempotent: ask the printer whether the font is already there, and only download when it’s missing. That keeps your provisioning quick and avoids needless writes to flash memory, which has a limited number of write cycles.
Testing the font properly
Once it’s on the printer, don’t test with “Hello”. Print a line that includes every character your real data will contain: accented letters, digits, punctuation, currency symbols. A font might look fine for a sample word and be missing the one symbol your product names use all the time. Keep a short test label for exactly this purpose, and run it after each new font install.
Remember the character set as well. Text in UTF-8 needs ^CI28, and getting it wrong looks like a font problem even though the font is fine. The Unicode and code pages page explains how the pieces fit together, and our UTF-8 printing checklist is a good companion.
What can go wrong
The most common failure is the font silently not loading, so the label prints in the default font. Typical causes are a typo in the drive or file name, downloading to RAM instead of flash, or a file the printer can’t parse. Another one is a font with a different internal name than its file name. The printer cares about the file name you gave it, not what the font calls itself.
Sometimes the download appears to succeed but the font prints boxes. Then the character set is wrong, or the font doesn’t contain the glyph. The font not printing or showing blocks page has a step-by-step check. And if the font works until the printer is switched off, you’ve hit the RAM problem.
When you shouldn’t download a font at all
There are cases where a downloaded font is the wrong tool. If you only print a few fixed strings in a complex script, a pre-rendered graphic is simpler and looks exactly right. The text-to-graphic converter produces one from any font installed on your computer. And if the printer is a mobile model with little memory, graphics may be the only realistic option.
Common questions
Can I download an OpenType font? If it has TrueType outlines it generally works. Fonts with PostScript outlines may not, so test before rolling out.
How many fonts can I store? As many as fit in flash, but each one adds to your maintenance. Keep the set small.
Do I need to download the font for every label? No. Store it once on E: and reference it. Details are in flash versus RAM.
What does ^A@ look like in a full label? See the examples in the ^A command guide.
Last reviewed 2026-10-20