QR Code Printing Guide: Size, Resolution, and Placement

Bhargav Dhameliya
Bhargav Dhameliya
October 30, 2026
5 min read
qr code printing guide featured

Why does a QR code that scans perfectly on your screen fail on the printed box?

Usually it isn’t the code. It’s the printing. Ink spreads, label printers snap to dot grids, bottles curve, and someone puts the code on a fold. I’ve watched a clean file die on all four, so this QR code printing guide covers the press side that most “make it 2 cm and use 300 DPI” advice skips.

I ran an original decode test for the three print failures nobody publishes numbers on: ink spread, thermal label dots, and curved surfaces. The other print topics already have deep dives on linkutm, so this guide links to them rather than repeating their numbers.

Here’s the one-screen version:

Decision My rule Why it matters Deep dive
What to encode A short link, not a long URL Fewer modules, so each module prints bigger QR code version
Printed size Pick the module size first, then the total width Scanners read modules, not centimetres QR code smallest size
File Vector (SVG or PDF), 100% black, no resampling The printer never guesses at pixels This guide
Ink spread Keep gain under 0.3 of a module Both test readers stayed at 37 to 40 of 40 This guide
Thermal labels 3 or more printer dots per module, 4 if you can Burn spread killed 2-dot modules This guide
Curved surfaces Code width under 0.9 x the diameter, ideally 0.6 Both readers failed past about 1.0 x This guide
Margin 4 blank modules on every side Scanners need the quiet zone to find the edge Glossary
Placement Flat, lit, reachable, not on a fold A perfect print still fails on a seam This guide

What Affects QR Code Printing? The Chain From File to Scan

QR code printing works as a chain, and the scan fails at the weakest link. A short payload sets the module count. The module count and the space you have set the module size. The file carries that size to the press. The press and ink change it. The surface bends it. Placement decides whether a phone can reach it.

A few entities do most of the work here, so here are the one-line definitions:

  • QR code: a 2D matrix barcode defined by ISO/IEC 18004, invented by Denso Wave in 1994.
  • Module: one square cell of the code. GS1 calls its width the X-dimension. Read more on the QR code module.
  • Version: the grid size, from 21 x 21 modules (Version 1) up to 177 x 177 (Version 40). More data means a higher version and more modules.
  • Error correction: spare data that lets a damaged code still decode. Level M recovers about 15% of codewords. See QR code error correction.
  • Dot gain: the growth of printed ink beyond the size in the file. The PRINTING United glossary defines it as “the mechanical increase in halftone dot size that occurs during printing.”

The relationship that matters most: every print problem is measured against the module. Ink spread, printer dots and curvature all hurt in proportion to how big one module is. That’s why a short payload helps every later step. It doesn’t make the code “better”. It makes each module bigger at the same printed size.

QR code printing chain: payload, module size, file, press and ink, surface, placement

The honest limitation: the chain is a model, not a guarantee. A code can pass every rule here and still fail because the landing page is down. The QR code not scanning guide covers those non-print failures.

QR Code Print Size: Choose the Module Size First

The right QR code print size starts with the module, not the overall width. Pick a module size your print method can hold, then multiply by the module count plus the quiet zone.

The formula is simple:

printed width = module size x (modules + 8)

The + 8 is the four-module quiet zone on each side. A Version 2 code has 25 modules. At a 0.5 mm module, it prints 16.5 mm wide, quiet zone included.

GS1, the body that runs retail barcodes, publishes a module range for GS1 QR codes on products. In its General Specifications (Release 26.0, Table 5-46), the X-dimension runs from 0.396 mm minimum to 0.495 mm target and 0.990 mm maximum. GS1 also explains why 2D codes need bigger modules than 1D barcodes: “Optical effects in the image capture process require that the Data Matrix and QR Code symbols be printed at 1.5 times the equivalent X-dimension allowed for linear symbols.”

I treat 0.4 mm as my floor for anything printed on a press and 0.5 mm as my default. Below that, ink spread eats the margin fast (more on that below).

For the full size chart by placement, the 10:1 scan distance rule and the 2 cm practical floor, read how small a QR code can be. For signs scanned from metres away, use the QR code scanning distance formula.

Limitation: GS1’s range is written for product packaging scanned at arm’s length. A billboard or a stadium screen needs modules many times bigger, so don’t treat 0.99 mm as a ceiling outside retail.

