web-dev-qa-db-fra.com

Optimiser PDF (avec Ghostscript ou autre)

Ghostscript est-il la meilleure option si vous souhaitez optimiser un fichier PDF et réduire la taille du fichier?

J'ai besoin de stocker beaucoup de fichiers PDF et donc je dois optimiser et réduire la taille du fichier autant que possible

Quelqu'un a-t-il une expérience avec Ghostscript et/ou autre?

ligne de commande

exec('gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4
-dPDFSETTINGS=/screen -sOutputFile='.$file_new.' '.$file);
48
clarkk

Si vous cherchez 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 d'image que ce que le générique -dPDFSETTINGS=/screen does (qui définit quelques valeurs par défaut globales, que vous voudrez peut-être remplacer):

Fondamentalement, il vous indique comment faire Ghostscript sous-échantillonner toutes les images à une résolution de 72 dpi (cette valeur est ce que -dPDFSETTINGS=/screen utilise - vous voudrez peut-être aller 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 - selon la complexité de la police intégrée, et aussi sur le 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 la résolution d'image de sous-échantillonnage réduira sûrement la qualité (de manière irréversible), et le fait de désintégrer des polices rendra difficile ou impossible l'affichage et l'impression du PDF sauf si les mêmes polices sont installées sur la machine ....


Mise à jour

Une option que j'avais ignoré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 incorporées dans le PDF plusieurs fois. Cela peut se produire si vous utilisez une image comme logo ou arrière-plan 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 de 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 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

Les versions récentes de l'utilitaire pdfimages de Poppler ont ajouté la prise en charge d'un -list paramètre, qui peut répertorier 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 PDF est un document d'une page, contenant une image, qui est compressée avec une compression JPEG, a une largeur de 423 pixels et une hauteur de 600 pixels et s'affiche avec une résolution de 52 PPI sur la page.

Si nous concaténons 3 copies de ce fichier à l'aide de pdftk comme ceci:

pdftk p1.pdf p1.pdf p1.pdf cat output p3.pdf

le résultat montre 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 existe 3 PDF objets 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

Optimiser PDF en remplaçant les images en double par des références

Maintenant, nous pouvons appliquer l'optimisation susmentionnée à 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 maintenant: 10.

 ls -ltrh p1.pdf p3.pdf p3-optim.pdf

   -rw-r--r--@ 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 concatentation "stupide" faite avec pdftk a augmenté la taille du fichier d'origine à trois fois celle d'origine. L'optimisation de Ghostscript l'a fait baisser considérablement.

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

74
Kurt Pfeifle

Vous pouvez obtenir de bons résultats en convertissant de PDF en Postscript, puis de nouveau en PDF en utilisant

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 60 Mo PDF à un fichier Postscript de 140 Mo, mais j'ai fini avec un PDF optimisé de 1,1 Mo.

27
Martijn de Milliano

J'utilise Ghostscript avec les options suivantes tirées de ici .

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen \
 -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
7
Primoz Rome

Vous constaterez peut-être que pdftocairo (de Poppler ) peut créer des fichiers PDF plus petits, mais attention, il supprimera certaines fonctionnalités (comme les hyperliens).

5
Anon

Vous perdrez en qualité, mais si ce n'est pas un problème, le convert d'ImageMagick peut s'avérer utile:

convert original.pdf reduced.pdf

Notez que cela ne fonctionne pas toujours: j'ai converti un fichier de 126 Mo en un fichier de 14 Mo à l'aide de cette commande, mais une autre fois, il a doublé la taille d'un fichier de 350 Ko.

Quoi qu'il en soit, cela vaut la peine d'essayer…

Comme mentionné dans les commentaires, il est bien sûr inutile d'appliquer cette commande sur un PDF vectoriel, elle ne sera utile que sur les images tramées.

Voir aussi cet article pour les options connexes.

Ghostscript est livré avec deux utilitaires utiles: pdfopt et ps2pdf14. Les deux peuvent être utilisés pour optimiser PDF fichier (s) mais dans certains cas, la taille du fichier "optimisé" peut être plus grande que l'original.

3
Onlyjob

Cela a fonctionné pour moi

Convertissez votre PDF en PS (cela crée un gros fichier

pdf2ps large.pdf very_large.ps

Convertissez le nouveau PS en PDF

ps2pdf very_large.ps small.pdf

Source: https://pandemoniumillusion.wordpress.com/2008/05/07/compress-a-pdf-with-pdftk/

2
Lukas Hillebrand