zpl.tools
Graphics and images

^IS - Image Save

Saves the current label image into printer memory.

^IS stores the label under construction as a bitmap and not as ZPL, so

^IL is the command that would recall it later. We have not implemented ^IL yet, so that recall does not work here. ^IS sits at the end of the format that draws the template. Its last argument decides whether the printer also prints that template label. The renderer parses the command and honors that flag. A saving ^ISd:o.x,N renders zero pages, matching Labelary.

Syntax

^ISd:o.x,p

Support

Partially supportedparsed: full · state: partial · rendered: full

The command renders, with the caveat below.

The renderer reads the path and acts on the print flag: ^ISd:o.x,N saves without printing, so the format renders no output page. The raster itself is not stored, so a later recall of the saved name finds nothing. — not pinned by a test

Labelary renders this command. Scheduled for milestone 5.9.

Parameters

dStorage deviceoptional · single character

Which memory device to save to.

Default
R:
Invalid value
enough to make the whole command be ignored. A device letter no printer answers to is reported on this parameter. The whole command is then ignored, so the print flag has no effect. Measured 2026-08-21: ^ISQ:T.GRF,N answers X-Total-Count: 1 where ^ISR:T.GRF,N answers 0. The read-only Z: device is a different case. There the write is rejected, reported against the ^XZ, and the page stays suppressed.
Test coverage
The invalid-value rule is not pinned by a test.
oObject nameoptional · text

Name to save the image under.

Default
UNKNOWN
Invalid value
discarded, and the default applies
Test coverage
The invalid-value rule is not pinned by a test.
xExtensionoptional · text

Extension to save the image under. The guide accepts .GRF or .PNG here.

Default
.GRF
Invalid value
discarded, and the default applies
Test coverage
The invalid-value rule is not pinned by a test.
pPrint image after storingoptional · Y or N

Whether the printer also prints the label.

Default
Y
Invalid value
discarded, and the default applies. Measured 2026-08-21: an omitted, empty or rejected value all leave the default Y standing and the label prints. An over-long value is trimmed to its first character and reported, so NN still saves without printing.
Test coverage
No documented value is exercised by a test (Y, N). The invalid-value rule is not pinned by a test.
Y
Print the label and save it (default)
N
Save only, do not print

Behavior

^IS saves the page as the parser reaches the command, so it goes after the fields of the template and before ^XZ. It stores the raster only. The ZPL does not come back from it, and a saved image accepts no later edit.

The print flag defaults to Y. We measured this against Labelary on 2026-08-21. An omitted slot, an empty slot, a bare ^IS, and a rejected value like Q leave that default standing, so the label prints. A rejected value is reported on parameter 2. An over-long value is read by its first character, so ,NN still saves without printing. A surplus third slot draws an unrecognized-content warning from the scanner.

A device letter no printer answers to changes the whole command's effect. The save does not happen, a device warning is reported on parameter 1, and the label still prints one page, for example with ^ISQ:T.GRF,N.

The read-only Z: device differs. The write is rejected, and the renderer reports it against ^XZ, where the save happens. The page count still drops to zero there.

A path with no device writes to R:. An omitted name defaults to UNKNOWN, and an omitted extension defaults to .GRF. The guide accepts .PNG as well as .GRF for the stored object, the only command in this family with a free extension. Every other extension is accepted as written.

A ^PQ copy count follows whatever page count N leaves standing, so N suppresses copies too. A ^PH slew page still prints, because that is the printer feeding media, not the format printing itself.

An ^IS stored in a ^DF template body reaches the ^XF recall that replays it, and no further. ~IS is not a real command. Labelary reports that it does not exist and prints the label anyway. Only the caret spelling works.

Differences from the specification

zpl.tools against Labelary

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

  • Labelary stores the finished label and hands it back to a later ^XG or ^IL of the same path. The renderer stores nothing, so that recall reports the file does not exist. We measured this on 2026-08-21. ^ISR:T.GRF,N followed by ^XGR:T.GRF,1,1 draws the saved label there, pixel for pixel, and reports File 'R:T.GRF' does not exist here. Pages are built as a PDF operator stream and rasterized a stage later, so no whole-label bitmap exists to file at the ^XZ where the save happens. — not pinned by a test

Example

A template saved with the print flag left at Y, so the label prints as well as being stored:

^XA
^FO50,50^GB300,120,3^FS
^FO70,90^A0N,40,40^FDCONSTANT^FS
^ISR:TEMPLATE.GRF,Y
^XZ

Open in viewer