QR Code Print Resolution: What File Should You Send the Printer?

Send the printer a vector file. An SVG, PDF or EPS describes each module as an exact square, so the code stays sharp at any size and the printer never resamples pixels.

The right QR code file format for printing is vector. Here’s the handoff checklist I use:

  1. Vector, not raster. Export SVG or PDF. If you must send a PNG, size it in pixels for the final print, as covered in how to export a high-quality PNG QR code. Changing the DPI tag doesn’t add pixels.
  2. One colour plate. Set the modules to 100% K (CMYK 0/0/0/100). I avoid rich black (black built from all four inks) on QR codes. If the plates misregister even slightly, every module gets a coloured fringe.
  3. No effects. No drop shadows, gradients, feathering or transparency on the modules.
  4. Lock the size. Place the code at 100% in the layout and tell the printer not to scale it to fit.
  5. Keep the quiet zone inside the art. If the printer trims or adds bleed, the margin must survive the cut.

linkutm’s free generator downloads PNG, SVG or PDF, as the QR code sticker generator shows. For print, I pick SVG or PDF every time.

One honest gap: I couldn’t find a standards-body document that mandates 100% K for barcodes. It’s standard prepress practice for fine detail like small type, and I apply the same logic to modules. If your printer has a reason to do it differently, ask them before you overrule them.

QR Code Printing and Ink Spread: How Much Can a Code Take?

A printed QR code tolerates ink spread up to about 0.3 of a module on both decoders I tested. Past that, the stricter decoder starts failing, and the forgiving one gives up around 0.7.

Ink spread (dot gain, or “bar gain” in GS1’s glossary) makes dark modules bigger and light modules smaller. Uncoated paper, absorbent board and some press setups spread more than coated stock. GS1 defines bar gain as “the increase/decrease in bar width due to effects of the reproduction and printing processes.”

The ink spread test

I grew and shrank the dark modules of a Version 2, level M code by a share of one module width, with rounded corners like real ink. Each setting went through 40 simulated phone captures (random scale, tilt, sub-pixel shift, lens blur and sensor noise). I decoded with zxing-cpp 3.1.1, an open-source decoder used by apps such as Binary Eye, and OpenCV 5.0’s QR detector as a stricter second opinion. Both read the unchanged code 40 out of 40 times.

Ink change (share of a module) zxing-cpp OpenCV
-0.4 (ink loss) 40/40 15/40
-0.3 40/40 37/40
0 (as designed) 40/40 40/40
+0.3 40/40 39/40
+0.4 40/40 30/40
+0.5 40/40 4/40
+0.7 26/40 0/40
+0.8 1/40 0/40
QR code printing ink spread test: both decoders reliable to 0.3 of a module of gain, OpenCV 4 of 40 at 0.5

What I take from it:

  • Gain is the bigger risk for the forgiving reader. zxing-cpp read every trial even at -0.7 ink loss, but failed at +0.7 gain. Spreading ink closes the light gaps between modules, and those gaps carry half the data.
  • The stricter reader breaks both ways. OpenCV dropped to 15/40 at -0.4 and 4/40 at +0.5. Your customers’ phones sit somewhere between these two decoders.
  • The share is what counts, not the millimetres. The same 0.1 mm of spread is 0.4 of a 0.25 mm module (risky) but only 0.2 of a 0.5 mm module (safe). That’s the clearest reason to print bigger modules.

Bar width reduction: shrink the file to cancel the spread

Bar width reduction (BWR) means printing the dark parts slightly smaller in the file, so the press spread brings them back to size. GS1 describes it for linear barcodes: “Bar gain will mean that the printed bars are wider than those of the master image, so the master image will need to be adjusted to compensate.” GS1 doesn’t prescribe it for QR codes, so I tested it.

Bar width reduction test: pre-shrinking modules 0.4 restored OpenCV from 0 to 38 of 40 at 0.7 ink gain

At +0.7 gain, OpenCV read 0/40 with no compensation, 3/40 with 0.2 of a module pre-shrunk, and 38/40 with 0.4. zxing-cpp went from 24/40 to 40/40 with just 0.2.

Limitation: BWR only helps when you know the spread. Pre-shrink a file for a press that doesn’t spread, and you’ve created ink loss instead. Ask the printer for their measured gain on your stock, or print a proof first.

Can You Print QR Codes on a Thermal Label Printer?

