Creare cartelle della tombola con InDesign e… Python

Oggi mi sono trovato nella necessità di dover creare e stampare 2000 cartelle della tombola provviste di matrice. Dopo aver passato circa un ora su internet tra chi propone generatori online (gratuiti e a pagamento), fogli di Excel pieni di macro orribili piene zeppe di virus e dato che avevo bisogno di un layout completamente personalizzabile, mi sono rimboccato le maniche ed ho preso la decisione di trovare un modo per crearmele da solo.
Attenzione: ho detto 2000 cartelle (e teoricamente ognuna deve essere diversa dall’altra), con matrice (e quindi sono esattamente 4000 tabelle). Non starete pensando che abbia inserito manualmente 15 numeri a caso tra 1 e 90 in 4000×15=60.000 celle diverse di InDesign?
Siamo pazzi? Ho usato InDesign e Python.

Il procedimento è piuttosto semplice da capire: dovremo riuscire a creare un documento di 2000 pagine in cui ogni pagina ha un numero seriale, la sua cartella con i numeri e la tabella con la matrice del biglietto. Per ottenere questo useremo la funzione di InDesign “Unione Dati” che ci permette, partendo da un file sorgente, di inserire in dei campi prestabiliti dei dati variabili, nel nostro caso i numeri delle tabelle; la stessa cosa di “Stampa Unione” in Word. Il problema sta nel fatto che il file sorgente che conterrà le nostre cartelle, per poter essere utilizzato da InDesign, deve essere nel formato .csv (Comma Separated Values). È possibile creare questo tipo di file in diversi modi, compresa l’esportazione da Excel o Numbers. Io ho usato Python…

Lo script per generare le cartelle

Questo è il semplice script che ho creato per generare il file cartelle.csv che contiene le cartelle:

import math, random

numero_di_cartelle = 2000

def generaNum():
return int(math.ceil(random.random()*90))

def creaCartella():
a = []
while len(a)<15:
n = generaNum()
if n in a:
pass
else:
a.append(n)
a.sort()

b = ""
for i in range(0, len(a)):
if i == 14:
b += str(a[i]) + "\n"
else:
b += str(a[i]) + ", "
return b

f = open("cartelle.csv", "w+")

f.writelines("seriale, a, b, c, d, e, f, g, h, i, l, m, n, o, p, q\n")

for i in range(1,numero_di_cartelle+1):
f.writelines(str(i) + ", " + creaCartella())

f.close

Se non avete idea di come eseguire questo script e non sapete cosa sia il Terminale, potete scaricarvi ed installare SublimeText2 che ha al suo interno un interprete Python. Non dovete fare altro che scaricare lo script, aprirlo con SublimeText2, e cliccare su Tools > Build. Questo comando eseguirà lo script e creerà il file .csv. Potete scaricare la cartella del progetto da qui.
Se avete bisogno di un diverso numero di cartelle vi basterà cambiare il valore di numero_di_cartelle alla terza riga.
Se aprite il file con un editor di testo si può verificare che la prima riga del file definisce una sorta di colonne, infatti il primo valore di ogni riga (identificato dalla colonna “seriale”) rappresenta il numero progressivo della cartella, mentre i restanti valori della riga rappresentano i numeri della cartella vera e propria.

Importare le cartelle in InDesign

Ora che abbiamo generato le nostre cartelle, non ci resta che creare la grafica e far fare ad InDesign il lavoro sporco.
Ho creato un nuovo documento da 210mm per 49,5mm in orizzontale, il che ci consentirà poi di impaginarne 6 su un foglio A4 o 12 in un foglio A3. Data la flessibilità di questa soluzione potete variare le dimensioni a piacimento.

Impostiamo la grafica in questo modo:
cartella tombola in InDesign
Alla sinistra della linea tratteggiata avremo la nostra matrice, mentre a destra la cartella da strappare. Da notare come la matrice abbia un margine di 30mm per consentirne la spillatura. Per quanto riguarda la cartella, i numeri saranno contenuti all’interno di una tabella 5x3 in cui ora andremo ad inserire i nostri dati variabili.
In InDesign, andiamo sul menù Finestra > Utilities > Unione Dati. Questo aprirà il pannello Unione Dati in cui dovremo cliccare sull’icona delle opzioni in alto a destra e selezionare Seleziona Sorgente Dati: così si aprirà una finestra di dialogo dalla quale potremo selezionare ed importare il file cartelle.csv che abbiamo generato prima. Questo è il risultato:
pannello unione dati
Ora selezioniamo la casella di testo che conterrà il numero progressivo e, dopo aver posizionato il cursore a fine riga, clicchiamo sulla riga seriale che viene mostrata sul pannello Unione Dati. Così facendo verrà inserito il segnaposto che in fase di generazione del documento verrà sostituito con il valore contenuto nel file cartelle.csv sotto la colonna “seriale”. Bisognerà ripetere questo procedimento per ogni testo variabile contenuto nel nostro impaginato, quindi anche per ogni cella della tabella. Una volta inseriti tutti i campi nelle celle della tabella, possiamo duplicarla e spostarla a sinistra nella matrice (magari la ridimensioniamo un pochino). Alla fine il risultato deve essere qualcosa di simile a questo:
cartella completa
In questo momento non preoccupatevi di eventuali testi che strabordano dalle celle o formattati male, perché a questo punto i testi segnaposto occupano al minimo 5 caratteri, mentre una volta generato l’output conterranno al massimo i 2 caratteri dei numeri. Si può controllare come sarà il documento finale selezionando Anteprima in basso a sinistra nel pannello Unione Dati.

