Adobe InDesign · a panel for Windows and macOS

QR Generator Plus

Vector QR codes straight in InDesign, in your document colours, with or without a logo — one at a time, or hundreds at once from an Excel sheet. Every code is checked by a scanner before it lands on the page.

Runs on InDesign 18.5 and newer System Windows and macOS, one install Version 1.0.0 Line Zalesky Workflow

Getting started

Installing is a double click. The panel then lives in the Plug-Ins menu.

Installing

  1. Quit InDesign.
  2. Double click the .ccx file. Creative Cloud installs it for you.
  3. Start InDesign.

Where to find it

Plug-Ins → Zalesky Workflow → QR Generator Plus opens the panel.

The panel docks or floats like any other InDesign panel, and InDesign remembers its size and place.

Your first QR in ten seconds

Open a document, type a web address into Website URL and click Create QR. A 35 mm black QR lands in the middle of the active page, on a layer called QR codes. One Ctrl+Z takes it away again.

The panel

A preview on top, five tabs, two buttons at the bottom.

The QR Generator Plus panel on the Content tab, with a live QR preview at the top. 1 2 3 4 5 6
The panel in InDesign's dark theme. These are real screenshots of the panel.
  • 1Load selected — reads the selected QR back into the panel
  • 2Live preview — exactly what will be placed
  • 3Module count, margin, status and warnings
  • 4Tabs: Content, Style, Logo, Place, Batch
  • 5The settings of the active tab
  • 6Create QR and Update selected

The preview and the scan check

Every change redraws the preview within a tenth of a second. The panel then reads the preview with a QR decoder, exactly like a phone would. Only when the decoded text matches what you typed does it say Ready — automatic scan check passed, and only then can you click Create QR.

The check catches the real mistakes: a logo that covers too much, a colour with too little contrast, a QR colour identical to the background.

The scan check is not a print proof

It proves the code is readable on screen. Paper, size, ink and varnish can still spoil it. Scan a printed proof with a phone before a big run — especially when there is a logo in the middle.

Content: QR types

Choose what the code does, fill in the fields.

QR type at the top of the Content tab decides which fields appear below it. Required fields are marked with *. The grey text inside an empty field is only an example — it is never used.

Czech QR payment with IBAN, amount, currency and symbols.
Czech QR payment: the fields of QR Platba, read by every Czech banking app.
Wi-Fi QR with network name, security, password and hidden network.
Wi-Fi: phones join the network without typing the password.
QR typeWhat the phone does
Website URLOpens the web page.
Plain textShows the text; it can be copied.
Business card (vCard)Offers to save a full contact: name, company, phones, e-mail, web, address.
Compact contact (MECard)Saves a short contact. Makes a smaller, less dense code than vCard.
EmailOpens a new e-mail with the recipient, subject and message filled in.
Phone callOffers to call the number.
SMSOpens a text message to the number, with the message prepared.
Wi-FiJoins the Wi-Fi network without typing the password.
LocationOpens the place in the map app.
Calendar eventAdds the event to the calendar.
WhatsAppOpens a WhatsApp chat with the number and the message prepared.
FaceTimeStarts a FaceTime call (Apple devices).
Czech QR paymentCzech banking apps fill in the payment (QR Platba / SPD).

When something is missing

Click Create QR with a required field empty and the panel jumps to the Content tab, marks every missing field in red and puts the cursor into the first one. The status line says what is wrong in plain words — an invalid e-mail, an IBAN with a wrong checksum, an event that ends before it starts.

A vCard with the Last name field marked red as Required.
Missing required fields are marked in red.

Switching types keeps what you typed

Every type remembers its own fields while the panel is open. Switch from vCard to Wi-Fi and back and the contact is still there.

Formats worth knowing

  • Web addresses must start with http:// or https://.
  • Phone numbers with the country code; spaces, dashes and brackets are fine: +420 777 123 456.
  • Dates as 2026-10-15 or 15.10.2026, with time 2026-10-15 09:00 or 15.10.2026 9:00.
  • Czech QR payment needs a Czech IBAN (CZ + 22 digits). The panel checks its checksum.

