Sam Hooke

Researching generating playing cards from an SVG template using Inkscape

I’m working on developing a board game, and would like to make some playing cards for it. My thinking is that it should be possible to have one (or a few) SVG templates (made in Inkscape), which are then populated with data from a CSV (or otherwise), somewhat akin to mail-merge. This would then make it easy to iterate on the design by updating the CSV file and then automatically generating a new set of playing cards, which could be printed off.

Card generation §

Here’s what I’ve found from various searches relating to this problem:

Fortunately it appears I’m not the first person to want to do something along these lines, so it seems very plausible. Unfortunately the tooling all seems rather outdated and/or sparsely documented.


To start off, I tried to use the Bash Inkscape mail merge extension.

It adds a new option into the Inkscape GUI which lets you do mail merge.

Unfortunately, when I tried to run it, it failed with the following error:

/usr/share/inkscape/extensions/generator.sh: eval: line 79: syntax error near unexpected token `('
/usr/share/inkscape/extensions/generator.sh: eval: line 79: `col_name[6]=Action_(then_discard)'

Next I looked into the Ruby extension instead, following through the blog post.

First of all, install Ruby if it’s not installed already, then install inkscape_merge:

sudo gem install inkscape_merge

This does seem to work! Assuming I start with a correctly formatted table_cards.csv and template.svg (from following the above blog post):

mkdir batch
inkscape_merge -f template.svg -d table_cards.csv -o batch/card_%d.png --format png

This then populates the batch directory with all the generated PNG files.


One problem is that if the text is larger than the textbox, it just spills out. It would be nice if the font size would automatically adjust to fill the pre-defined textbox area.

Here are some initial notes on looking into this:

Unfortunately it doesn’t seem as easy as I had hoped it might.

Fortunately it turns out there is a much simpler solution, though it requires a little more manual work:

Include a placeholder textbox in the SVG file for each font size you wish to support. Then have a column in the CSV file for each of these font sizes. Leave all these columns empty except for the font size which is most suitable.

This requires a little bit of trial-and-error, but seems good enough for my circumstances.

These are rough notes from whatever I was working on, interested in or thinking about at the time. They vary greatly in quality and length, but prove useful to me, and hopefully to you too!

← Previous: Migrating from Tastypie to Django REST Framework
Next: mypy and verbose logging →