Creare il documento

A questo punto non ci resta che generare il documento finale e per farlo torniamo al pannello Unione Dati e clicchiamo sull’iconcina in basso a destra:
pannello unione dati output
che aprirà la seguente finestra:
generazione output
Nonostante tutte le opzioni che vengono offerte, quella a cui dobbiamo prestare attenzione è Records per Documento che deve essere impostata su Record Singolo.
L’ultima cosa da fare è cliccare su Ok ed aspettare qualche minuto finché InDesign non finisce di l’elaborazione (in realtà ci può volere anche più di qualche minuto dato che nel nostro caso deve essere generato un documento di 2000 pagine).

Dato che abbiamo un documento fresco fresco possiamo farci quello che ci pare: applicare elementi con le mastro, esportarlo in PDF o quello che preferite.
Dato che avevo la necessità di stamparlo, ho generato il PDF e l’ho reimportato in un documento A3 con l’aiuto dello script MultiPageImporter

Bene, buona Tombola e se avete suggerimenti o domande i commenti sono ben accetti.

  • Mauro

    Ciao Alessio, intanto complimenti per il lavoro che hai fatto.
    Vorrei chiederti se c’è la possibilità di creare il seriale facendo in modo che sul numero della cartella figuri 0001, 0002 e via dicendo invece di 1, 2, 3, etc.

    • shield

      scambia la penultima riga con:
      f.writelines(‘{0:04d}’.format(i) + “, ” + creaCartella())

      puoi cambiare il 4 con il numero massimo di cifre.

      Se poi vuoi anche i numeri della tombola a 2 cifre (quelli da 1 a 9 con lo zero davanti), cambia creaCartella così:

      str(a[i])
      diventa
      str(a[i]).zfill(2)

  • Eugenio Tampieri

    Grazie per il suo lavoro. Ho guardato lo script Python e ho apportato alcune modifiche. Cosa ne pensa?

    import math, random

    numero_di_cartelle = 2000

    def generaNum(n):
    return int(math.ceil(random.random()*n))
    def creaCartella():
    a = []
    while len(a)<15:
    if(generaNum(7)!=1):
    n = generaNum(90)
    if n in a:
    a.append(0)
    else:
    a.append(n)
    else:
    a.append(0)
    a.sort()

    b = ""
    for i in range(0, len(a)):
    if i == 14:
    b += str(a[i]) + "n"
    else:
    b += str(a[i]) + ", "
    return b

    f = open("cartelle.csv", "w+")

    f.writelines("seriale, a, b, c, d, e, f, g, h, i, l, m, n, o, p, qn")

    for i in range(1,numero_di_cartelle+1):
    f.writelines(str(i) + ", " + creaCartella())

    f.close
    #print creaCartella()

  • Eugenio Tampieri

    Si era scombinata l’indentazione… https://pastebin.com/KW2La7CH

  • shield

    ho creato una versione migliorata dello script in python: è possibile avere non solo i 15 numeri casuali, ma ottenerli in righe e colonne ordinate, con spazi vuoti, 5 per riga e da 1 a 3 per colonna. gli spazi saranno così 27 in totale, di cui 15 pieni e 12 vuoti.

    lo script è qui:
    https://raw.githubusercontent.com/FA810/My_Codes/master/Python/cartelle%20Tombola/cartelle.py

    alcune istruzioni:
    https://raw.githubusercontent.com/FA810/My_Codes/master/Python/cartelle%20Tombola/README.txt

    il file csv generato:
    https://raw.githubusercontent.com/FA810/My_Codes/master/Python/cartelle%20Tombola/cartelle.csv

    una cartella di prova:
    https://github.com/FA810/My_Codes/raw/master/Python/cartelle%20Tombola/0001.pdf

    se si vuole un pdf con 4 cartelle per pagina lo si trova qui:
    https://github.com/FA810/My_Codes/raw/master/Python/cartelle%20Tombola/cartellein4.pdf

  • Gianluca Cionci

    Ciao Alessio, innanzitutto ti vorrei fare i miei complimenti per il bel lavoro che hai fatto….poi ti volevo chiedere come dovrei modificare il sorgente se volessi creare una cartella con 10 numeri piuttosto che 15.
    Grazie in anticipo, Gianluca.

    • Ciao Gianluca, grazie mille!
      Dunque, per avere 10 numeri invece che 15 dovresti intanto modificare all’interno della funzione creaCartella() la riga “while lean(a)<15:" in "while lean(a)<10:". Dopodiché la riga "f.writelines("seriale, a, b, c, d, e, f, g, h, i, l, m, n, o, p, qn")" dovrebbe diventare "f.writelines("seriale, a, b, c, d, e, f, g, h, i, ln")".

    • Gianluca Cionci

      Ciao Alessio, ti ringrazio per la celere risposta. Ora ho un altro problema: modificando la formula come da tue indicazioni, quando vado a creare il file csv, me lo genera in modo anomalo e cioè non incolonna i risultati in ordine crescente da 1 a 2000 sulle righe, ma crea un file che si estende sulle colonne…..ti allego un screen schot di quello che sto cercando di dirti. Ti ringrazio dell’aiuto concesso.
      Gianluca.