Printing a QR code that still scans
Last updated: 11 September 2026
A menu, a shipping label and a shop-window poster fail in different ways. The matrix is the same; the paper, the distance and the proof are not. Mark draws the file on the homepage. This page is how you put it on stock — and how you read a photograph of that stock without opening the camera.
File type
For a code without a logo, download SVG from the generator and place it in the layout at the size you will print. Vectors keep module edges sharp at A2. With a logo, use PNG at 1024 pixels and do not upscale it further in the layout program — generate 1024 in Mark instead. A 256 PNG stretched to a window sticker is a blur the camera cannot lock. Do not export the live preview as a screenshot; the screenshot is a photograph of a UI, often with browser chrome and the wrong colour profile.
If the print shop wants a JPEG, convert the PNG or SVG on your machine so you see the quality. Their “optimize for web” is another recode. The Files versus Photos split on iPhone is a different page — iPhone — because Photos may flatten the square before the shop ever sees it.
Physical size
A rule of thumb: about 2 cm minimum for a short URL at arm’s length, 3–4 cm if you added a logo or used a denser payload, larger still for a poster across a room. Distance roughly scales the side length. If people will scan from a metre away, do not use a 2 cm mark. Event lanyards fail when the badge is 12 mm of modules under a lanyard clip; packing labels fail when the courier photographs a 15 mm code through film. Print a proof at the real size, not “fit to page” on A4.
Stock and ink
Uncoated kraft swallows contrast. Print darker modules or put a white patch behind the code. Metallic ink and heavy gloss lamination specular-highlight the modules; matte is kinder. Never reverse a QR (light modules on a dark field) unless you have tested that exact camera. Mark’s warning is about screen contrast; paper is another variable. Warm restaurant LEDs shift yellow ink into the modules. Outdoor vinyl in noon sun is a different test than the laptop preview.
Quiet zone in the trim
Leave a blank collar. If the die-cut kisses the finders, the camera has nothing to lock onto. Set margin to 8 modules if the printer is aggressive. Do not set type or a colour block inside that collar. A foil stamp that overlaps a finder is a decorative way to make a dead code. Crop marks belong outside the quiet zone, not through it.
Proof is a photograph of the paper, not a stare at the monitor
Print one copy. The old advice was “scan with a phone that is not yours.” That still holds as a field test. What this page adds is a second proof that does not require a camera permission: photograph the printed square, drop the photo below, and read the payload string in this tab. If jsQR cannot find modules on a well-lit, full-frame JPEG of the stock, a guest phone will not either. Fix contrast or size before the run.
Outdoors and under the restaurant’s warm LEDs still matter — the dropzone does not replace a second device. It replaces the gap where this site used to tell you to scan and then offered no reader. A code that only works on your laptop preview is not finished.
This is not a live camera scanner
Mark does not call getUserMedia. There is no /scan, no /decode URL, and no viewfinder. About still says we do not scan other people’s codes with the camera. The control below reads a file you already have: a PNG, JPG or WebP of paper (or of a screen, if you must). HEIC from Camera Roll is rejected on purpose. SVG of the original mark is the generator’s job, not this reader’s. We do not window.open whatever payload comes back — a sticker can be a phishing URL. Copy the string, then decide.
WhatsApp photo-send of the print is a recode of a recode. If you must send the proof, send the photograph as a document or keep it in Files. The chat flatten is documented on WhatsApp. Android Camera versus Lens is Android. This page stays on stock and on the photo of stock.
What the reader actually returns
The payload is the string Mark encoded: a URL, a WIFI:T:… block, a vCard, mailto, tel, SMSTO, or plain text. Finder patterns and error correction are how jsQR locates the grid; you do not edit them here. A logo that ate the finders will fail here the same way it fails a phone. Dense payloads on a small print fail here the same way. The reader is a proof of the object, not a repair shop.
The ceiling
Mark cannot patch a courier’s camera. Mark cannot un-laminate gloss. Mark cannot invent modules the die-cut removed. Mark cannot read a photo of a photo of a chat bubble and promise the same bytes the generator wrote. If the dropzone says no QR found, relight and refill the frame, or reprint larger. If you needed a live viewfinder, that is a different product with a device API this site will not wrap.
Steps
- Encode on the homepage. SVG without a logo; PNG at 1024 with a logo.
- Keep the quiet zone. Put a white patch on kraft if contrast dies.
- Print one copy at the real size.
- Photograph the printed square. Drop that JPEG or PNG in the box below.
- Copy the payload. Confirm it is the string you typed. Then test a second phone in the real light.
What looks like a bug and is not
A payload that looks like a URL but does not navigate is intentional — we will not open it. A HEIC reject is input type, not a failed print. An empty drop after a PDF is the wrong file class. Soft edges on a screenshot of the generator are the screenshot. A WIFI string that a phone will not join is often a typing error in SSID or a hidden-network flag — guest notes live on guest WiFi.
Honesty limits
We do not certify ISO print densities. We do not run a press. The photograph never leaves this tab. Closing the tab drops the bitmap and the payload string. Encode stays on the homepage; this URL does not mount the generator.
Read a photo of the printed mark
Drop a PNG, JPG or WebP of the paper. jsQR runs in this tab and shows the payload string. There is no camera, no upload, and we do not open the URL for you — a printed code can be a trap.