How to put multiple different QR codes on one sheet

Last updated: July 2026 · About 6 minutes

Individual files are right when each code goes somewhere different — into a label template, a mail merge, a design file. But when you want to print and cut, forty separate PNGs is forty placements. Setting QR codes per image above 1 combines them into labelled sheets instead, ready to print directly.

This is the sibling of printing a sheet of identical codes. That guide covers many copies of one URL. This one covers many different URLs on a shared sheet — a contact sheet.

Doing it

  1. Load your URLs by any of the three input methods
  2. Set QR codes per image to how many you want per sheet
  3. Leave Print a label under each QR code ticked
  4. Choose the size of each individual code, not the sheet
  5. Generate

The ZIP contains qr_codes_batch_1.png, qr_codes_batch_2.png and so on. Codes are distributed in order: with 50 URLs and 12 per image you get four full sheets and a fifth holding the last two.

How the grid gets chosen

The layout is worked out for you, aiming at square. The number of columns is the square root of the count, rounded up, and rows follow from that. Which produces:

Codes per image Grid Shape
42 × 2Square
63 × 2Landscape
93 × 3Square
124 × 3Landscape
164 × 4Square
205 × 4Landscape
255 × 5Square

Perfect squares — 4, 9, 16, 25 — give clean square sheets. Other numbers give a wider-than-tall grid with the last row partly empty if the count does not divide evenly.

There is no way to force a specific column count, so pick a per-image number whose natural grid suits your paper. For portrait A4 or Letter, 12 (4 × 3) and 20 (5 × 4) both sit well.

Labels are what make this usable

Twelve QR codes on a page are visually identical. Without labels you cannot tell which is which, and you cannot check a sheet before cutting it. The label strip is the reason this feature is worth using.

Each label shows the filename you supplied, falling back to the URL if you did not supply one.

That fallback is worth planning around. A full URL under a small code gets truncated with an ellipsis when it does not fit, so a set of long URLs sharing a prefix can produce labels that all read https://example.com/very-lo… and distinguish nothing. Supply short, meaningful filenames — room-101, badge-ada — and the sheet becomes checkable at a glance.

The label strip scales with the code size, so text stays proportional at 300, 600 or 1000 px.

SVG is not available here

Combined sheets are composed on a canvas, which is a raster surface, so the output is always PNG. The format selector disables itself when codes per image is above 1 and tells you why.

If you need vector output — for large-format printing, or because your print shop asked for it — set codes per image back to 1, generate individual SVG files, and lay them out in your design software. You get vector quality and full control of the grid, at the cost of doing the placement yourself.

Choosing the size of each code

The size setting controls each individual code, not the finished sheet, so the sheet's pixel dimensions are the code size multiplied by the grid. Nine codes at 600 px produce an image around 1800 px across.

Work from the finished physical size. If each code needs to be 2.5 cm on the printed page, 300 px is right at 300 DPI — sizing for print has the arithmetic. Choosing 1000 px for a code that will print at 2.5 cm produces an enormous file for no benefit.

When individual files are better

Combined sheets are the wrong choice when:

The reverse case — print, cut, and hand out — is exactly what sheets are for. Workshop station codes, shelf-edge labels, classroom desk tags, market stall signage.

Print the sheet without resizing it

Set your PDF or print dialog to 100% / actual size. "Fit to page" silently rescales, which changes the physical size of every code and can push small ones under the reliable threshold. Turn off any "shrink to fit margins" option too.

Print one sheet, scan two or three codes from it at the real distance, and confirm the labels match where they actually go before running the rest.

Codes fill the grid in input order, so sort your spreadsheet before generating. Sorted input means sheet 1 holds rooms 101–112, which is much easier to distribute than an arbitrary scattering.

Open the generator