Style: colours and size

Document swatches, any unit, a safe margin.

The Style tab with QR colour, background, size, margin and units.
SettingWhat it does
QR colorColour of the dark modules. The list shows the swatches of the active document — spot colours included — so the QR prints on the plate you expect.
BackgroundThe square behind the code. None makes it transparent; the panel then warns that readability depends on what is underneath.
Size + unitThe outer size of the square, margin included. Millimetres, centimetres, points, picas, inches or pixels.
Margin + unitThe quiet zone inside the square — the empty border a scanner needs.
The 4-module minimum

A scanner needs an empty border at least four modules wide. InDesign always keeps it, so when your margin is smaller the real one is shown next to the preview, for example margin 4.24 mm (4-module minimum). That is information, not an error.

Added a new swatch to the document? Click Refresh document swatches on the Place tab. The panel also refreshes by itself whenever you switch documents.

Place and presets

Where the QR goes, and settings you use again.

The Place tab with Insert into, Refresh document swatches and presets.

Insert into

OptionResult
Center of active pageA new square frame of the chosen size in the middle of the page you are looking at, on the QR codes layer.
Selected graphic frameThe QR goes into the empty graphic frame you selected. The frame keeps its size and position; the QR stays square and centred, so its size is the shorter side of the frame and the Size field is locked.

Select an empty graphic frame and the panel switches to Selected graphic frame by itself. Draw placeholders in your layout first, then fill them one by one. The frame must not be rotated or sheared, and neither the frame nor its layer may be locked.

Presets

  1. Set up a QR the way you want it.
  2. Type a name into Preset name and click Save current.
  3. Later choose it in Saved preset and click Apply.

A preset stores the QR type and its content, the swatch names, size and margin, the logo settings and a logo file. A logo taken from a selected object cannot be stored — choose it again after applying. Saving under an existing name overwrites it. Presets live in the panel on your computer, not in the document.

Create and update

One click to place, one click to change, one Undo either way.

What lands in the document

A square graphic frame. Inside it: the background square, InDesign's own vector QR code and, if you use one, the logo on its padded square. Everything is vector, uses your swatches and separates correctly.

The frame also carries the complete settings it was made with, invisible. That is what lets the panel open it again later.

Changing an existing QR Plus

  1. Select the QR frame.
  2. Click Load selected. The type, content, colours, margin and logo come back into the panel.
  3. Change what you need.
  4. Click Update selected.

The QR is rebuilt in the same frame, at the same place and size. The embedded logo is kept even if the original file is gone. One Ctrl+Z returns the previous version.

Nothing half-done

The new QR is built completely before the old one is removed. When anything fails on the way — a missing swatch, a locked layer — the document stays exactly as it was and the status line says why.

InDesign's own QR codes

Codes made with Object → Generate QR Code can be read and upgraded too.

Documents often contain QR codes made with InDesign's built-in Object → Generate QR Code…. The panel can read them: select the frame and click Load selected.

1 · SelectA frame with a QR code made by InDesign.
2 · Load selectedThe panel scans the code and fills in its content.
3 · EditChange the address, colour, margin, add a logo.
4 · Update selectedThe frame now holds a QR Plus.
The panel after loading a native InDesign QR: the web address is filled in and Update selected is available.
A native InDesign QR read back into the panel.

What is read

  • The content. A web address opens as Website URL; anything else opens as Plain text with the exact text of the code, so the new QR encodes the same thing.
  • The colour. The panel measures the colour of the code and picks the nearest document swatch.
  • The size. Taken from the frame; the new QR fills the same frame.

From then on it is an ordinary QR Plus: Load selected brings back all its settings next time.

It has to be readable

The code is read from a rendered image, just like a phone reads it. A QR that is cropped, rotated, covered or printed too pale may not be recognised — the status line then says the graphic does not contain a readable QR code.

