Uso Ghostscript con le seguenti opzioni prese da qui.
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
-dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
Potresti trovare che pdftocairo
(di Poppler) può creare PDF più piccoli, ma fai attenzione perché eliminerà alcune funzionalità (come i collegamenti ipertestuali).
Puoi ottenere buoni risultati convertendo da PDF a Postscript, quindi di nuovo in PDF usando
pdf2ps file.pdf file.ps
ps2pdf -dPDFSETTINGS=/ebook file.ps file-optimized.pdf
Il valore dell'argomento -dPDFSETTINGS
definisce la qualità delle immagini nel PDF risultante. Le opzioni sono, da bassa ad alta qualità:/screen
, /default
, /ebook
, /printer
, /prepress
, vedere http://milan.kupcevic.net/ghostscript-ps-pdf/ per un riferimento.
Il file Postscript può diventare piuttosto grande, ma ne vale la pena. Sono passato da un PDF da 60 MB a un file Postscript da 140 MB, ma alla fine ho ottenuto un PDF ottimizzato da 1,1 MB.
Se stai cercando un software gratuito (come in 'libre'), Ghostscript è sicuramente la scelta migliore. Tuttavia, non è sempre facile da usare:alcune delle sue (molto potenti) opzioni di elaborazione non sono facili da trovare documentate.
Dai un'occhiata a questa risposta, che spiega come eseguire un controllo più dettagliato sul downsampling della risoluzione dell'immagine rispetto a quello generico -dPDFSETTINGS=/screen
does (che definisce alcune impostazioni predefinite complessive, che potresti voler sovrascrivere):
- Come eseguire il downsampling delle immagini all'interno di un file pdf?
Fondamentalmente, ti dice come eseguire il downsampling di Ghostscript per tutte le immagini a una risoluzione di 72 dpi (questo valore è ciò che -dPDFSETTINGS=/screen
usa -- potresti voler andare ancora più in basso):
-dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dColorImageResolution=72 \
-dGrayImageResolution=72 \
-dMonoImageResolution=72 \
Se vuoi provare se Ghostscript è anche in grado di "disincorporare" i caratteri utilizzati (a volte funziona, a volte no, a seconda della complessità del carattere incorporato e anche del tipo di carattere utilizzato ), puoi provare ad aggiungere quanto segue al tuo comando gs:
gs \
-o output.pdf \
[...other options...] \
-dEmbedAllFonts=false \
-dSubsetFonts=true \
-dConvertCMYKImagesToRGB=true \
-dCompressFonts=true \
-c ".setpdfwrite <</AlwaysEmbed [ ]>> setdistillerparams" \
-c ".setpdfwrite <</NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats /Arial]>> setdistillerparams" \
-f input.pdf
Nota: Tieni presente che il downsampling della risoluzione dell'immagine ridurrà sicuramente la qualità (in modo irreversibile) e il dis-incorporamento dei caratteri renderà difficile o impossibile la visualizzazione e la stampa dei PDF a meno che gli stessi caratteri non siano installati sulla macchina....
Aggiorna
Un'opzione che avevo trascurato nella mia risposta originale è aggiungere
-dDetectDuplicateImages=true
alla riga di comando. Questo parametro fa sì che Ghostscript provi a rilevare più volte qualsiasi immagine incorporata nel PDF. Ciò può accadere se si utilizza un'immagine come logo o sfondo della pagina e se il software di generazione del PDF non è ottimizzato per questa situazione. Questo era il caso delle versioni precedenti di OpenOffice/LibreOffice (ho testato l'ultima versione di LibreOffice, v4.3.5.2, e non fa più cose così stupide).
Succede anche se concateni i file PDF con l'aiuto di pdftk
. Per mostrarti l'effetto e come puoi scoprirlo, diamo un'occhiata a un file PDF di esempio:
pdfinfo p1.pdf
Producer: libtiff / tiff2pdf - 20120922
CreationDate: Tue Jan 6 19:36:34 2015
ModDate: Tue Jan 6 19:36:34 2015
Tagged: no
UserProperties: no
Suspects: no
Form: none
JavaScript: no
Pages: 1
Encrypted: no
Page size: 595 x 842 pts (A4)
Page rot: 0
File size: 20983 bytes
Optimized: no
PDF version: 1.1
Versioni recenti di pdfimages
di Poppler utility ha aggiunto il supporto per un -list
parametro, che può elencare tutte le immagini incluse in un file PDF:
pdfimages -list p1.pdf
page num type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------
1 0 image 423 600 rgb 3 8 jpeg no 7 0 52 52 19.2K 2.6%
Questo PDF di esempio è un documento di 1 pagina, contenente un'immagine, compressa con compressione JPEG, ha una larghezza di 423 pixel e un'altezza di 600 pixel e viene visualizzata a una risoluzione di 52 PPI sulla pagina.
Se concatenamo 3 copie di questo file con l'aiuto di pdftk
così:
pdftk p1.pdf p1.pdf p1.pdf cat output p3.pdf
quindi il risultato mostra queste proprietà dell'immagine tramite pdfimages -list
:
pdfimages -list p3.pdf
page num type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------
1 0 image 423 600 rgb 3 8 jpeg no 4 0 52 52 19.2K 2.6%
2 1 image 423 600 rgb 3 8 jpeg no 8 0 52 52 19.2K 2.6%
3 2 image 423 600 rgb 3 8 jpeg no 12 0 52 52 19.2K 2.6%
Questo mostra che ci sono 3 oggetti PDF identici (con gli ID 4, 8 e 12) che sono incorporati in p3.pdf
adesso. p3.pdf
è composto da 3 pagine:
pdfinfo p3.pdf | grep Pages:
Pages: 3
Ottimizza il PDF sostituendo le immagini duplicate con riferimenti
Ora possiamo applicare l'ottimizzazione sopra menzionata con l'aiuto di Ghostscript
gs -o p3-optim.pdf -sDEVICE=pdfwrite -dDetectDuplicateImages=true p3.pdf
Controllo:
pdfimages -list p3-optim.pdf
page num type width height color comp bpc enc interp objectID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------
1 0 image 423 600 rgb 3 8 jpeg no 10 0 52 52 19.2K 2.6%
2 1 image 423 600 rgb 3 8 jpeg no 10 0 52 52 19.2K 2.6%
3 2 image 423 600 rgb 3 8 jpeg no 10 0 52 52 19.2K 2.6%
C'è ancora un'immagine elencata per pagina, ma ora l'ID oggetto PDF è sempre lo stesso:10.
ls -ltrh p1.pdf p3.pdf p3-optim.pdf
[email protected] 1 kp staff 20K Jan 6 19:36 p1.pdf
-rw-r--r-- 1 kp staff 60K Jan 6 19:37 p3.pdf
-rw-r--r-- 1 kp staff 16K Jan 6 19:40 p3-optim.pdf
Come puoi vedere, la concatenazione "stupida" fatta con pdftk ha aumentato la dimensione del file originale fino a tre volte quella originale. L'ottimizzazione di Ghostscript lo ha ridotto di molto.
Le versioni più recenti di Ghostscript possono persino applicare il -dDetectDuplicateImages
per impostazione predefinita. (AFAIR, v9.02, che lo ha introdotto per la prima volta, non lo utilizzava per impostazione predefinita.)