ZPL Code to create a GS1 Compliant QR Barcode


Hi, been searching all over interwebs for information on how to create a GS1 compliant QR Code in ZPL and need some help.

I'm simply trying to create a QR Code (using the ^BQ code) that is GS1 compliant. I can successfully do this for DataMatrix and Code-128 with FNC1 codes to get the correct symbology identifiers. There is even documentation on this website on how to do this, but it omits QR codes.
Document is here: https://supportcommunity.zebra.com/s/article/Creating-GS1-Barcodes-with…
It would be great if this could also cover QR codes!

From what I've inferred from several articles that have talked around the subject, it's leaning towards ZPL does not support GS1 compliant QR Codes, but this from dated articles - so I'm hoping to get a 2022 fresh answer since this standard has been around for about 10 years. It would be nice to get a definitive answer either way or possibly a date when this might be supported if it's not.

When scanned, these codes have a ]Q3 symbology identifier. I can create one with a ]Q1 identifier just fine, but I'm making all of my applications and code GS1 compliant, so I want to get the correct symbology.

Of course, if anyone has some links to info for some ZPL that can generate GS1 QR codes, I would greatly appreciate! I'm experimenting with some code that embeds hex \x1D into the data field, but fnc1 is a little different that then group separator character so no sure this will work.

Here is a document that outlines the GS1 2D codes:

The 2D QR Code produces in this reference document will output this when I scan it: ]Q301095011015300031721011910AB-123
I'd like to create the same barcode in ZPL with data : "01095011015300031721011910AB-123" and have the ]Q3 symbology id instead of ]Q1.


Submitted by SSi1 on September 21, 2022 Permalink

The GS1 support in the QR code has been added to the Zebra Link-OS printers since the Link-OS v6.6. See the firmware release notes.

6. GS1 type QR barcodes can now be created by specifying the FNC1 code at the beginning of the data.
This is done by using >8 as the first data after the ^FD command.


Submitted by jsaville@ccmjc… on September 21, 2022 Permalink

thanks - I've read thru those release notes and it sounds hopeful! But I still cannot get a valid barcode:



This scans as

It should start with a ]Q3.

Does anyone have a working example in ZPL I can paste in Labelary?

Submitted by jsaville@ccmjc… on September 21, 2022 Permalink

This article is the closest I've found. Basically, it says there is no way to encode the FNC1 via ZPL, but it's a year or two old, so hoping there might be some updates.


I was hoping to use >8 or _1 but it seems this is not supported in ZPL? There is no mention in the ZPL programming guide. But the firmware release notes seem to indicate something is changing - perhaps it's not documented yet?

Submitted by jsaville@ccmjc… on September 21, 2022 Permalink

Well, I think I've found a workaround. I've been using the Zxing C# for parts of my labelling solution. I've got some working code that produces bitmap images of GS1 QR codes and creates PNG images for web usage. If I take the image bitmap and translate it to the ZPL graphics format and send in the ZPL as an image it should work. Need to add some code to do the ZPL image conversion and should be good to go. It's not network efficient and will create larger files to send to printer, but should work in all my use cases. Not ideal, but it seems that's what most programs are doing as workaround with no direct ZPL code method. Always open to other ideas if y'all have run into this type of thing.

Submitted by jsaville@ccmjc… on September 21, 2022 Permalink

Well got some working code. Here's the ZPL output from the C# program. It creates the bitmap using ZXing (which is GS1) and then I run the bitmap thru a Zpl image translator that generates an image I can put in ZPL code and print. Seems to work great. A little extra processing, but it works and generates the correct symbology Id when printed on a zebra printer.

Here's the sample output:


Output when scanned:

Perfect for my use. Hope it helps someone else.