Batch generation

Hundreds of QR codes from one Excel sheet, laid out on new pages.

The Batch tab turns every row of a spreadsheet into one QR code and lays them out in a grid — or one per page — on pages added to the end of the document. Colours, margin and logo come from the Style and Logo tabs, so set up one QR the way you like it first.

The whole job in six steps

  1. Set the look on the Style and Logo tabs.
  2. On the Batch tab click Save template… and save an Excel file. Fill it in (see below).
  3. Click Choose CSV or Excel… and pick your file. It is checked right away.
  4. Tick Preview layout on the active page (above the buttons at the bottom) and adjust size, gaps and captions until the page looks right.
  5. Click Preflight. Fix any rows it reports.
  6. Click Create batch.
The Batch tab with a chosen file, the preview switched on and the Data and Caption sections. 1 2 3 4 5
On the Batch tab the preview at the top only reminds you where the content comes from.
  • 1Your file, and Save template…
  • 2The layout preview switch — always visible above the buttons
  • 3Data — type, duplicates, prefix and suffix
  • 4Caption — text under each QR
  • 5Preflight and Create batch

Data

SettingWhat it does
QR type for rows without “type”The QR type used by every row whose type cell is empty — or by all rows when the file has no type column. A file with nothing but web addresses needs just a url column and Website URL here.
DuplicatesKeep all — every row becomes a QR. Skip repeated rows — a row identical to an earlier one is left out. Create once per QR content — rows that produce the same code are made only once, even if their captions differ.
Content prefix / suffixText added before and after the first field of every row — for a URL type, the address. With the prefix https://example-shop.cz/p/ the spreadsheet only needs A123 and the QR opens https://example-shop.cz/p/A123. A suffix like ?utm_source=leaflet tags every link.

Tokens

Prefixes and suffixes — also those of the caption — may contain tokens:

TokenBecomesExample
{row}Number of the data row: 1, 2, 3…?id={row} → ?id=7
{0001}The same number padded with zeros to the width you writeK{0001} → K0007
{page}Number of the batch page the QR lands on: 1, 2, 3…Sheet {page} → Sheet 2

The spreadsheet

First row the column names, then one row per QR.

The simplest file possible: a column url with web addresses and a column label with the text for under the code.

AB
1urllabel
2https://example-shop.cz/p/chair-osloChair Oslo
3https://example-shop.cz/p/table-bergenTable Bergen
4https://example-shop.cz/p/lamp-malmoLamp Malmö
Three QR codes, each with its caption. QR type for rows without “type”: Website URL, Caption text from column: label.

One file can mix every QR type. Add a type column and fill in, for each row, only the columns that type uses:

ABCDEFG
1typelabelurlphonessidpasswordiban
2urlOur shophttps://example-shop.cz
3phoneCall us+420 777 123 456
4wifiGuest Wi-FiStudio GuestWelcome2026
5paymentPay the invoiceCZ58 5500 0000 0012 6509 8001
6Spring salehttps://example-shop.cz/sale
Row 6 has no type, so it uses QR type for rows without “type”. Grey cells are ignored for that row.

The template

Don't start from an empty sheet. Save template… on the Batch tab writes a file with one example row for every QR type and every column there is. Save it as .xlsx (recommended) or .csv.

SheetWhat is in it
DataThe example rows. This is the only sheet the panel reads. Delete the rows you don't need, keep the columns you do, fill in your own.
ColumnsEvery column: what it means, which types use it, where it is required, the format.
TypesEvery value for the type column with its required and optional columns.

Rules

  1. The first row holds the column names. Case, spaces and dashes don't matter: workPhone, Work phone and work-phone are the same column. The field names shown in the panel work too — Website URL, Mobile phone.
  2. One row = one QR. Empty rows are skipped. At most 500 rows.
  3. Only the first sheet is read. Keep notes on other sheets.
  4. Column order doesn't matter, and extra columns — prices, internal codes — are simply ignored, unless you use one for the captions.
  5. The type column takes the short value from the table below (url, wifi…) or the full name (Czech QR payment).
  6. The content column is a shortcut: it fills the one field of the types url, text, phone and facetime.

