Variable QR codes? Sort of possible…


UPDATE 2014-07-22: Since the release of Adobe InDesign CC 2014, variable QR codes via Data Merge is now possible. A post will be written about this feature once it has been thoroughly tested, but in the meantime this article has been edited to reflect the update.

Since the invention of QR codes, a burning question has been “how to incorporate these barcodes into a Data Merge?” There are lots of ways to generate one-off QR codes such as:

  • QR code generating websites;
  • An InDesign Javascript written by Jongware that is suitable for CS4-6;
  • Built into InDesign CC and above; and
  • Third party plug-ins that offer one-off creation as a “taster”.

But what if there are 30, 300, 3,000 or 30,000+ codes that need to be made as a direct mail campaign? Creating 30,000 QR codes is not a task that anyone would want to do individually.

So can Adobe InDesign, fresh from the shelf, create a Data Merge with variable QR codes? Apart from the latest release of Adobe InDesign CC 2014, no – not without the use of a third party plug-in. However, this workaround does the next best thing: Creates lots of QR codes all at once, export them as uniquely named PDFs for reference in a Data Merge, and then use the built-in Data Merge feature from InDesign.

The following example is a business card for fictional clothing manufacturer “Mean Jeans”. The client would like QRcodes that feature the staff member’s email address, and if no email address appears then no QR code needs to appear. The client has supplied the database in Microsoft Excel.

There is a way to automate this task thanks to three scripts

  • QRcode.jsxbin by Jongware (as previously mentioned). When this script is used on its own, a user interface appears asking the user for the text to be coded and then a level of error correction. Jongware did allow other scripts to call upon the QRcode script, and that leads into the next script;
  • A slight modification of a script supplied by an Adobe Forums user by the handle of sergemca. The original script (found in the same Adobe Forum link as Jongware’s QRcode.jsxbin) by sergemca searched an open InDesign document for any textboxes that contained the starting words MECARD: and would then convert the contents of the complete textbox into a QR code and then apply formatting such as scaling and rotation. As this example is creating QRcodes from email addresses, the modification in this example searches an open InDesign document for any textboxes that contain the starting word mailto: . Modifications to this script are best dealt with by the scripting forum of the Adobe InDesign forum.
  • PDFStyleExporter.jsxbin by Loic Aigon. This script has featured on Colecandoo before and it is used to split a large InDesign file into single page PDFs with unique names. While researching this story I have noticed that Loic will update this script in due course, so stay tuned.

To create variable QR codes:

  1. Open the Excel file and create two fields in the database in addition to the other fields that need to appear: order, and ‘@QRcode (the ‘ will disappear in Excel after it is typed, this is intentional). In the order column, use the autofill function of Excel to add sequential numbers to this column. Leave the contents of the @QRcode field for now.1qr
  2. Save the Excel file but also save it as a “Windows Formatted Text .txt” file, and give it a name that reflects that this database is purely for the QRcoding only e.g. forcodingonly.txt2qr
  3. In Adobe InDesign, create a new file that will be used to create the QR codes first. In this example, a file that is business card size has been created (90x55mm). Once open, go to the Data Merge panel and select the data source as the recently created txt file. Once the data is available in the Data Merge panel, create two text boxes. One with the word mailto: followed by the <email> field, and another text box with the <order> field. The document should look like this3qr
  4. The order text will provide the filename in a later script, but it also must appear in the file but not get in the way of the QRcode graphic that will appear later. To make sure that this text will be live but not output in the resulting QRcode, select the textbox containing the <order> field, give the text a paragraph style called “order” – the only change is that it has no fill and stroke. Also, align the text box to be in the centre of the page. The document should now look like this4qr
  5. From the Data Merge panel, select “Create Merged Document” and merge to a new single page document.5qr
  6. This will create a large document that will contain one mailto: address per page. It is important at this stage that any mailto: addresses that don’t have email addresses in the text boxes be deleted (or else the QRcode script will make QRcodes that contain the word “mailto:” only and clearly won’t work). To delete these addresses open the Find/Change dialog box and in the GREP panel type in the word mailto:$ , leave the change field blank (as well as the formatting fields) and click Change All.6qr
  7. The document is ready to have the QR codes applied. To do this, the altered version of sergemca’s script needs to be run.
