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?
exec('gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4
-dPDFSETTINGS=/screen -sOutputFile='.$file_new.' '.$file);
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 ....
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
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.)
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.
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
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).
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.
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/