Values

  • Dates — 2026-10-15 or 15.10.2026; with time 2026-10-15 09:00 or 15.10.2026 9:00. Real Excel date cells work as well.
  • Decimals — 480.50 or 480,50.
  • Phone numbers, symbols, IBANs — keep them as text in Excel, otherwise Excel drops the + and leading zeros (0308 becomes 308). The template's Data sheet is already formatted as text.
  • CSV — comma or semicolon separated, as Czech Excel saves it. Save as CSV UTF-8 so accents survive.

QR types for the type column

typeQR typeRequired columnsOptional columns
urlWebsite URLurl—
textPlain texttext—
vcardBusiness card (vCard)first lastcompany title phone workPhone email url street city region postal country note
mecardCompact contact (MECard)first lastphone email url note
emailEmailemailsubject body
phonePhone callphone—
smsSMSphonebody
wifiWi-Fissidsecurity password hidden
geoLocationlat lon—
eventCalendar eventtitle start endlocation description
whatsappWhatsAppphonebody
facetimeFaceTimephone—
paymentCzech QR paymentibanamount currency recipient vs ss ks due message

Every column

The same list as the Columns sheet of the template.

Several types share a column: phone is the number of a phone call, an SMS, WhatsApp, FaceTime and the mobile of a vCard. title is a job title in a vCard and the name of a calendar event. The type of the row decides which meaning applies.

ColumnMeaningUsed byRequired inFormat
typeQR typeall—QR type of the row (see the Types sheet). Empty = “QR type for rows without type” in the Batch tab.
labelCaptionall—Caption text under the QR. Type “label” into “Caption text from column” in the Batch tab to use it.
urlWebsite URL / Websiteurl vcard mecardurlFull address starting with http:// or https://.
textTexttexttextAny text. Line breaks are kept.
firstFirst namevcard mecardvcard mecard
lastLast namevcard mecardvcard mecard
companyCompanyvcard—
titleJob title / Event titlevcard eventeventvCard: job title. Calendar event: event title.
phoneMobile phone / Phone / Phone numbervcard mecard phone sms whatsapp facetimephone sms whatsapp facetimeDigits with country code, spaces allowed: +420 777 123 456.
workPhoneWork phonevcard—Digits with country code, spaces allowed.
emailEmail / Recipientvcard mecard emailemailname@domain.tld
streetStreetvcard—
cityCityvcard—
regionState / regionvcard—
postalPostal codevcard—
countryCountryvcard—
noteNotevcard mecard—Free text.
subjectSubjectemail—
bodyMessageemail sms whatsapp—Message text (email body, SMS or WhatsApp message).
ssidNetwork name (SSID)wifiwifi
securitySecuritywifi—WPA, WEP or nopass (open network). Empty = WPA.
passwordPasswordwifi—Required unless security is nopass.
hiddenHidden networkwifi—true or false. Empty = false.
latLatitudegeogeoDecimal degrees, −90 to 90: 50.0755
lonLongitudegeogeoDecimal degrees, −180 to 180: 14.4378
startStart (local time)eventeventYYYY-MM-DD HH:MM or D.M.YYYY H:MM (local time).
endEnd (local time)eventeventSame format as start; must be later than start.
locationLocationevent—
descriptionDescriptionevent—
ibanIBANpaymentpaymentCzech IBAN: CZ + 22 digits, spaces allowed.
amountAmount (optional)payment—0.01–9999999.99, decimal point or comma. Empty = payer fills it in.
currencyCurrencypayment—CZK, EUR, USD, GBP, CHF or PLN. Empty = CZK.
recipientRecipientpayment—Max. 35 characters.
vsVariable symbolpayment—Variable symbol, 1–10 digits.
ssSpecific symbolpayment—Specific symbol, 1–10 digits.
ksConstant symbolpayment—Constant symbol, 1–10 digits.
dueDue datepayment—YYYY-MM-DD or D.M.YYYY.
messageMessagepayment—Max. 60 characters.

