Skip to content
VixQR

By the VixQR team · published on · 10 min read

How to Print QR Codes That Actually Scan: A Prepress Guide

Why printed QR codes fail: RGB black, raster exports, the wrong error correction. The prepress workflow and proofing protocol that prevent a costly reprint.

A print proof sheet with a QR code being checked against the production paper stock before the run

A QR code that scans perfectly on your monitor and fails on the finished flyer is not bad luck. It's a workflow problem, and it happens at a predictable set of points between the generator and the press.

The frustrating part is that every one of those points is invisible until the boxes arrive. The code looked fine in the layout. It looked fine in the PDF proof. It looks fine on the printed sheet, to a human eye. It just doesn't scan.

Here's each failure mode, why it happens, and the workflow that avoids all of them. Sizing is a separate topic with its own arithmetic — we covered it in the QR code size and scan distance guide — so this piece assumes you've got the dimensions right and deals with everything else.

Failure 1: you exported a raster file

The most common one, and the easiest to fix.

PNG and JPG are raster formats: a fixed grid of pixels. Enlarge one past its native resolution and the software has to invent the pixels in between, which turns the hard black-to-white edges of a QR code into soft grey gradients. Those edges are precisely what the scanner's decoder depends on.

Print QR codes are vector. SVG, PDF and EPS describe the modules as mathematical shapes. They render at the output device's native resolution whether the code is 2 cm on a business card or 2 metres on a banner. There is no resolution to run out of.

If your workflow genuinely requires raster, the arithmetic is: pixels = print size in inches × target DPI.

Final print size At 300 DPI At 600 DPI
2 cm (0.8 in) 240 px 480 px
5 cm (2 in) 600 px 1,200 px
10 cm (4 in) 1,200 px 2,400 px
20 cm (8 in) 2,400 px 4,800 px

Most web generators export PNG at 72 DPI, often at 200 or 400 px square. At 300 DPI, a 400 px file prints crisply at 3.4 cm and no larger. That mismatch is the origin of a large share of blurry printed codes.

Which DPI:

  • 72 DPI — screen only. Never print.
  • 150 DPI — acceptable for large format viewed from 2 m or more.
  • 300 DPI — the standard for anything read at arm's length: cards, flyers, packaging, labels.
  • 600 DPI — preferred for codes under about 2 cm, where module edges are tiny.

Never JPG. JPEG's lossy compression produces artifacts specifically at sharp transitions between light and dark — which is the entire structure of a QR code. The damage is baked into the file and invisible at 100% zoom. PNG is lossless; if you must use raster, use PNG.

And never scale a raster code up in the layout. Regenerate it larger, or switch to vector.

Failure 2: your black isn't black

This one is genuinely obscure, and it ruins expensive print runs.

You design in RGB. Your QR code is #000000 — as black as black gets. You send the file to a commercial printer, whose RIP converts it to CMYK. And RGB 0,0,0 doesn't convert to a clean single-plate black. It converts to something close to C:75 M:68 Y:67 K:90 — a rich, four-colour black that uses every plate on the press.

Press registration is never perfect. The cyan, magenta and yellow plates drift a fraction of a millimetre against the black plate. That drift produces a faint coloured halo around every dark module, and the halo eats into exactly the contrast the scanner is reading.

The result is a code that looks deep and rich to a human eye and reads as mush to a camera.

The fix takes ten seconds: specify spot black. C:0 M:0 Y:0 K:100. A single plate, no registration risk, no contamination. Every commercial printer handles K=100 cleanly — it's the lightest ink-coverage route to a solid dark.

Your background should be C:0 M:0 Y:0 K:0 — pure paper white.

Verify it, don't assume it. In InDesign, Illustrator or Affinity, open the Separations Preview and switch off every plate except K. The QR code should still be fully there. If any part of it appears on the C, M or Y plates, your conversion didn't do what you thought.

If brand colours are non-negotiable, check the CMYK values maintain at least 4:1 contrast against the background — pastels routinely fail this after conversion, having looked perfectly fine in RGB.

Failure 3: the wrong error correction for the substrate

Error correction adds redundant data so the code decodes even when part of the pattern is damaged or obscured. Four levels:

Level Recovery When to use
L 7% Digital only. Not for print.
M 15% Screen-projected codes; clean coated stock above 1.5 in, no logo.
Q 25% The print default. Cards, flyers, packaging, signage, direct mail.
H 30% Logo overlay, hostile substrates, outdoor.

Q is the baseline for print. It absorbs minor print imperfections, ink absorption variance and a slightly shaky hand at scan time.

Go to H when:

  • There's a logo in the centre. A logo covers roughly 10–15% of the pattern — L and M cannot tolerate that, and the code will decode inconsistently rather than failing outright, which is worse because your test scan passes.
  • The substrate is absorbent or diffusing: matte uncoated, kraft, soft-touch laminate, fabric.
  • The code goes outdoors, where UV fade degrades contrast over 6–12 months.

There's a trade-off, and it matters at small sizes. Higher error correction adds modules at the same physical dimensions, which makes each individual module smaller — harder to resolve, not easier. At the size floor, bumping from Q to H can make things worse.

The way out is upstream: shorten the payload. A 30-character URL produces a far sparser grid than a 240-character vCard at identical print dimensions. Strip UTM parameters, use a short path on your own domain, trim vCards to the fields that matter. A simpler pattern beats a bigger code at every size.

