web-dev-qa-db-fra.com

Ghostscript pour fusionner les PDF compresse le résultat

J'ai trouvé cette commande intéressante pour fusionner plusieurs PDF en une seule, en utilisant Ghostscript:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf

La taille résultante est plus petite que la taille combinée des 2 PDF.

L'exécution de la commande avec un seul fichier en entrée entraîne toujours un fichier de sortie de plus petite taille.

Existe-t-il une option sur Ghostscript pour simplement copier les pages telles qu'elles apparaissent lors de la fusion sans effectuer de compression?

Sinon, est-il possible que la compression Ghostscript soit si bonne qu'elle n'entraînera absolument aucune perte de qualité?

60
Dimitris Baltas

Voici quelques options supplémentaires que vous pouvez transmettre lorsque vous utilisez pdfwrite comme appareil. Selon cette page, si vous ne passez rien, alors -dPDFSETTINGS il est réglé sur quelque chose de proche de /screen, bien qu'il ne soit pas plus précis. Vous pouvez essayer de le régler sur -dPDFSETTINGS=/prepress qui ne devrait compresser que les éléments 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
65
Chris Haas

Certaines optimisations de taille que vous avez observées peuvent provenir du nettoyage par Ghostscript des objets inutilisés, de ses améliorations d'optimisation de police récemment acquises (utilisez-vous une version très récente de GS?!?) Et éventuellement du rééchantillonnage/sous-échantillonnage d'image qui peut avoir arrivé.

Ghostscript, s'il est utilisé pour les conversions PDF -> PDF, fonctionne essentiellement comme ceci:

  1. Lisez le (s) fichier (s) d'entrée avec tous ses objets et convertissez-les dans son format interne pour les représentations de pages graphiques.
  2. Faites les manipulations demandées sur la ligne de commande au contenu de la page au format interne.
  3. Écrivez un tout nouveau PDF.

Cela signifie que pour la plupart des opérations PDF -> PDF vous aurez un ordre et une numérotation différents pour les objets PDF, et même le code interne de l'objet peut avoir changé (même si vos yeux ne découvrent aucune différence entre les PDF d'entrée et de sortie).

Par défaut, Ghostscript compressera également tous les flux d'objets qui ont été dé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 manipulations, Ghostscript suppose vous voulez utiliser -dPDFSETTINGS=/default, définit ce paramètre implicitement et fonctionne en conséquence.

Maintenant quoi sont les /default PDFSETTINGS?! Vous avez deux options pour le savoir:

  1. Lisez le manuel . Le grand tableau au milieu de cette section donne un aperçu. Vous pouvez voir que celui-ci -dPDFSETTINGS=/default en soi n'est qu'un raccourci pour les dizaines d'autres paramètres plus spécifiques qu'il représente. Le lien vers la documentation fournie est pour le HEAD du code de développement actuel et votre version réellement utilisée peut être différente bien sûr .

  2. Interrogez (le vôtre) Ghostscript pour la signification détaillée de ce paramètre. Mes réponses à la question ' Interrogation de Ghostscript pour les options/paramètres par défaut d'un périphérique de sortie ... ' et question ' Que sont les dictionnaires PostScript, et comment peut-on y accéder (via Ghostscript)? ' élaborez un peu plus à ce sujet. En bref, pour demander à Ghostscript les détails de son /default PDFSETTINGS, 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 ressort de ces derniers: vous voudrez peut-être changer /AutoRotagePages de /PageByPage à /None. Sur la ligne de commande, vous devez le mettre comme -dAutoRotatePages=/None.

    Pour vous donner une liste complète des paramètres qui indiqueraient spécifiquement à Ghostscript d'utiliser autant d'un mode passthrough que possible à l'entrée PDF en ajoutant ces paramètres:

      -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à laissé entendre: vous pouvez également utiliser pdftk si vous en particulier, vous ne voulez aucune des optimisations que Ghostscript applique par défaut. pdftk est tout simplement incapable de faire de telles choses, et vous gagnerez un peu de vitesse pour sa relative stupidité de fonctionnement (mais probablement aussi des sorties de taille de fichier beaucoup plus grandes que celles de Ghostscript).

31
Kurt Pfeifle