GhostScript e Stirling PDF: manipolare PDF in sicurezza
Chi non ha mai avuto la necessità di manipolare un file PDF? Magari ti serviva unire due PDF in uno solo, oppure estrarne una o due pagine appena, oppure volevi aggiungere un watermark ad un documento scansionato senza troppe acrobazie da cartoleria…
Oggi, ad esempio, ho dovuto trovare il modo, da riga di comando e in ambiente isolato dalla rete, per trasformare un PDF contenente un rapporto di misura, generato direttamente da uno strumento di laboratorio, in un file di testo che fosse “parsabile” valutabile programmaticamente da un sistema LIMS.
GhostScript
La soluzione più ovvia e rapida è stata quella di rivolgermi a Ghostscript, che per inciso è il motore che genera PDF nella quasi totalità dei software che generano PDF, o che emulano stampanti PDF, in ambiente Windows.
Per chi non lo conoscesse, Ghostscript è un interprete Postscript, un linguaggio sviluppato da Adobe per descrivere e automatizzare pagine di documenti elettronici. PDF e Postscript sono cugini, reciprocamente convertibili, con la differenza che il PDF non contiene il subset di caratteristiche di programmazione presenti sul formato PS. Ghostscript è rilasciato sia con una licenza commerciale che con una licenza open source, entrambe mantenute dalla società Artifex.
GhostScript, in versione AGPL, è disponibile a questo indirizzo: https://www.ghostscript.com/releases/gsdnld.html.
Ma perché dovresti sbatterti con un nuovo strumento esoterico per qualche funzione che ti potrebbe servire sì e no tre o quattro volte nella vita?
Semplicemente perché:
- puoi;
- hai bisogno di automatizzare dei workload e ti serve uno strumento da riga di comando completo e fatto strabene;
- non devi caricare i tuoi documenti su servizi online malfamati;
- non devi caricare i tuoi documenti sul cloud supersicuro di qualcun altro;
- non devi installare programmi con licenze molto costose per due comandi banalissimi;
- non devi installare programmi da Softonic;
Ad ogni modo, se cercavi solo un visualizzatore con tante funzioni di annotazione e editing di base, che sia open source e che giri su Windows, non ho ancora trovato nulla di meglio di Okular… provalo, ne vale la pena e i tuoi file restano al sicuro!
Per tornare a noi, devo ammettere che la curva di apprendimento del linguaggio PS è piuttosto ripida, e non ho trovato moltissimo aiuto nella comunità online, probabilmente a causa del fatto che esistono prodotti commerciali che generano file PS senza troppo sforzo… ammetto che ci sono cose che non mi sono ancora molto chiare, ma sono riuscito a risolvere alcuni casi d’uso che per me sono piuttosto tipici, e li condivido più che volentieri.
Se anzi qualcuno con più esperienza di me riuscisse a suggerirmi la soluzione per l’ultimo caso, che lascio irrisolto, gli sarei enormemente grato…
In ogni caso, se preferisci, sono pubblicati senza troppi fronzoli su Codeberg
Convertire un PDF in un TXT (mantenendo il layout)
gswin64c.exe -sDEVICE=txtwrite -dTextFormat=2 -o output.txt input.pdf
Unire due o più file PDF
gswin64c.exe -dNOPAUSE -sDEVICE=pdfwrite -o combined.pdf -dBATCH 1.pdf 2.pdf 3.pdf
“Smontare” pagina per pagina un file PDF
gswin64c.exe -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -o output.%d.pdf input.pdf
Estrarre un intervallo di pagine da un file PDF
gswin64c.exe -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dFirstPage=2 -dLastPage=5 -o output.pdf input.pdf
Convertire un file PDF in un file PS
gswin64c.exe -dNOPAUSE -dBATCH -sDEVICE=ps2write -o output.ps input.pdf
Aggiungere un watermark su ogni pagina di un file PDF
Step 1: creare un file PS con il watermark desiderato
File “watermark.ps”:
<< /EndPage {
2 eq { pop false }
{
gsave
/Helvetica findfont 36 scalefont setfont
newpath .80 setgray 25 25 moveto (Watermark Text) show
grestore true
} ifelse
} bind >> setpagedevice
dove:
/Helvetica findfont
è il font del watermark36 scaledfont
è la dimensione del testo.80 setgray
è la tonalità di grigio del testo25 25 moveto
sono le coordinate di inizio watermark(Watermark Text)
(escluse le parentesi) è il testo del watermark
Step 2: sovrapporre il watermark alle pagine del file PDF
gswin64c.exe -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -o watermarked.pdf watermark.ps input.pdf
Aggiungere un watermark grafico (svg, png, jpg) su ogni pagina di un file PDF
Su questo ho trovato qualche esempio, ma non sono stato in grado di ottenere nulla di utilizzabile… Se sai suggerirmi, sono tutt’orecchie!
Edit 2024-03-27: aggiunta la sezione seguente
Stirling PDF
Dopo aver pubblicato questo post, come era da aspettarsi, mi è stato segnalato il progetto di Stirling PDF. Per la verità già lo conoscevo e pianificavo di raccontarlo in un post separato tra qualche settimana. Volevo provarlo bene, soprattutto l’installazione.
Stirling PDF è un progetto Open-Source che rende disponibile per l’installazione su un PC, o su un server in hosting, di una applicazione web che racchiude una quantità davvero assurda di funzioni per manipolare i PDF, incluse quelle indicate sopra. Tutte queste funzioni vengono eseguite localmente o sul server dove è installata l’applicazione e dunque nessun dato viene trasmesso ad altri server.
A differenza di GhostScript, che può essere utile per un impiego saltuario con una installazione semplicissima, Stirling PDF richiede diverse accortezze e qualche competenza in più per l’installazione, anche solo per uso offline sul vostro PC locale, e si pone come una ottima soluzione per piccole realtà aziendali, professionisti o privati che ne facciano un uso intensivo. Se sei alle prime armi ti raccomando l’installazione tramite Docker, in quanto più semplice rispetto alla gestione delle numerosissime dipendenze.
Puoi trovare il sorgente e le istruzioni qui: https://github.com/Stirling-Tools/Stirling-PDF, e puoi anche provare le varie funzioni su una istanza italiana a questo indirizzo: https://pdf.serviziliberi.it/ (questa pagina è gestita dalla Italian Linux Society, sezione di Este, che è una associazione senza scopo di lucro che offre questo servizio gratuitamente, senza profilazione né pubblicità), ma raccomando di non caricare documenti riservati o che contengano informazioni sensibili.