J'utilise Ghostscript avec les options suivantes tirées d'ici.
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
-dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
Vous pouvez trouver que pdftocairo
(de Poppler) peut créer des PDF plus petits, mais attention, cela supprimera certaines fonctionnalités (telles que les hyperliens).
Vous pouvez obtenir de bons résultats en convertissant de PDF en Postscript, puis de nouveau en PDF à l'aide de
pdf2ps file.pdf file.ps
ps2pdf -dPDFSETTINGS=/ebook file.ps file-optimized.pdf
La valeur de l'argument -dPDFSETTINGS
définit la qualité des images dans le PDF résultant. Les options sont, de faible à haute qualité :/screen
, /default
, /ebook
, /printer
, /prepress
, voir http://milan.kupcevic.net/ghostscript-ps-pdf/ pour une référence.
Le fichier Postscript peut devenir assez volumineux, mais les résultats en valent la peine. Je suis passé d'un PDF de 60 Mo à un fichier Postscript de 140 Mo, mais j'ai fini avec un PDF optimisé de 1,1 Mo.
Si vous recherchez un logiciel gratuit (comme dans 'libre'), Ghostscript est sûrement votre meilleur choix. Cependant, il n'est pas toujours facile à utiliser - certaines de ses options de traitement (très puissantes) ne sont pas faciles à trouver documentées.
Jetez un œil à cette réponse, qui explique comment exécuter un contrôle plus détaillé sur le sous-échantillonnage de la résolution de l'image que ce que le générique -dPDFSETTINGS=/screen
fait (qui définit quelques valeurs globales par défaut, que vous voudrez peut-être remplacer) :
- Comment sous-échantillonner des images dans un fichier pdf ?
Fondamentalement, il vous indique comment faire en sorte que Ghostscript sous-échantillonne toutes les images à une résolution de 72 dpi (cette valeur correspond à -dPDFSETTINGS=/screen
utilise -- vous voudrez peut-être descendre encore plus bas) :
-dDownsampleColorImages=true \
-dDownsampleGrayImages=true \
-dDownsampleMonoImages=true \
-dColorImageResolution=72 \
-dGrayImageResolution=72 \
-dMonoImageResolution=72 \
Si vous voulez essayer si Ghostscript est également capable de "désintégrer" les polices utilisées (parfois cela fonctionne, parfois non -- en fonction de la complexité de la police intégrée, et aussi du type de police utilisé ), vous pouvez essayer d'ajouter ce qui suit à votre commande 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
Remarque : Sachez que le sous-échantillonnage de la résolution de l'image réduira sûrement la qualité (de manière irréversible) et que la désintégration des polices rendra difficile, voire impossible, l'affichage et l'impression des PDF à moins que les mêmes polices ne soient installées sur la machine....
Mettre à jour
Une option que j'avais négligée dans ma réponse initiale est d'ajouter
-dDetectDuplicateImages=true
à la ligne de commande. Ce paramètre conduit Ghostscript à essayer de détecter toutes les images qui sont intégrées plusieurs fois dans le PDF. Cela peut arriver si vous utilisez une image comme logo ou fond de page, et si le logiciel de génération de PDF n'est pas optimisé pour cette situation. C'était le cas avec les anciennes versions d'OpenOffice/LibreOffice (j'ai testé la dernière version de LibreOffice, v4.3.5.2, et elle ne fait plus des choses aussi stupides).
Cela se produit également si vous concaténez des fichiers PDF à l'aide de pdftk
. Pour vous montrer l'effet, et comment vous pouvez le découvrir, regardons un exemple de fichier PDF :
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
Versions récentes du pdfimages
de Poppler l'utilitaire a ajouté la prise en charge d'un -list
paramètre, qui peut lister toutes les images incluses dans un fichier 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%
Cet exemple de PDF est un document d'une page, contenant une image, qui est compressée avec la compression JPEG, a une largeur de 423 pixels et une hauteur de 600 pixels et s'affiche à une résolution de 52 PPI sur la page.
Si nous concaténons 3 copies de ce fichier à l'aide de pdftk
comme ça :
pdftk p1.pdf p1.pdf p1.pdf cat output p3.pdf
puis le résultat affiche ces propriétés d'image via 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%
Cela montre qu'il y a 3 objets PDF identiques (avec les ID 4, 8 et 12) qui sont intégrés dans p3.pdf
à présent. p3.pdf
se compose de 3 pages :
pdfinfo p3.pdf | grep Pages:
Pages: 3
Optimisez le PDF en remplaçant les images en double par des références
Nous pouvons maintenant appliquer l'optimisation mentionnée ci-dessus à l'aide de Ghostscript
gs -o p3-optim.pdf -sDEVICE=pdfwrite -dDetectDuplicateImages=true p3.pdf
Vérification :
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%
Il y a toujours une image répertoriée par page -- mais l'ID d'objet PDF est toujours le même :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
Comme vous pouvez le voir, la concaténation "stupide" faite avec pdftk a augmenté la taille du fichier d'origine à trois fois celle d'origine. L'optimisation par Ghostscript l'a considérablement réduit.
Les versions les plus récentes de Ghostscript peuvent même appliquer le -dDetectDuplicateImages
par défaut. (AFAIR, v9.02, qui l'a introduit pour la première fois, ne l'a pas utilisé par défaut.)