Paxar PCL command reference
The label format language of SNAP 500 and SNAP 700 printers · updated 1 October 2026
SNAP printers read a format language the firmware itself calls PCL. It is not HP PCL, which uses ESC sequences, and it is not Zebra ZPL, which uses ^XA … ^XZ. Here every command starts with a tilde, and a format runs from ~XA to ~XZ~.
There is no public specification for this language. Everything below was derived from the test formats shipped in the printer firmware, from a real production print job, and from the firmware changelog — then checked against printed labels. Each command carries how sure we are. Paste a format into the
viewer to see it drawn.
confirmed matches every sample, or the firmware says so
inferred consistent with every sample, not proven
unknown appears in files, meaning not established
Syntax
- Every command starts with
~, followed by a two-letter uppercase code and its value. The value ends at the next ~, CR or LF.
- Two commands have a single letter:
~D (data) and ~I (image). Everything after the letter is the value, so ~DTOP HEAD is the data TOP HEAD, not a command DT.
~XZ~ and ~ZZnnnnn~ end with an extra tilde. A tilde followed by another tilde, CR or LF is empty and is ignored.
- Line breaks are optional: a whole format can be a single line.
- After
~I comes binary PCX data, which may contain tilde, CR and LF bytes. That part cannot be read as text.
Structure of a job
~XA~XW1000~XP3250~XD300 … format header
~FA08~FDF~FR0~FW0586~FP1313 … one field per line (text, line, logo, image)
~XZ~ end of the format
~ZD00 always 00
~ZITESTPAT1 format name (optional)
~DTOP HEAD one ~D per data field, in field order
~I<binary PCX> one ~I per ~FM field, in order
~ZZ50000~ batch quantity
How data reaches the fields confirmed
~D lines are consumed in order by every field that is not a line (~FL) and not a job image (~FM).
~I blocks are consumed in order by the ~FM fields.
- In
~FAnn, nn is the maximum number of characters the field accepts. Longer data is cut by the printer.
Header · ~X
| Command | Values seen | Meaning | Status |
~XA | — | start of format | confirmed |
~XZ~ | — | end of format | confirmed |
~XW | 510 … 2007 | label width, thousandths of an inch (across the web) | confirmed |
~XP | 1500 … 4000 | label length, thousandths of an inch (feed direction) | confirmed |
~XD | 300 | resolution in dpi; assume 300 when absent | confirmed |
~XX | 500, 700 | printer model | confirmed |
~XS | 45, 60 | print speed, tenths of an inch per second | inferred |
~XG | L | graphic field prefix: always right before ~FG or ~FM | confirmed |
~XN ~XT | N1–N3; T97, T91 | station and some type attached to it | unknown |
~XU ~XF ~XL ~XC | S0; N; 1; 01 | — | unknown |
Fields · ~F
| Command | Meaning | Status |
~FAnn | text field; nn is the maximum number of characters | confirmed |
~FLnn | line; always 01 in the samples | confirmed |
~FGnn | logo stored in the printer; the ~D carries the logo number | confirmed |
~FM | image that arrives inside the job as ~I | confirmed |
~FB | barcode | inferred |
~FD | station: F, B, 1, 2 or 3 | confirmed |
~FW | position across the width, thousandths of an inch | confirmed |
~FP | position along the length, thousandths of an inch | confirmed |
~FR | rotation, 0 to 3 (each step 90°, counter-clockwise) | confirmed |
~FTRW ~FK | RFID: write to the chip, enabled station | unknown |
Geometry: ~FW grows upwards and ~FP grows along the label length, with the origin at the bottom-left corner of the tag. At rotation 0, text runs along the length. This was checked against printed labels.
Text parameters · ~A
| Command | Values seen | Meaning | Status |
~AL | 5, 9, 10, 759 | font number; selects FNTnnnnn.TTF in the printer | confirmed |
~AP | 6 … 20 | type size in points | inferred |
~AC | 850, 999, 998 | code page: maps each data byte to a code point in the selected font. 999 is the care symbol table, 998 the NAFTA symbol table | confirmed |
~AW | 220 … 2600 | field width along the reading direction, thousandths | inferred |
~AE | L, C, R | alignment inside ~AW | inferred |
~AI | 00 … 07 | likely character spacing (ICS) | unknown |
~AQ ~AB ~AR | 0, 3; D; 0, 2 | — | unknown |
Line parameters · ~L
| Command | Meaning | Status |
~LW ~LP | end point of the line; the start is the field's ~FW/~FP | confirmed |
~LV ~LH | thickness, read in printer dots | inferred |
~LT ~LR | — | unknown |
Graphic parameters · ~G
Logos and job images carry ~GM, ~GT, ~GU, ~GE and ~GR. ~GM is 3 on ~FG and 4 on ~FM, which suggests it marks where the graphic comes from. The rest is unknown.
Data, images and batch · ~Z
| Command | Meaning | Status |
~D | data for one field, in field order | confirmed |
~I | PCX image for one ~FM field; binary | confirmed |
~ZI | format name | confirmed |
~ZZnnnnn~ | batch quantity. Without it the format does not print | confirmed |
~ZD | always 00 | unknown |
Stations
A tag can be printed by more than one head. ~FDF is the top head (front) and ~FDB the bottom head (back). Machines with three stations use ~FD1, ~FD2 and ~FD3. Each field belongs to exactly one station.
Volatile logos and queries
The firmware changelog mentions commands that never appeared in the files we have: ~V downloads a volatile logo that lives in memory until ~VD~ erases it or the printer is switched off, and ~QRR asks the printer for a file name. They are listed here for completeness and are unknown in practice.
Barcodes
A barcode is a ~FB field and its data comes in the usual ~D line. Which symbologies the printer itself can draw is settled — its firmware names them one by one, and its error messages (CODE 39 BAD DATA, BAD UPCE DATA, BARCODE FIT ERROR, BARCODE VERIFY ERROR) are symbology specific:
| Symbology | Notes |
| Code 39 | the classic for internal part numbers |
| Code 128 | _ and ^ act as FNC1 |
| Code 128 E.D.I. | AI (00), fixed 20-digit data (SSCC) |
| Interleaved 2 of 5 | optional check digit |
| UPC-E | HRI can be segmented 1–6 |
| EAN-8, EAN-13 | also as GS1 composites |
| GS1 DataBar, Expanded Stacked, Composite | used for GS1 application identifiers |
| Data Matrix | 2D, write modes OR and DIRECT |
What is not settled is the parameter inside the field that picks the symbology, the module width, and whether the human readable line is a field of its own. No format we have access to contains a barcode field, so for now the viewer lets you choose the symbology by hand and draws Code 39, Code 128, EAN-13, EAN-8, UPC-A and Interleaved 2 of 5 from the field data.
Care symbols
A care symbol field is an ordinary text field with ~AC999. The printer runs every character of the data through its code page 999 table, which returns the code point of the symbol inside the care symbol font — one character in, one symbol out. The table is regular: symbol number N is the ASCII character 0x21 + N, so # is symbol 2, 9 is Do Not Wash and P is Size Small. ~AC998 does the same for NAFTA symbols.
Two details are still open. The field length in ~FAnn counts symbols, and the printer firmware notes that the host sends three characters per symbol — so the design software seems to encode each symbol as a three-digit code before the printer reduces it to one byte. And the care symbol fonts themselves are licensed by the printer manufacturer, so Labelisk cannot redistribute them: a care symbol field renders with a warning instead of the symbols.
If you have a format with care symbols, or one with a barcode, send it over with a photo of the printed tag. That is what turns the inferred rows above into confirmed ones.
Example
A complete two-sided label, with a frame, text fields and a barcode, is loaded by default in the viewer. Change a number there and the drawing follows along, which is the quickest way to understand a command.