Oggi una mia cliente mi ha chiesto se era possibile sostituire i dati di una documento PDF senza avere il documento originale con cui quel PDF era stato creato.
Ricordo ancora quando tanti anni fa dovetti creare il programma che permetteva di scaricare il catalogo dei prodotti di un sito web in versione PDF.
Il sito era realizzato in Perl con oggetti archiviati in formato XML {un db no-SQL ante litteram insomma} dato che PHP e MySQL non erano ancora disponibili sui server che offrivano hosting condiviso. Inoltre non esisteva nemmeno qualche libreria che potesse agevolare il compito.
Le specifiche del formato erano però disponibili {lo sono tuttora, se vi interessano} e con un po’ di pazienza alla fine riuscii nell’intento. Ricordo che avevo dovuto calcolare l’occupazione di spazio di ogni parola per sapere quando andare a capo perché il testo era arrivato alla fine della riga o quando iniziare una nuova pagina perché le righe a disposizione erano finite. Preparate poi le singole pagine veniva creata la cross-reference, una specie di indice delle pagine e degli elementi, e il catalogo PDF era pronto da scaricare.
Se sono riuscito a creare un catalogo con più pagine che cosa ci vorrà mai a sostituire un po’ di testi qua e là, mi sono detto.
In realtà le cose non erano così semplici.
È vero che ora esistono tool come qpdf che permettono di decomprimere e riuscire a leggere agevolmente i comandi PDF che costruiscono la pagina ma i modi con cui possono essere combinati sono tantissimi e se non avete ideato voi la struttura della pagina il reverse-engineering non è così agevole.
Se i nuovi testi hanno la stessa lunghezza di quelli da sostituire, o anche inferiore, la sostituzione si può fare con un semplice editor di testo ma se i nuovi testi sono più lunghi una parte rischia di rimanere nascosta da altri elementi. Questo, almeno, è il problema in cui sono incappato questa volta.
Lo strumento con cui, alla fine, sono riuscito a esaudire la richiesta è stato LibreOffice Draw {credo funzioni anche con OpenOffice}.
Importa la pagina PDF e poi ne permette di modificare, inserire e cancellare agevolmente ogni elemento.
L’unico problema che ho avuto è stata la mancanza, nel mio computer, del font di caratteri usato originariamente per generare il PDF. I font di solito sono presenti all’interno del documento PDF, altrimenti non sarebbe possibile visualizzarli correttamente su dispositivi diversi, ma si vede che la procedura di importazione non funziona bene o non li considera.
Individuato il nome del font, questa volta sì con un po’ di reverse-engineering, completare le modifiche rigenerare la scheda PDF è stato semplice.
P.S. Con i documenti PDF è anche facile costruire dei moduli compilabili per agevolare l’inserimento di informazioni all’interno di una struttura predefinita. Le informazioni inserite possono essere successivamente estratte e utilizzate per creare un record in una tabella di un database opportunamente predisposto. A me, per esempio, è capitato di usarli per la realizzazione di una soluzione che permettesse la raccolta di dati personali sensibili, dove non era presente un collegamento Internet e che permettesse la contemporanea stampa di un contratto contenente le informazioni inserite.