Layout and preview

How the codes are arranged on the page — and seeing it before it happens.

The Layout section of the Batch tab: size, unit, gaps, grid, order, columns, rows, alignment, parent page and insets.
1 caption 2 3 4 5 6 7 8 9 QR size Horizontal gap Vertical gap Gap under QR Caption height Page area margins, full page or custom insets
Order “Left to right, then down”. With “Top to bottom, then right” the numbers run down the columns.
SettingWhat it does
ModeSide by side — as many codes per page as fit. One QR per page — a page per code: labels, tickets, cards.
Page areaWhere the codes may go: inside the document margins, the full page, or custom insets from the four page edges.
QR size, UnitSize of every code. The unit applies to all distances on this tab.
Horizontal / Vertical gapSpace between the codes. The vertical gap is measured from the bottom of a caption to the top of the next code.
GridAutomatic fits as many columns and rows as the page area holds. Fixed rows/columns uses your Columns and Rows — the panel tells you if they don't fit.
OrderRows of the spreadsheet fill the grid left to right, or top to bottom.
One/page alignmentWith one QR per page: in the middle of the page, or in the middle of the page area.
Parent pageThe parent (master) page applied to the new pages.

A greyed-out field says in its label what switches it on: Columns — Grid: Fixed means choose Fixed rows/columns under Grid and the field opens; Caption height — needs caption column means fill in Caption text from column first.

The grid starts in the top left corner of the page area. The size of the page you are looking at is used for the calculation, and the new pages are added at the end of the document.

Preview layout on the active page

Tick the switch just above the Preflight and Create batch buttons — it is always in view — and the panel draws the layout right on the page you are looking at: numbered squares where the codes will be, and the captions under them — with the real texts from your file and your caption styles. Change a gap or the size and the preview follows within a moment. Go to another page and it moves with you.

  • Only one page is drawn, however long the spreadsheet — the status line tells you how many pages the whole batch will need.
  • It lives on its own layer QR preview, which does not print or export.
  • It disappears when you untick the switch, when you click Create batch and when you close the panel.
  • An impossible layout — a grid too big for the page — shows as a message instead of a preview.
Undo history

Every redraw of the preview is a change of the document, so it appears in the Undo history. Just untick the switch when you are done — the preview layer is removed with it.

Captions and layers

Text under every code, on its own layer.

Caption text from column

Type the name of a spreadsheet column into this field — not a text. With label in the field, the text of the label cell of each row is printed under its code. The column can be called anything: type product_name and that column is used. Leave the field empty and no captions are made.

SettingWhat it does
Caption prefix / suffixText before and after the caption. Prefix Code: turns A123 into Code: A123. Tokens work here too.
Caption heightHeight of the caption text frame; it is as wide as the QR.
Gap under QRSpace between the code and its caption.
Group each QR with its captionEach code and its caption become one group, so they move together.

Layers

Layers QR preview non-printing · only while previewing QR codes codes · grouped pairs QR captions captions (not grouped) Layer 1 your layout
The layers are created when first needed, and reused afterwards.
  • QR codes — every code the panel places on a page, one at a time or in a batch.
  • QR captions — the batch captions, directly below QR codes. Hide or lock the captions separately, or give them their own colour.
  • With Group each QR with its caption the pair is one group and the group sits in QR codes — InDesign always puts a group on the layer of its topmost member.
  • A locked layer is unlocked just for the placing and locked again afterwards.

Load selected and Update selected work on a grouped pair too — select the group and the panel works with the code inside it.

Styles

The Styles section of the Batch tab and a Preflight report with two errors.

QR object style, Logo object style, Caption object style and Caption paragraph style list the styles of the active document. Everything the batch makes gets them — so a caption font, a text wrap or a frame inset is set once in a style and the whole batch follows. The preview uses the caption styles as well.

