GNU/Linux >> Tutoriels Linux >  >> Linux

Optimiser les fichiers PDF (avec Ghostscript ou autre)

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.)


Linux
  1. Comment chiffrer des fichiers avec gocryptfs sous Linux

  2. Renommer les fichiers dans le répertoire ?

  3. Trier les fichiers dans un dossier spécifique avec Ranger ?

  4. Sauvegardez vos fichiers avec rsync

  5. Convertir un PDF en noir et blanc avec ghostscript

Retrouver les fichiers perdus avec Scalpel

Premiers pas avec la commande Tar

Comment télécharger des fichiers avec FileZilla

Télécharger des fichiers avec Monsta FTP

Commande lsof sous Linux avec exemples

Commande comm Linux avec exemples