Yes. Printing QR codes on a thermal label printer works well if each module is at least 3 printer dots wide, and 4 is safer. That matches Denso Wave’s own advice: it “recommends for stable operations that each module is made up of 4 or more dots.”

A thermal printer burns whole dots. Zebra’s ZPL guide says it plainly: “only full dots are printed.” A 203 dpi printer has 8 dots per millimetre (0.125 mm per dot), so a 0.5 mm module is exactly 4 dots. A 0.4 mm module is 3.2 dots, and the printer has to mix 3-dot and 4-dot modules.

Most guides tell you to avoid those uneven modules. My test says that’s the smaller problem. I snapped each module to the 203 dpi dot grid, then added “burn” (the extra dark width a hot or worn head adds) in printer dots.

Thermal label QR test at 203 dpi: 4 dots per module survived burn, 2-dot modules failed at 1.5 dots
  • Uneven modules weren’t the problem. Mixed 2-and-3-dot modules (2.64) scored between the whole-dot 2 and 3 rows, and mixed 3-and-4 (3.2) stayed within a few trials of the 3-dot row.
  • Dots per module decided everything. With 1.5 dots of burn, 2-dot and 2.64-dot modules failed completely on both readers. 3 dots held 40/40 on zxing-cpp, and 4 dots held 32/40 even on OpenCV.
  • At 2 dots of burn, only 4-dot modules kept a perfect 40/40 on zxing-cpp.

So my rule for 203 dpi labels: 0.5 mm modules (4 dots). On a 300 dpi printer, 0.42 mm (5 dots) is Denso Wave’s own worked example.

Limitation: my burn model grows dots evenly. Real heads can also fade along one edge, and direct thermal labels darken with heat and sunlight over time. The print-fade test shows how fading erodes contrast.

How Do You Print a QR Code on a Bottle, Can or Curved Surface?

Keep the code’s printed width, quiet zone included, under 0.9 times the diameter of the curve. I’d aim for 0.6 to leave room for real-world angles.

Wrapping a code around a cylinder squeezes the modules near the edges as they turn away from the camera. Those edge modules also get darker, because the surface faces away from the light. GS1 has curved-surface rules for linear barcodes, with a “ladder orientation (Preferred for all curve surfaces)”. It has no diameter rule for 2D codes, so I measured one.

QR code on a curved bottle: both decoders read every width up to 0.9 times the cylinder diameter

Both readers read 39 to 40 of 40 trials up to a width of 0.9 x the diameter (the code covers about 103 degrees of the curve). OpenCV dropped to 36/40 at 1.0 and 0/40 at 1.1. zxing-cpp held to 1.1, then fell to 31/40 at 1.2 and 6/40 at 1.3.

In practice, a 60 mm can takes a code up to about 54 mm wide by the test, or 36 mm by my margin rule. A 20 mm vial fits only a 12 mm code by my rule, so it needs a short payload and small, crisp modules.

Limitation: this test views the curve head-on with no perspective. A phone held close to a narrow bottle sees perspective too, which squeezes the edges further. Treat 0.9 as the absolute limit, not the target.

QR Code Placement: Where Should It Go on Printed Material?

Place a QR code flat, well lit, within reach of a phone, and away from folds, seams and edges. Placement fails more prints than ink does, because a perfect code on the wrong spot still can’t be scanned.

Medium Put it Avoid
Flyer or leaflet Bottom-right panel, beside the call to action The fold line and the trim edge
Poster Around eye height, near the headline offer Near the floor, where people won’t crouch
Packaging The flattest panel, facing the shopper Seams, glue flaps, corners and tight curves
Product label Its own clear area beside the brand Sitting against the retail barcode
Table tent or menu The face toward the seat Glossy lamination under a ceiling light
Window or glass Printed for viewing through the glass Reflections and a dark interior behind it
Business card Back of the card, with a one-line prompt Full-bleed glossy finishes

Three placement rules I never skip:

  • Give the code a job and a label. “Scan for the menu” beats a bare code. People scan when they know what they’ll get.
  • One code per placement. Each placement gets its own short link with a different utm_content value. Then QR code tracking tells you whether the poster or the flyer did the work.
  • Fight glare at the design stage. Gloss and lamination reflect light straight into the camera. The business card glare test shows how a hotspot kills a scan. Matte finishes reduce it.

Limitation: placement advice is the least testable part of printing. Light, mounting height and crowd flow change by venue. Walk the actual space with a phone before you approve the final position.