Preflight and Create batch

Every row is checked before anything is placed.

Preflight reads the file again, builds every code in memory and scans it. Nothing is added to the document. The report lists:

  • Rows in the file, Valid codes, Duplicates skipped and Errors,
  • Pages the batch needs and the Grid per page,
  • the first five problems, each with its row number — the same number Excel shows on the left, so Row 7 is row 7 in Excel.

Create batch runs the same check first and refuses to start while any row has an error. Fix the file, save it, click Preflight again — the panel always reads the current version of the file.

Then it adds the pages at the end of the document and places the codes one after another; the status line counts them. Each code can be undone on its own, and each one is a full QR Plus: Load selected and Update selected work on it like on any other.

Menu and licence

A 14-day trial, then one key from Gumroad.

The panel menu

Click the ≡ icon in the top right corner of the panel's tab — the same menu every InDesign panel has. It holds:

ItemWhat it does
Licence…Trial days left, activating your key, buying the full version.
Manual (English)Opens this manual in your browser. It ships inside the plugin and works offline.
Manuál (česky)The Czech manual.

The trial

For 14 days from the first start everything works. The days left show in the panel header — click that label to open the licence window.

After the trial the panel still shows the preview, runs the scan check, Load selected, Preflight, the layout preview and the templates. Create QR, Update selected and Create batch then ask for a licence. QR codes you have already placed never expire — they are ordinary InDesign objects.

The licence window with the trial state, the key field and the Buy, Close and Activate buttons.
The licence window, opened from the panel menu or from the trial label in the header.

Buying and activating

  1. In the licence window click Buy the full version. The Gumroad page opens in your browser.
  2. After paying, the licence key is in the Gumroad receipt and in your Gumroad library.
  3. Paste the whole key into Gumroad licence key and click Activate.

The key is checked with Gumroad over the internet. Once confirmed, the plugin works without internet for 30 days at a time and re-checks itself about once a day when online. There is nothing else to download: the trial and the full version are the same plugin.

A new computer

Install the same .ccx and paste the same key. There is nothing to deactivate on the old machine.

When something goes wrong

The things that happen, and what to do.

The panel is not in the Plug-Ins menu

Check your InDesign version — it must be 18.5 or newer. Then quit InDesign, install the .ccx again and start it.

The key is not accepted

Check that you pasted the whole key and that it is the key for QR Generator Plus — every plugin in the line has its own. Without internet the key cannot be checked; it is kept and confirmed automatically once you are online.

Create QR stays grey

Read the status line under the preview: a required field is empty, a value has the wrong format, or the automatic scan check failed. For a failed check raise the contrast, enlarge the margin or make the logo smaller.

“Select an empty graphic frame”

Insert into is set to Selected graphic frame and the selected frame already holds something. Select an empty frame, or switch to Center of active page. To change a QR that already exists, use Load selected and Update selected.

Load selected says the graphic does not contain a readable QR code

The frame holds something that is not a QR, or a QR that cannot be read — cropped by the frame, rotated, covered by other objects or too pale. Fit the content to the frame and try again.

“Missing document swatch” or “Missing object style”

The QR, a preset or the batch refers to a swatch or style the active document does not have — typical after switching documents. Pick the colour or style again, or add it to the document.

Preflight reports errors in rows I did not touch

Usually Excel changed the values: a phone number lost its +, a symbol its leading zero, a web address got cut. Format those columns as Text and type the values again — or start from the template, which is formatted already.

Accents in a CSV look wrong

The file was saved in an old encoding. In Excel use File → Save As → CSV UTF-8, or save as .xlsx instead.

“The QR grid does not fit inside the selected page area”

The codes plus captions are larger than the page area. Make the QR smaller, the gaps or the caption smaller, use fewer fixed rows and columns — or a bigger page area. With the preview switched on you see the result immediately.

A QR preview layer stayed in the document

It does not print or export. Tick and untick the preview switch to remove it, or delete the layer in the Layers panel.