Ghostscript pour fusionner des PDF compresse le résultat

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:

  1. Lire le ou les fichiers d’entrée avec tous ses objects et les convertir dans son format interne pour les représentations graphiques de pages.
  2. Faites les manipulations demandées sur la ligne de commande au contenu de la page dans le format interne.
  3. Écrivez un PDF complètement nouveau.

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:

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

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