Utilisez Ghostscript, mais dites-lui de ne pas retraiter les images?


30

J'ai un PDF qui a déjà compressé et des images quelque peu artificielles, et j'utilise Ghostscript pour ajouter une page de titre à ce PDF.

Cependant, je ne trouve aucun moyen de dire à GS d'utiliser simplement les images existantes sans les retraiter, et maintenant j'ai l'impression que c'est quelque chose à voir avec le fonctionnement de GS, c'est-à-dire que vous ne pouvez pas recompiler / lier un PDF sans retraitement de ses images .. Est-ce vrai?

Je peux augmenter le paramètre DPI dans GS, mais il passera de 5 Mo à 60 Mo tout en ayant l' air pire.

Existe-t-il une meilleure alternative à GS qui fera ce dont j'ai besoin (de préférence qui se compilera sur OS X)?


Pouvez-vous modifier votre question et citer la ligne de commande exacte que vous utilisez pour ajouter votre page de titre au PDF d'origine? Ensuite, je pourrais vous dire exactement quoi changer ou ajouter à la ligne de commande afin d'obtenir une meilleure sortie pour les images ...
Kurt Pfeifle

Je ne veux pas simplement avoir une meilleure apparence, je veux fusionner sans retraitement. Cela a) entraînera une meilleure qualité (transformations sans perte) et b) ne perdra pas des heures de temps processeur à traiter mon document de plus de 1000 pages.
Mahmoud Al-Qudsi

1
Hé, vous n'avez pas répondu à ma question et vous n'avez pas cité la ligne de commande GS exacte que vous utilisez. Ce qui signifie: vous n'obtiendrez pas l'aide concernant GS que vous recherchez ...
Kurt Pfeifle

Réponses:


44

Si vous souhaitez simplement concaténer deux fichiers PDF sans aucun retraitement de son contenu, pdftkc'est pour vous. (Sur Mac OS X, cela devrait être disponible via MacPorts ou Fink, pour Linux, il existe des packages natifs pour toutes les principales distributions; pour Windows, regardez ici. ) Essayez ceci:

 pdftk title.pdf content.pdf cat output book.pdf

Cela ajoutera le titre.pdf au contenu.pdf et enregistrera le résultat dans book.pdf .

pdftkest un moyen "stupide" mais très rapide de concaténer deux (ou plus) fichiers PDF. « Dumb » dans la mesure où , comme pdftkne signifie en aucune façon d' interpréter le flux de données PDF, il est tout simplement en sorte que les numéros d'objet internes sont à nouveau rebattues au besoin et apparaissent dans le fichier PDF xrefstructure (qui est essentiellement une sorte de PDF TdC pour objets).

Ghostscript:

Si vous souhaitez utiliser Ghostscript, la commande de base pour concaténer les deux mêmes fichiers serait:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
   title.pdf \
   content.pdf

Cependant, comme vous l'avez constaté, cette simple ligne de commande peut gâcher la qualité de votre image. La raison en est que Ghostscript n'est pas un «vidage» lorsqu'il traite des PDF: il les interprète complètement lors de la lecture et crée un fichier complètement nouveau lors de l'écriture du résultat. Pour créer le résultat, il utilisera automatiquement les paramètres par défaut pour beaucoup de détails dans le traitement global. Ces valeurs par défaut s'appliqueront à tous les cas où ses invocations n'avaient pas indiqué à Ghostscript le contraire.

