8 marzo 2010

Unire i PDF da riga di comando con Ghostscript

Come unire più file in formato PDF in un unico file su Linux usando la shell?

Procediamo passo passo. Occorre il programma Ghostscript, normalmente già installato nelle distribuzioni Linux più conosciute in quanto grazie a questo pacchetto il sistema elabora i file PDF.
Per sapere se il pacchetto ghostscript è installato su Fedora per esempio, è sufficiente eseguire da shell il comando:

rpm -q ghostscript

l'output nel mio caso è stato il seguente:

ghostscript-8.70-1.fc12.i686

che, per inciso, significa questo: nel mio sistema risulta installato il pacchetto ghostscript nella versione 8.70, compilato per la distribuzione Fedora 12 (quella su cui sto lavorando, infatti) e per una macchina i686.
Quindi il programma è installato.
Se invece non lo fosse, sempre da terminale, basta dire a yum (il gestore dei pacchetti che si occupa di installare i programmi su Fedora utilizzando la riga di comando) di scaricarlo e installarlo. Il comando sarà il seguente:

yum install ghostscript

e Yum lo scaricherà da uno dei repository abilitati di default per Fedora.

Se non ci fosse nei repository o se utilizzate windows, GhostScript può essere scaricato direttamente dal sito:

Ghostscript - Sourceforge


OK, supponendo che il pacchetto sia installato, procediamo con l'unione dei file PDF in un PDF unico.

Apriamo il terminale e spostiamoci nella cartella in cui sono presenti tutti i file che intendiamo unire:
Ponendo che la cartella si chiami "Tutti-i-pdf" e si trovi in "Documenti", digiteremo:

cd Documenti/Tutti-i-pdf/

ora che siamo dentro, eseguento il comando
ls -a
il terminale ci restituirà una lista di tutti i file presenti nella cartella (ls) e ce li mostrerà in colonnati (opzione -a).
Un esempio potrebbe essere il seguente:

Linux-Indice.pdf
Linux-lez-1.pdf
Linux-lez-2.pdf
Linux-lez-3.pdf
Linux-lez-3.pdf
Linux-lez-4.pdf
Linux-lez-5.pdf
Linux-lez-6.pdf

Ora, per unire tutti i file, digitiamo il seguente comando, tutto di seguito:

gs -sDEVICE=pdfwrite -dBATCH -dQUIET -dNOPAUSE -sOutputFile=File-Unico.pdf Linux-lez-1.pdf Linux-lez-2.pdf Linux-lez-3.pdf Linux-lez-4.pdf Linux-lez-5.pdf Linux-lez-6.pdf Linux-Indice.pdf

Otterremo il file pdf risultante, che avrà come titolo "File-Unico.pdf" e si troverà naturalmente nella stessa cartella in cui sto lavorando.
Un piccola spiegazione del comando:

1- con "gs" sto avviando il programma ghostscript.
2- "-sDEVICE=pdfwrite" con questa opzione dico al programma che dovrà lavorare in particolare con file di tipo PDF.
3- "-dBATCH" questa opzione ci permette di far lavorare il programma in Batch, ovvero farà tutto quel che deve fare in modo automatico. Altrimenti avvierebbe la sua interfaccia (sempre da riga di comando) e noi dovremmo dargli i comandi da terminale. In questo modo invece tutto il processo avviene in modo automatico, in background.
4- "-dQUIET" con questa opzione imponiamo al programma di non mostrare nel terminale i messaggi nel terminale ad ogni avvio
5- "-dNOPAUSE" con questa opzione gli specifico che deve continuare ad elaborare di seguito, senza fermarsi alla fine di ogni pagina di ciascun file.
6- "-sOutputFile=" Qui invece indichiamo al programma il nome del file finale, che va scritto dopo il simbolo "=" in questo caso di esempio "File-Unico.pdf".


Per semplificare ulteriormente il lavoro, sempre che in una cartella siano presenti tutti i pdf che vogliamo unire (e non altri in più, che andrebbero quindi spostati), possiamo evitare di scrivere il nome dei file uno per uno, usando la variante:
*.pdf
alla fine del comando, in questo modo:

gs -sDEVICE=pdfwrite -dBATCH -dQUIET -dNOPAUSE -sOutputFile=File-Unico.pdf *.pdf

In questo modo, il programma va a prendere tutti i file presenti nella cartella (l'opzione * dice questo), che abbiano estensione .pdf. Naturalmente, agendo in questo modo, ghostscript ordinerà il file nella castella in ordine alfabetico (a,b,c,d) o numerico (0,1,2,3,...9 ecc.) quindi occorrerà preventivamente rinominare i file nel modo corretto.