^BO - Aztec Bar Code
Two-dimensional symbology with no quiet-zone requirement, common on transport tickets.
^BO prints an Aztec symbol: square modules around a central bulls-eye finder
pattern. The central finder makes a quiet zone unnecessary, so the symbol fits on
transport tickets and boarding passes where every millimeter is committed. Choose
^BO over ^BQ QR Code where the space around the symbol is not available to
reserve.
Syntax
^BOo,m,x,d,r,s,iAlias: ^B0, which the printer treats as the same command.
Support
Every documented parameter renders the same output Labelary produces.
Labelary renders this command.
Parameters
oBar code orientationoptional · one of a setRotation of the symbol and interpretation line.
- Default
- the orientation set by
^FW, which itself defaults toN - Invalid value
- discarded, and the default applies. The renderer reports an unrecognized character as invalid, and uses the default.
- Test coverage
- No documented value is exercised by a test (N, R, I, B). The invalid-value rule is not pinned by a test.
N- No rotation (default)
R- Rotated 90° clockwise
I- Rotated 180°. The symbol reads upside down
B- Rotated 270° clockwise
mMagnificationoptional · integerModule size in dots.
- Default
- a value chosen from the print density
- Accepted range
- 1 to 10
- Invalid value
- clamped to the nearest allowed value. Labelary accepts a value below 1 silently, and clamps a value above 10 to 10 (measured 2026-07-12). The renderer accepts the value as written.
- Test coverage
- Bounds pinned: maximum (10), above the maximum (11). No test at the minimum. The invalid-value rule is not pinned by a test.
xExtended channel interpretationoptional · Y or Nnot honoured by zpl.toolsWhether the field data uses ECI escapes to switch character sets.
- Default
- N
- Invalid value
- discarded, and the default applies. An invalid flag is reported and the default of N applies. ECI switching is not implemented.
- Test coverage
- No documented value is exercised by a test (Y, N). The invalid-value rule is pinned by 2 tests.
Y- Data contains ECI escapes
N- No ECI (default)
dError control and symbol sizeoptional · integerEither a fixed symbol size or a minimum error-correction percentage. 1-99 gives a percentage. 101-104 gives a compact symbol. 201-232 gives a full-range symbol. 300 gives an Aztec rune.
- Default
- sized to fit the data
- Accepted range
- 1 to 300
- Invalid value
- not documented, and we have not measured it. The accepted values are four disjoint bands rather than one range, and no measurement covers a value between the bands.
- Test coverage
- No test at the minimum, maximum or one step outside the range.
rReader initialisationoptional · Y or Nnot honoured by zpl.toolsMarks the symbol as a reader-programming symbol rather than data. The guide calls this the menu symbol indicator.
- Default
- N
- Invalid value
- discarded, and the default applies. The parser reads this argument at the wrong position today.
- Test coverage
- Values exercised: Y, N. The invalid-value rule is pinned by 2 tests, including the diagnostic it emits.
Y- Reader initialization symbol
N- Ordinary data (default)
sSymbols in the sequenceoptional · integerHow many symbols a structured-append sequence spans.
- Default
- 1
- Accepted range
- 1 to 26
- Invalid value
- discarded, and the default applies. The renderer reports a value outside 1-26 and resets it to 1, in both directions (measured against Labelary 2026-07-12).
- Test coverage
- Bounds pinned: minimum (1), below the minimum (0), above the maximum (27). No test at the maximum. The invalid-value rule is not pinned by a test.
iMessage IDoptional · textCorrelates the symbols of a structured-append sequence.
- Default
- no message ID
- Invalid value
- not possible — any value is accepted. Any string is accepted. An id containing a space is dropped from the structured-append prefix, since the space is the decoder's delimiter.
- Test coverage
Behavior
The fourth argument sets either the error correction or the symbol size, according to its value band:
- 1 to 99 — a minimum error-correction percentage. The encoder sizes the symbol to fit.
- 101 to 104 — a compact symbol of one to four layers.
- 201 to 232 — a full-range symbol of one to 32 layers.
- 300 — an Aztec rune, the small fixed symbol that encodes a single byte.
Leave the argument at 0 for the default correction level and automatic sizing.
The reader-initialization argument — the menu symbol indicator in the guide — marks the symbol as scanner configuration and not as data. Do not set it on a label that a scanner must read normally.
Structured append splits one message across up to 26 symbols. The message ID correlates them, and the guide limits the ID to 24 characters. Both arguments mean nothing for a single symbol.
^BY has no effect on the symbol. Magnification is the module width in dots and
the only size control.
The renderer parses ^BO and draws no symbol. It reports a diagnostic and does
not default to a text run. A parsing gap goes with that state: the parser does
not read the third argument, the ECI flag, so every argument after magnification
lands one position early. The renderer release fixes both gaps. Until then ^BQ
QR Code is the closest 2D symbology that renders, and it needs a quiet zone.
The ^B0 spelling, with a zero, is an accepted alias, and it appears in the
guide's own example.
Known issues
Tested behavior
Differences from the specification
zpl.tools against the ZPL II guide
Where our renderer behaves differently from the specification.
- The guide takes the default orientation from
^FW. The renderer applies^FWto text fields only. A barcode after^FWRprints unrotated unless its ownoargument rotates it. — not pinned by a test
Example
Default error correction and automatic sizing, at a 5-dot module:
^XA
^FO50,50
^BON,5,N,0,N,1,
^FDAztec 1234567890^FS
^XZ
Related commands
^BQQR Code Bar CodeThe common two-dimensional matrix symbology. A prefix on the field data sets its error correction and input mode. The command does not set them.^BXData Matrix Bar CodeCompact two-dimensional symbology used for small-part marking and GS1 DataMatrix.^FDField DataSupplies the text or barcode content of the field.^FOField OriginSets the top-left corner of the next field.