QR Code Printing Checklist: How to Prepare a Code for Press

Here are the steps I follow before a QR code goes to press:

  1. Encode a short link instead of the full URL, so the code stays at a low version with bigger modules.
  2. Choose the module size for your print method: 0.5 mm by default, 0.4 mm as the floor on a press, 4 printer dots on thermal labels.
  3. Calculate the printed width as module size x (modules + 8) and confirm it fits the space, including the quiet zone.
  4. Export a vector SVG or PDF with the modules in 100% K and no effects, placed at 100% scale.
  5. Ask the printer for their ink spread on your stock and apply bar width reduction only if they confirm a spread.
  6. Check curved surfaces: keep the code width under 0.9 x the diameter, ideally 0.6.
  7. Print a proof on the real material at full size and scan it with at least three phones before you approve the run.

The weak spot in any checklist is step 7, because it’s the one people skip under deadline. Don’t. A proof costs one sheet. A reprint costs the whole run. If a proof fails, work through the QR code not scanning guide symptom by symptom.

What This Test Doesn’t Tell You

My test is a simulation, so here’s what it can’t cover:

  • Two decoders, not every phone. zxing-cpp and OpenCV bracket the range, but iPhone and Samsung camera apps use their own decoders.
  • One code. Version 2 at level M. A dense Version 10 code has smaller modules at the same size and will fail sooner.
  • Idealised physics. Even spread, an even dot grid, a head-on cylinder. Real presses spread unevenly, and real labels wrinkle.

The pattern still holds: measure everything against the module. Bigger modules survive more of everything.

Frequently Asked Questions

What file format should I send to a printer for a QR code?

Send a vector SVG or PDF. Vector files describe each module as an exact shape, so the code prints sharp at any size without resampling. Set the modules to 100% K and place the file at 100% scale. Only fall back to PNG when the printer can’t take vector, and size it in pixels for the final print.

Can you print a QR code on a curved bottle or can?

Yes, if the code is narrow enough for the curve. In my test, both decoders read every trial with the code width up to 0.9 times the diameter. OpenCV failed completely at 1.1. Aim for 0.6 to leave room for perspective and hand angle, and keep the code on the flattest part of the container.

Can I print QR codes on a thermal label printer?

Yes, and they scan well when each module is at least 3 printer dots wide. Denso Wave recommends 4 or more dots per module. On a 203 dpi printer, that’s a 0.5 mm module. In my test, 2-dot modules failed completely with 1.5 dots of burn, while 4-dot modules kept scanning.

Should a QR code be printed in rich black or 100% K?

Print QR codes in 100% K (CMYK 0/0/0/100). Rich black uses four ink plates, and any misregistration adds coloured edges to every module. 100% K prints from one plate, so the edges stay crisp. Check that your layout software hasn’t converted the black to rich black on export.

Does uncoated paper affect QR code printing?

Yes. Uncoated paper absorbs more ink, so the dark modules spread more than on coated stock. In my test, both decoders stayed reliable up to 0.3 of a module of gain. Use bigger modules on uncoated stock, ask the printer for their measured spread, and print a proof on the real paper before the run.

Where should a QR code go on a poster or flyer?

Put it next to the call to action, on a flat area, at a height people can reach with a phone. On a flyer, the bottom-right panel works well if it isn’t on a fold. On a poster, keep it around eye height rather than near the floor. Always add a short line saying what the scan opens.

Printing locks the code forever. If the URL inside it changes, the whole run is scrap. That’s why I print dynamic codes: the printed code points at a short link, and I can repoint the link after printing without touching the ink.

Recap of the print rules:

  • Pick the module size first: 0.5 mm by default, 0.4 mm as the floor.
  • Send vector files in 100% K.
  • Keep ink gain under 0.3 of a module, or pre-shrink the file.
  • Use at least 3 printer dots per module on thermal labels, ideally 4.
  • Keep the code under 0.9 x the diameter on curves, and place it flat, lit and off the folds.
Create a dynamic QR code with linkutm to change the destination after printing and see which placement gets scanned. It’s the cheapest insurance on any QR code printing job.
Bhargav Dhameliya

About Bhargav Dhameliya

Share this article

Ready to track your campaigns better?

Join thousands of marketers who use linkutm to build, track, and manage their marketing campaigns with ease.

Get Started for Free