Failure 4: the paper fights you

Substrate behaviour is real and rarely considered until it's too late.

Matte uncoated absorbs ink. The dark modules fatten as ink wicks into the paper fibre — printers call it dot gain — and the boundary between dark and light blurs. Net effect: the dark gets darker but the edge gets softer, and edge definition is what the decoder needs. Compensate with error correction at Q minimum, H at small sizes, and add 10–15% to the print size if you have layout room.

Glossy coated throws glare. The code is crisp but a highlight across it blanks out modules under direct light. Consider a matte laminate over the code area, or move it away from where overhead lighting will reflect.

Kraft and recycled stock reduce contrast because the background isn't white — it's tan. Your effective contrast ratio drops before anything else goes wrong. Increase the size, use H, and test early.

Fabric and apparel distort with the weave and with stretch. Print substantially larger than the guideline, use H, and expect a lower success rate regardless.

Curved surfaces — bottles, tubes, cans — bend the module grid out of plane. Keep codes on the flattest available panel, and test on the actual filled container, not a flat proof.

Failure 5: something crowded the quiet zone

Every QR code needs a clear margin around it — the quiet zone — so the scanner can find where the pattern starts. ISO/IEC 18004 specifies at least four modules' width on all four sides.

Generators include it. Designers then remove it, because in a tight layout it looks like wasted white space.

Concretely: a 3 cm code with a 29×29 grid has modules of about 1 mm, so the quiet zone is about 4 mm. Allow 4–5 mm of genuinely clear space — no text, no rules, no photo edges, no folds, no perforations.

The bleed trap. Bleed is a separate requirement: 3 mm of artwork past the trim edge to absorb cutting variance. If the code sits near the edge of a card, the quiet zone has to survive after trimming. Practical rule: keep QR codes at least 8–10 mm from any trim edge — 3 mm bleed plus a 5 mm quiet-zone margin.

Mark the quiet zone as a non-printing guide layer and treat it as a no-go region. A 1 mm intrusion can be enough to break scanning in poor light or at an angle.

Failure 6: the code got stretched

A QR code must be a perfect square. Non-uniform scaling — even slightly wider than tall — makes the module grid non-square, and most decoders give up.

It happens when someone drags a corner handle without holding the constrain modifier, or drops the code into a frame set to "fill". Lock the aspect ratio. Check it in the final layout.

The workflow, start to finish

  1. Generate at the right error correction for the substrate. Q for standard print, H for logos, uncoated, kraft or outdoor.
  2. Export SVG or PDF. Only fall back to PNG if the workflow demands it, and then compute the pixel dimensions from the final print size.
  3. Place into a CMYK document. Set the document colour mode to CMYK before placing.
  4. Set the QR fill to K=100, C/M/Y=0. Background to K=0.
  5. Confirm in Separations Preview that the code appears only on the K plate.
  6. Size it in the layout, in millimetres, at final scale — not by eye on screen.
  7. Reserve the quiet zone as a locked guide, 4–5 mm minimum, 8–10 mm from any trim edge.
  8. Lock the aspect ratio.
  9. Export with crop marks and 3 mm bleed.
  10. Proof on the production stock. Then read the next section, because this is the step people skip.

The proofing protocol

Never approve a run from an on-screen preview or a PDF. A PDF proof tells you nothing about ink behaviour on paper.

Print one copy at final size, on the actual production material. Not office paper standing in for uncoated card. The substrate is half the variables.

Scan it with at least three phones. A current iPhone, a mid-range Android, and something older or cheaper. Budget camera sensors fail first, and they're disproportionately common among the people you're trying to reach. If it only scans on the newest handset, it doesn't work.

Test in the real lighting, at the real distance, at the real angle. A code that scans on your desk under a lamp can fail in a dim restaurant, or under direct sun that turns a glossy finish into a mirror. If it's going on a table tent, put it on a table. If it's going in a window, check it with the sun behind it.

Test after handling. Fold it, put it in a pocket, get it slightly damp if the real code will live somewhere that happens.

When a proof fails, diagnose in this order — it's roughly the order of likelihood:

  1. Raster export enlarged past its resolution → switch to vector
  2. RGB black converted to four-colour black → specify K=100
  3. Error correction too low for the substrate → bump to Q or H
  4. Print size at or below the floor → increase 10–15%
  5. Quiet zone crowded → add clear margin
  6. Substrate issue → adjust ECC, size, or change stock
  7. Code stretched → restore the square aspect ratio

Home and office printers

If you're printing yourself: use the highest quality setting, print at actual size, and turn off "fit to page". Auto-scaling is what silently shrinks a code below its scannable minimum, and it's on by default in most print dialogs.

Inkjet and laser both handle QR codes well. Inkjet on absorbent paper shows more dot gain, so give it the same treatment as uncoated stock: more error correction, slightly larger.

The one that isn't a printing problem

A code can be perfectly printed and still be a failure if the destination breaks. Barcode verification tells you the pattern decodes; it tells you nothing about whether the URL still works.

If the code points at a rented redirect service, the printed run is hostage to that subscription. Print is permanent and subscriptions are not — a lapsed account can invalidate ten thousand flyers that are otherwise flawless.

Point printed codes at a URL on a domain you control. Then the destination can change forever without touching the print.

VixQR generates QR codes free in your browser, with SVG and PDF export sized for print and no account required. The SVG is the one to hand your printer.

All articles