Ubuntu – GIMP plugin to change ticket number and export image automatically

gimp

I have designed a ticket which includes a sequential ticket number (001,002,003…500) and now I have to export each and every ticket number as a separate PNG image.

This is a lot of manual work and I'm asking if there is a plugin or script that I can use to do this automatically – something I can give the text layer to change incrementally then export the image.

EDIT

This is my ticket.
The ticket number is at the left side corner – 2014/001 -> 2014/500
Image size: 2858px by 1000px
The ticket number font is Dirt2 SoulStalker

enter image description here

Best Answer

I think I got it working.

enter image description here

The procedure is that you put the background image (named "background.png", the ticket without the number, but with 2014/) in a folder, together with the script below. Then, if you run the script (after editing the three lines in the head section):

  • The script produces numbers from 001 to 500 (but it can be any number you define in the head section) Subsequently , using imagemagick:

  • the script creates (number by number) separate layers (files) with the number in the right position

  • it copies the background layer + number layers into a new file, saved in the same folder, for each number.
  • the script then removes the (temporary) additional layers

enter image description here

Notes

  • You may have to install imagemagick:

    sudo apt-get install imagemagick
    
  • I used this free version of the font. It turned out that in the script, I had to set the absolute path to the font for it to work. I just copied it to ~/.fonts and used that path. In the head section of the script, set yours.

The script:

#!/usr/bin/env python3

import subprocess
import os

curr_path = os.path.dirname(os.path.abspath(__file__))

#---
number_of_tickets = 5
bg_file = curr_path+"/"+"background.png"
font = '/home/jacob/.fonts/dirt2 soulstalker.otf'
#---

def command(string, layer, position):
    return "convert -size 2858x1000 xc:None -fill black -font "+'"'+font+'"'+\
           " -stroke None -fill white -pointsize 123 -style Normal -gravity west -draw "+\
           position+"'"+string+"'"+'" '+layer

def print_tofile(string, number):
    print("creating file "+number+"."*3)
    layer_1 = curr_path+"/"+number+"_a.png"
    layer_2 = curr_path+"/"+number+"_b.png"
    cmd_1 = command(string, layer_1, '"text 497,-420 ')
    cmd_2 = command(string, layer_2, '"text 1035,-420 ')
    subprocess.call(["/bin/bash", "-c", cmd_1])
    subprocess.call(["/bin/bash", "-c", cmd_2])
    cmd_3 = "convert "+bg_file+" "+layer_1+" "+layer_2+\
            " -background None -layers merge "+curr_path+"/"+number+"_ticket.png"
    subprocess.call(["/bin/bash", "-c", cmd_3])
    os.remove(layer_1)
    os.remove(layer_2)
    print("done")

ns = [str(n) for n in range(number_of_tickets+1)][1:]

for item in ns:
    number = str(int(3-len(item))*"0")+item
    string = number
    print_tofile(string, number)

How to use

Copy it into an empty file, in th head section of the script, set:

  • the number of tickets
  • the (absolute) path to the font
  • the name of the background image (ticket without numbers) if you want to change it

and save it as numbering.py, together with your background image (2858px by 1000px), named background.png in one and the same folder.

Run it by the command:

python3 /path/to/script.py
Related Question