PDF Batch
Proprio in questi giorni mi sono imbattuto nell'esigenza di dover realizzare degli attestati di partecipazione ad un corso: una decina di file PDF identici, fatta eccezione per il nome e le informazioni del partecipante. Qui riporto due utili metodi per far ciò: uno con una estensione per Inkscape e l'altro con $\LaTeX$.
Estensione Generator
Inkscape è un versatile programma open source per la grafica vettoriale, e Generator è una estensione realizzata da un utente brasiliano proprio per la realizzazione di batch di PDF. Per utilizzarla è ovviamente necessario installarla: si scarica l'archivio dal sito e lo si scompatta nella cartella delle estensioni di Inkscape.
- GNU/Linux:
Installazione globale: (per tutti gli utenti)
/usr/share/inkscape/extensions
Installazione locale: (per l'utente corrente)
~/.inkscape/extensions
- OS X:
~/.inkscape/extensions
- Windows:
C:\Program files\Inkscape\share\extensions
Per esserne sicuri eseguire "inkscape -x
"!
Il funzionamento non è proprio immediato al primo uso:
mettiamo di voler riempire tre spazi nel documento che segue con nome, indirizzo
e voto di ogni studente.
Negli spazi dove si vuol far comparire i testi variabili bisogna inserire degli
identificatori che l'estensione provvederà a sostituire, qui %VAR_1%
per il nome, %VAR_2%
per l'indirizzo e %VAR_3%
per il voto.
In generale l'identificatore è %VAR_numero%
.
Le informazioni vengono pescate da un file .csv
generabile con un qualsiasi foglio di calcolo:
il numero di ogni identificatore corrisponde ad una diversa colonna del foglio.
Verranno poi generati tanti PDF quante sono le righe.
A destra un file Inkscape di esempio.
È giunto il momento di lanciare l'estensione, che troviamo sotto il menù Estensioni > Varie > Generator.... Nella finestra che compare impostiamo i parametri come segue:
- Collect values by column position: ogni identificatore corrisponde appunto al numero della colonna;
- Data file: il nome del file csv, da salvare per semplicità nella stessa cartella del file di Inkscape. È possibile comunque specificare percorsi assoluti o relativi;
- Exportation format: PDF, ma volendo si può esportare anche in SVG o in file immagini.
- DPI Jpeg images: risoluzione delle immagini JPG. Per files da stampare suggerisco fra 300 e 600 onde evitare immagini "sgranate";
- Output pattern: anche qui è possibile richiamare gli identificatori del file csv. Suggerisco di impostare l'output in una sottocartella come illustrato nell'immagine riassuntiva.
Si può quindi lanciare lo script e attendere l'esportazione. Al termine si possono aprire i files: da notare che viene mantenuta, giustamente, la formattazione attribuita ad ogni identificatore.
A destra i PDF esportati ed uno di essi aperto.
Metodo $\LaTeX$
Usare il software di impaginazione \LaTeX per lo scopo è sicuramente il metodo più nerd.
Si suppone che chi sta leggendo mastichi già abbastanza tale programma, altrimenti
rimando al più immediato metodo precedente.
Al solito si realizza la struttura della pagina desiderata. Dopodiché
si definisce un array con i dati da inserire, che deve avere la forma
mostrata nel seguente estratto di codice.
Le istruzioni relative alla struttura del documento vanno poi racchiuse in un ciclo foreach
che viene ripetuto per ogni elemento dell'array. Ai dati si accede richiamando
le tre colonne \nome
, \indirizzo
,\nome
.
Volendo inserire più campi è sufficiente aggiungere colonne
all'array \elementi
e specificandone il nome
nel foreach
, utilizzando la barra /
come separatore.
$\LaTeX$ produce un unico file PDF, inserendo automaticamente un'interruzione
di pagina ogni volta che il foreach
viene ripetuto (tranne
per la prima pagina!).
Segue esempio...
\begin{document} % INSERISCI QUI le informazioni separate da /. Ogni persona % va separata con una virgola \def \elementi{Conte Mascetti/Via alla Giapponese/7, Signor Gioforchio/Via di Qui/6, Tizio Caio/Vicolo Stretto/8, John Doe/Piazza Italia/10, Sam Pronio/Largo di Molto/9, Mr X/Viale dei Pini/6 } % Ciclo for che crea le pagine \foreach \nome/\indirizzo/\voto [count=\x from 0] in \elementi { # Interruzione di pagina, eccetto per la prima \ifnum\x>0 \clearpage \fi %%% QUI CI VA IL DOCUMENTO } \end{document}