La méthode de Ghostscript pour créer le nouveau livre.pdf est donc beaucoup plus "intelligente" (mais aussi beaucoup plus lente) que pdftkla méthode de. (C'est aussi la raison pour laquelle Ghostscript est dans de nombreux cas capable - dans certaines limites - de "réparer" les fichiers PDF b0rken, ou d'incorporer des polices dans les PDF de sortie qui ne sont pas incorporées dans les PDF d'entrée, ou de supprimer les images en double, en remplaçant les par de simples références, etc. - et créé globalement des fichiers plus petits et mieux optimisés à partir de fichiers PDF gonflés en entrée ...)

La solution est de ne pas laisser Ghostscript utiliser ses valeurs par défaut: en ajoutant plus de paramètres personnalisés à la ligne de commande.

Qu'est-ce que cela signifie "Ghostscript" interprète "son entrée PDF" ?

Tout le fichier et son contenu (objets, flux, polices, images, ...) sont lus, vérifiés et conservés dans sa propre représentation interne, avant de cracher à nouveau le PDF résultant avec ses objets PDF. Cependant, quand «crache», Ghostscript appliquera tous ses paramètres par défaut internes pour les centaines de paramètres [*] qui sont disponibles.

Malheureusement, cela provoque votre «retraitement» des images selon ces paramètres par défaut - qui ne peuvent être évités ou remplacés qu'en ajoutant vos propres paramètres de ligne de commande (souhaités).

Vos problèmes d'image pourraient être causés par le besoin de Ghostscript (en raison de problèmes de licence) de ré-encoder les images JPEG2000 en encodage JPEG. Si vous voulez éviter cela, ajoutez ce qui suit à votre ligne de commande:

-dAutoFilterColorImages=false \
-dAutoFilterGrayImages=false \
-dColorImageFilter=/FlateEncode \
-dGrayImageFilter=/FlateEncode \

Les autres options de ligne de commande liées à l'image à considérer pour l'inclusion sont:

-dColorConversionStrategy=/LeaveColorUnchanged \
-dDownsampleMonoImages=false \
-dDownsampleGrayImages=false \
-dDownsampleColorImages=false \

Ainsi, la ligne de commande Ghostscript complète qui pourrait vous rendre heureux devrait se lire:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dDownsampleMonoImages=false \
  -dDownsampleGrayImages=false \
  -dDownsampleColorImages=false \
  -dAutoFilterColorImages=false \
  -dAutoFilterGrayImages=false \
  -dColorImageFilter=/FlateEncode \
  -dGrayImageFilter=/FlateEncode \
   title.pdf \
   content.pdf

Vous pouvez également dire à Ghostscript de ne PAS compresser les images du tout dans le PDF de sortie, en utilisant cette ligne de commande:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dEncodeColorImages=false \
  -dEncodeGrayImages=false \
  -dEncodeMonoImages=false \
   title.pdf \
   content.pdf

.


[*]:
Si vous souhaitez en savoir plus sur la liste complète des paramètres par défaut utilisés par le périphérique pdfwrite de Ghostscript , exécutez la commande suivante. Il vous renvoie la liste complète :

 gs \
   -sDEVICE=pdfwrite \
   -o /dev/null \
   -c "currentpagedevice { exch ==only ( ) print == } forall"

Pour obtenir des explications sur la signification exacte de tous ces paramètres, vous devrez lire dans la documentation Adobe sur les "Paramètres Distiller" . Ghostscript essaie très fort d'imiter tout cela ...


3
(FYI) Dans mon cas, les drapeaux dEncodeColorImages, dEncodeGrayImages, la dEncodeMonoImagescause du fichier de sortie à devenir beaucoup plus massive. En les supprimant, la taille du fichier est passée de 22 Mo à 3,1 Mo et la qualité d'image semble exactement identique à l'utilisation de ces indicateurs. Tous les uniques drapeaux avec I utilisation sont: dColorConversionStrategy=/LeaveColorUnchanged, dDownsampleMonoImages=false, dDownsampleGrayImages=false, dDownsampleColorImages=false, dAutoFilterColorImages=false, dAutoFilterGrayImages=false, dColorImageFilter=/FlateEncode,dGrayImageFilter=/FlateEncode
Dor

@Kurt Pfeifle Quelles sont les options autorisées -dColorImageFilter? Je ne peux que trouver FlateEncodeet DCTEncode. DCT semble faire du JPEG (pourquoi ont-ils chiffré cela?). Je pense que FLATE est une option obsolète pour les images depuis que le brevet de Bell Labs sur LZW n'est plus un problème? Cependant, après avoir passé un certain temps à chercher, je ne trouve pas comment utiliser le PNG (ou autre chose) ... Mes images originales sont au format PNG et je veux qu'elles restent inchangées. J'ai essayé l'option -c, mais cela me donne -c can only be used in a built with POSTSCRIPT included....
Louis Somers
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.