J’ai trouvé cette commande ordonnée pour fusionner plusieurs PDF en un, en utilisant Ghostscript:
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf
La taille résultante est inférieure à la taille combinée des 2 PDF.
L’exécution de la commande avec un seul fichier en entrée donne toujours un fichier de sortie de taille inférieure.
Existe-t-il une option sur Ghostscript pour copier les pages telles qu’elles apparaissent lors de la fusion sans aucune compression?
Si ce n’est pas le cas, est-il possible que la compression Ghostscript soit si bonne qu’elle n’entraînera aucune perte de qualité?
Voici quelques options supplémentaires que vous pouvez utiliser lorsque vous utilisez pdfwrite
comme périphérique. Selon cette page, si vous ne transmettez rien, l’ -dPDFSETTINGS
est définie sur quelque chose proche de /screen
, bien qu’elle ne soit pas plus spécifique. Vous pouvez essayer de le paramétrer sur -dPDFSETTINGS=/prepress
qui ne devrait compresser que des -dPDFSETTINGS=/prepress
supérieurs à 300 dpi.
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=out.pdf in1.pdf in2.pdf
Une autre alternative est pdftk :
pdftk in1.pdf in2.pdf cat output out.pdf
Certaines des optimisations de taille que vous avez observées peuvent provenir du nettoyage des objects inutilisés par Ghostscript, de ses améliorations récentes d’optimisation de la police (utilisez-vous une version très récente de GS?!?) Et de l’échantillonnage / rééchantillonnage des images. arrivé.
Ghostscript, s’il est utilisé pour les conversions PDF -> PDF , fonctionne essentiellement comme ceci:
Cela signifie que pour la plupart des opérations PDF -> PDF , les objects PDF sont classés et numérotés différemment, et même le code interne de l’object peut avoir changé (même si vos yeux ne détectent aucune différence entre les PDF d’entrée et de sortie).
Par défaut, Ghostscript compresse également tous les stream d’objects non compressés dans le fichier d’origine (mais il s’agit d’une compression sans perte).
Maintenant, pour votre ligne de commande très simpliste qui ne contient aucun souhait de manipulation , Ghostscript suppose que vous voulez utiliser -dPDFSETTINGS=/default
, définit ce paramètre implicitement et fonctionne en conséquence.
Maintenant, quels sont les parameters PDFSET /default
?! Vous avez deux options pour découvrir:
Lisez le manuel . La grande table au milieu de cette section donne un aperçu. Vous pouvez voir que celui-ci -dPDFSETTINGS=/default
en lui-même n’est qu’un raccourci pour les quelques dizaines d’autres parameters plus spécifiques qu’il représente. Le lien vers la documentation fournie est pour le HEAD actuel du code de développement et votre version effectivement utilisée peut bien sûr être différente .
Interrogez (le vôtre) Ghostscript pour connaître la signification détaillée de ce paramètre. Mes réponses à la question “Interrogation de Ghostscript pour les options / parameters par défaut d’un périphérique de sortie …” et question “Que sont les dictionnaires PostScript et comment y accéder (via Ghostscript)?” élaborez un peu plus à ce sujet. En bref, pour interroger Ghostscript sur les détails de son /default
PDFSETTINGS /default
, exécutez cette commande:
gs \ -q \ -dNODISPLAY \ -c ".distillersettings /default get {exch ==only ( ) print ===} forall quit"
Vous devriez obtenir un résultat très similaire à ceci:
/Optimize false /DoThumbnails false /PreserveEPSInfo true /ColorConversionStrategy /LeaveColorUnchanged /DownsampleMonoImages false /EmbedAllFonts true /CannotEmbedFontPolicy /Warning /PreserveOPIComments true /GrayACSImageDict << /HSamples [2 1 1 2] /VSamples [2 1 1 2] /QFactor 0.9 /Blend 1 >> /DownsampleColorImages false /PreserveOverprintSettings true /CreateJobTicket false /AutoRotatePages /PageByPage /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] /ColorACSImageDict << /HSamples [2 1 1 2] /VSamples [2 1 1 2] /QFactor 0.9 /Blend 1 >> /DownsampleGrayImages false /UCRandBGInfo /Preserve
Le seul point qui se distingue de ceux-ci: vous voudrez peut-être modifier /AutoRotagePages
de /PageByPage
à /None
. Sur la ligne de commande, placez-la comme -dAutoRotatePages=/None
.
Pour vous donner une liste complète des parameters qui indiqueraient spécifiquement à Ghostscript d’utiliser le plus possible un mode passthrough au PDF d’entrée en ajoutant ces parameters:
-dAntiAliasColorImage=false \ -dAntiAliasGrayImage=false \ -dAntiAliasMonoImage=false \ -dAutoFilterColorImages=false \ -dAutoFilterGrayImages=false \ -dDownsampleColorImages=false \ -dDownsampleGrayImages=false \ -dDownsampleMonoImages=false \ -dColorConversionStrategy=/LeaveColorUnchanged \ -dConvertCMYKImagesToRGB=false \ -dConvertImagesToIndexed=false \ -dUCRandBGInfo=/Preserve \ -dPreserveHalftoneInfo=true \ -dPreserveOPIComments=true \ -dPreserveOverprintSettings=true \
Vous pouvez donc essayer cette commande:
gs \ -o output.pdf \ -sDEVICE=pdfwrite \ -dAntiAliasColorImage=false \ -dAntiAliasGrayImage=false \ -dAntiAliasMonoImage=false \ -dAutoFilterColorImages=false \ -dAutoFilterGrayImages=false \ -dDownsampleColorImages=false \ -dDownsampleGrayImages=false \ -dDownsampleMonoImages=false \ -dColorConversionStrategy=/LeaveColorUnchanged \ -dConvertCMYKImagesToRGB=false \ -dConvertImagesToIndexed=false \ -dUCRandBGInfo=/Preserve \ -dPreserveHalftoneInfo=true \ -dPreserveOPIComments=true \ -dPreserveOverprintSettings=true \ input1.pdf \ input2.pdf
Enfin , comme Chris Haas l’a déjà fait remarquer: vous pouvez également utiliser pdftk
si vous ne souhaitez aucune optimisation appliquée par défaut par Ghostscript. pdftk
est tout simplement incapable de faire de telles choses, et vous obtiendrez un peu de rapidité pour son fonctionnement relativement stupide (mais probablement aussi des sorties de taille de fichier beaucoup plus importantes que celles de Ghostscript).