var _d = app.documents[0];
var _allStories = _d.stories;
for(var nx=_allStories.length-1;nx>=0;nx--){
    var _storyAllTextFrames = _allStories[nx].textContainers;
    for(var mx=_storyAllTextFrames.length-1;mx>=0;mx--){
         _storyAllTextFrames[mx].select(); // change page
             var obj = app.doScript(new File(app.activeScript.path+'/qrcode.jsxbin'), ScriptLanguage.JAVASCRIPT, [_storyAllTextFrames[mx].contents, 3], UndoModes.ENTIRE_SCRIPT);
             _storyAllTextFrames[mx].contents = "";


If done successfully, the InDesign file should now contain QRcodes in place of the text that contained the email addresses.

To export these QRcodes with their unique names

  1. Run the script PDFStyleExporter.jsxbin (called PDFExportCropper.jsxbin on my machine)8qr
  2. In the user interface that appears, select the paragraph style “order” and leave the rest of the dialog box as it is. In the PDF options dropdown field, select the destination to save the resulting PDFs. Once done, click the Export button.9qr

Again, if done successfully, the resulting PDF QR codes should now save to the nominated directory.

There are other ways to export single page PDFs but Loic’s script is used in the example in case a reference other than a sequential number is to be used, such as a person’s name, phone number, etc.

To incorporate these QR codes into the data merge:

  1. Return to the Excel file and in the @QRcode field, use the CONCATENATE function to take the order number and apply the .pdf suffix to it. The formula to use is: =CONCATENATE(A2,”.pdf”)10qr
  2. Save the Excel file and again, also save it as a “Windows Formatted Text .txt” file, and give it a name that reflects that this database has been qrcoded QRcoding only e.g. qrcoded.txt
  3. In Adobe InDesign, create (or open) the card that needs the QRcodes applied. Once ready for the data, go to the Data Merge panel and select the data source as the newly created txt file. Place the name, address references etc as necessary, and create a frame for the QR codes to appear.11qr
  4. Apply the qrcode field to this frame and go to the Data Merge panel and select Content Placement Options. In the dropdown field “Image Placement” select the fitting “Fill frames proportionally”.12qr
  5. Instead of using the “preview” function, go to the Data Merge panel and select the Export to PDF function and export one record only. In the example, page 7 was chosen at random.13qr
  6. Once satisfied that the merge looks like it will work, again use the Export to PDF function to export the entire merge to a PDF.

For the barcodes to fit the image, the PDFs need to import PDFs based on the bounding box. If the images are not fitting the frame properly, an additional script originally by Dave Saunders (but improved upon by Marc Autret) will allow the import option to change. The script is available from this forum and once loaded and run into InDesign, the option to select is “Content All Layers”


So there it is. It is worth noting that this is a workaround and not a direct live Data Merge solution. There are limitations to this solution:

  • Resulting codes can’t be colorised on-the-fly;
  • If the database changes, this will mean repeating the entire process, rather than simply updating the data in the data merge file once, and removing all  QRcodes created previously.
  • Because the codes are not human readable without a decoder, there is added emphasis to check, recheck and check again to make sure the merge is behaving properly.

While this is a workaround, there is no doubt that a turnkey solution is preferable. There are enough third party providers making variable barcode solutions for Adobe InDesign. The full list is available here. From memory here is a list of third party providers that provide variable QR codes as part of a complete VDP package:

  • Rorohiko’s Tada QR;
  • XMPie’s uDirect;
  • Meadows Publishing Software
  • Cacidi LiveMerge;
  • Teacup Software’s BarcodeMaker;
  • DirectSmile;
  • Objectif Lune’s Printshop Mail;

Several edits since this was first published:

  • Added a list of third party providers who provide variable QR codes and moved a reference to an individual one earlier on in the article into that list;
  • Fixed type within field chevrons that did not appear when the article was published;
  • Acknowledged that variable QR codes via Data Merge are now possible in Adobe InDesign CC 2014

The “Big Guns” of InDesign Scripts

Those following this blog will know what a fan I am of javascripts within InDesign. I have mentioned some very useful ones in the past, but this list represents the more “Heavy Duty” scripts which should be included with InDesign by default.

Startup Scripts

These scripts reside in a slightly different location to most other javascripts and their benefits are not necessarily seen exclusively from the scripts panel.

controlbackgroundexport by Marijan Tompa (Tomaxxi)

Enables/disables the ability to export PDFs in the foreground, an ability which was unavailable from CS5 onward.

swapplaces by Gerald Singelmann

Adds options to the control click when two items are selected allowing objects positions or contents to be swapped.

tomaxxilayers by Marijan Tompa (Tomaxxi)

Prompts users to choose from a dropdown menu which layer set to use during the creation of a new InDesign file.

General Purpose Scripts

These scripts are ones that I use regularly and happy to sing their praises. For those unfamiliar, the acronym UI stands for “User Interface”.

Addblankmaster  by Harbs

A UI that allows blank masters to be inserted after every current page.

AdvancedCropMarks by Loic Texieira

A UI that draws corner cropmarks on selected objects.

Alltablestotext by Harbs

Converts all tables in a document to text.

BookBarcode by Marc Autret

A UI to create ISBN barcodes for Books. Paid and Trial versions available.

CalendarWizard by Scott Selberg

A UI that creates calendars.

ConvertVariable2Text by Marijan Tompa (Tomaxxi)

A UI to convert Variable text to regular text.

CoverBuilder_CS5 by Bruno Herfst

A UI to create covers for  burst/case bound books.

CustomExport by Loic Aigon

A UI to export single pages of an InDesign file to various formats.

Exportinforeground by Uwe Laubender

(CS5 onwards) Exports a PDF without exporting in the background. Somewhat superceded by Marijan Tompa’s start-up script.

Extrude by Theunis de Jong (Jongware)

Replicates the extrude effect from “Wordart”. Okay so I may not use this one so much, but it was a noteworthy mention.

HurryCover by Marc Autret

A UI to create covers for  burst/case bound books, but with more options and better UI than Bruno Herfst’s.

identify by Theunis de Jong (Jongware)

Determines which version of Adobe InDesign was used to prepare in InDesign file.

ID_RulerGuide by pictrix

A UI to add ruler guides.

imagestoCSVthenChoose by Loic Aigon

Creates a DataMerge file based on pictures in a folder.

index_from_colour by Thomas Silkjær

Creates index entries from text in a specific swatch colour.

indexfromcharacterstyle by Martin Fischer

Creates index entries from text in a specific character style.

indyfont by Theunis de Jong (Jongware)

Allows creation of an indesign object as a font. Full version can create an entire character set, similar to Fontographer. Full (paid) and one-glyph only (free) versions available.

IndysNumberGenerator by Stanislav Antos

A UI to create arrays for Data Merges.

line-mazes-everywhere by Theunis de Jong (Jongware)

Fills an object with a maze pattern.

Make Imposition by Sergey Anosov

A UI to create N-up grids for impositions.

MultiPageImporter2.5-CS5 by Scott Zanelli

A UI to import PDFs with many adjustable settings.

mysticrose (author not known)

A UI which creates spirograph-like effects.

NINAscriptWithDialog by Ole Kvern

A UI to make spirograph-like effects.

Overflow by Pawel Swiecicki

A dialog box report of how and where text overflows are in an InDesign file.

PageBorder by Marc Autret

A UI to Apply/Remove a page border on artwork for proofing purposes.

PageExporterUtility5.0.1 by Scott Zanelli

A UI to export single pages of an InDesign file to various formats.

piegraphs by Theunis de Jong (Jongware)

A UI to separate an object into segments similar to but not limited to piegraphs.

RecordFindChange_CS3-CS5 by Kasyan Servetsky

Exports a text-file for use with the FindChangeByList script based on settings within the Find/Replace dialog box.

NEW! QRcode by Theunis de Jong (Jongware)

A UI to create QR codes within InDesign. Creates a raster file embedded into InDesign which can be unembedded via Photoshop if need be.

ScaleGraphics by Harbs

A UI to scale and reposition all graphics within a file.

Speeech by Marc Autret

Creates “speech bubble” graphics based on settings in the script.

spirograph by Theunis de Jong (Jongware)

A UI which creates spirograph-like effects.

StorySplitter_3.0 by Adi Ravid

A UI which splits a threaded story from a certain point.

ToggleCase by Ariel Walden

Changes the case of highlighted text through various cases (best when assigned to a keyboard shortcut).

Wordalizer by Marc Autret

A UI which creates a wordle-style image from sampled text. Paid and trial versions available.

worldmap by Theunis de Jong (Jongware)

A UI that creates a map of the globe based on lat/long coordinates.

%d bloggers like this: