Réduire la taille du fichier PDF en utilisant Ghostscript sur Linux n'a pas fonctionné

j'ai environ 50-60 fichiers pdf (images) qui sont de 1,5 Mo de large chacun. Maintenant, je ne veux pas avoir des gros fichiers pdf dans ma thèse, ainsi le téléchargement, la lecture et l'impression d'une douleur à l'arrière. J'ai donc essayé d'utiliser ghostscript pour faire ce qui suit:

gs 
  -dNOPAUSE -dBATCH 
  -sDEVICE=pdfwrite 
  -dCompatibilityLevel=1.4 
  -dPDFSETTINGS="/screen" 
  -sOutputFile=output.pdf 
    L_2lambda_max_1wl_E0_1_zg.pdf

cependant, mon pdf de 1,4 Mo est maintenant de 1,5 Mo de large.

Qu'est-ce que j'ai fait de mal? Y a-t-il un moyen de vérifier la résolution du fichier pdf? J'ai juste besoin d'images 300dpi, donc quelqu'un suggère d'utiliser convert pour changer la résolution ou y a-t-il un moyen pour que je puisse changer la résolution de l'image (la réduire) avec gs, l'image est très granuleuse quand j'utilise convert

comment j'utilise convert:

 convert 
     -units PixelsPerInch 
      ~/Desktop/L_2lambda_max_1wl_E0_1_zg.pdf 
     -density 600 
      ~/Desktop/output.pdf

Exemple De Fichier

http://dl.dropbox.com/u/13223318/L_2lambda_max_1wl_E0_1_zg.pdf

11
demandé sur Kurt Pfeifle 2012-08-07 21:05:58

2 réponses

si vous utilisez Ghostscript -dPDFSETTINGS=/screen c'est juste une sorte de raccourci. En fait, vous obtiendrez (implicitement) tout un tas de paramètres utilisés, que vous pouvez interroger avec la commande suivante:

gs \
  -dNODISPLAY \
  -c ".distillersettings {exch ==only ( ) print ===} forall quit" \
| grep '/screen'

Sur mon Ghostscript (v9.06prerelease) - je obtenir la sortie suivante (légèrement modifié pour augmenter la lisibilité):

/screen 
  << /DoThumbnails false 
     /MonoImageResolution 300 
     /ColorImageDownsampleType /Average 
     /PreserveEPSInfo false 
     /ColorConversionStrategy /sRGB 
     /GrayImageDownsampleType /Average 
     /EmbedAllFonts true 
     /CannotEmbedFontPolicy /Warning 
     /PreserveOPIComments false 
     /GrayImageResolution 72 
     /GrayACSImageDict << 
                        /ColorTransform 1 
                        /QFactor 0.76 
                        /Blend 1 
                        /HSamples [2 1 1 2] 
                        /VSamples [2 1 1 2] 
                      >> 
     /ColorImageResolution 72 
     /PreserveOverprintSettings false 
     /CreateJobTicket false 
     /AutoRotatePages /PageByPage 
     /MonoImageDownsampleType /Average 
     /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 << 
                          /ColorTransform 1 
                          /QFactor 0.76 
                          /Blend 1 
                          /HSamples [2 1 1 2] 
                          /VSamples [2 1 1 2] >> 
     /CompatibilityLevel 1.3 
     /UCRandBGInfo /Remove 
>>

je me demande si vos fichiers PDF sont chargés d'image, et si ce genre de conversion n'est pas une bonne chose (F. E. re-sampling images with the 'wrong' les paramètres), qui augmentent la taille du fichier...

si c'est le cas (PDF lourd d'image), dites-le, et je vais mettre à jour cette réponse avec quelques suggestions....


mise à Jour

j'ai regardé le fichier d'échantillon fourni par L'ADN. Intéressant...

Non, il n' contient image.

au lieu de cela, il contient un grand flux (comprimé en utilisant /FlateDecode), qui se compose d'environ 700.000+ (!!) opérations, principalement des opérations mono-vectorielles en PDF, telles que:

m (moveto),

l (lineto),

d (setdash),

w (setlinewidth),

S (accident vasculaire cérébral),

s (closepath et accident vasculaire cérébral),

W* (eoclip),

rg et RG (setrgbcolor)

et un peu plus.

(CE Code PDF est très peu écrit AFAICS (mais fait son travail), parce qu'il ne concaténate de nombreux coups courts au lieu de faire "long" ceux, et presque chaque coup définit à nouveau la couleur (même si elle est la même que précédemment), et a tous les autres au-dessus (coup de départ, coup de fin,...).

Ghostscript est -dPDFSETTINGS=/screen ne pas ici (il n'y a pas d'images pour sous-échantillonner, par exemple). L'augmentation de la taille du fichier (+48 kByte pour être précis) est probablement due à Ghostscript réorganisation d'une partie des caresses internes, etc. commandes à un ordre différent quand il interprète le fichier.

il n'y a donc pas grand chose que vous puissiez faire à propos de la taille du fichier PDF ...

  • ...sauf si vous convertissez chacune de ces pages PDF en un REAL image comme PNG:
    gs \
      -o out72.png \
      -sDEVICE=pngalpha \
       L_2lambda_max_1wl_E0_1_zg.pdf

(j'ai utilisé le pngalpha sortie pour obtenir un fond transparent.) Les dimensions de l'image de '.png'259x213px, la taille du fichier est désormais de 70 ko. Mais je suis sûr que vous n'aimerez pas la qualité: -)

la qualité de sortie est "mauvaise" car Ghostscript utilise une résolution par défaut de 72 dpi.

puisque vous avez dit que vous voudriez avoir 300 DPI, la commande devient ceci:

gs \
  -o out300.png \
  -sDEVICE=pngalpha \
  -r300 \
   L_2lambda_max_1wl_E0_1_zg.pdf

La taille du fichier est maintenant 750 ko, les dimensions de l'image sont 1080x889 Pixels.


mise à Jour 2

Depuis Curiosité est en vogue ces jours-ci... : -)...J'ai essayé de réduire la taille du fichier avec L'aide D'Adobe Acrobat X Pro sur Mac.

vous voulez connaître les résultats?

effectuer un " Enregistrer sous... PDF (avec la réduction de la taille du fichier)' -- qui pour moi dans le passé ont toujours donné de très bons résultats! -- création d'un fichier 1,8++ MByte (+29%). Je suppose que cela place définitivement les performances de Ghostscript (augmentation de la taille du fichier +3%) dans une perspective réaliste !

16
répondu Kurt Pfeifle 2014-09-16 11:38:06

L'ADN a décidé d'opter pour les png à échelle de gris. La manière dont il est le processus de création est en deux étapes:

  1. Etape 1: convertissez une page PDF en couleur (telle que ) à une page PDF en échelle de gris, en utilisant Ghostscript's pdfwrite appareil et les paramètres

    -dColorConversionStrategy=/Gray et

    -dProcessColorModel=/DeviceGray.
  2. Etape 2: convertissez la page PDF en niveaux de gris en PNG, en utilisant Ghostscript pngalpha appareil à une résolution de 300 dpi (-r300 sur la ligne de commande GS).

cela réduit la taille de son fichier initial de 1,4 Mo à 0,7 Mo.

mais ce workflow présente l'inconvénient suivant:

  • il perd toutes les informations de couleur, sans économiser beaucoup d'espace disque par rapport à un couleur sortie écrite à la même résolution, directement à partir du PDF!

il y a 2 alternatives à L'ADN flux de travail:

  1. une conversion en une étape de (couleur) PDF- > (Couleur) PNG, en utilisant Ghostscript pngalpha dispositif avec le PDF original comme entrée (mêmes paramètres de résolution de 300 dpi). Cela aurait un avantage:

    • il garderait l'information de couleur dans la sortie PNG, nécessitant seulement un peu plus d'espace sur le disque!
  2. Une étape de conversion de (couleur) PDF -> niveaux de gris PNG, en utilisant Ghostscript pnggray dispositif avec le PDF original comme entrée (mêmes paramètres de résolution de 300 dpi), avec ce mélange d'avantage/inconvénient:

    • il perdrait les informations de couleur dans la sortie PNG.
    • il perdrait le fond transparent qui a été préservé dans le flux de travail de L'ADN.
    • Il permettrait de sauver beaucoup de l'espace disque, parce que la taille serait de descendre à environ 20% de la sortie du flux de travail de L'ADN.

alors vous pouvez vous décider et voir les tailles de sortie et la qualité côte à côte, voici un script shell pour démontrer les différences:

#!/bin/bash
#
# Copywrite (c) 2012 <kurt.pfeifle@gmail.com>
# License: Creative Commons (CC BY-SA 3.0) 

function echo_do() {
        echo
        echo "Command:     ${*}"
        echo "--------"
        echo
        "${@}"
}

[ -d out ] || mkdir out

echo 
echo "    We assume all PDF pages are 1-page PDFs!"
echo "    (otherwise we'd have to include something like '%03d'"
echo "    into the output filenames in order to get paged output)"
echo

echo '
 # Convert Color PDF to Grayscale PDF.
 # If PDF has transparent background (most do), 
 # this will remain transparent in output.)
 # ATTENTION: since we don't use a resolution,
 # pdfwrite will use its default value of '-r720'.
 # (However, this setting will only affect raster objects...)
'
for i in *.pdf
do
echo_do gs \
 -o "out/${i}---pdfwrite-devicegray-gs.pdf" \
 -sDEVICE=pdfwrite \
 -dColorConversionStrategy=/Gray \
 -dProcessColorModel=/DeviceGray \
 -dCompatibilityLevel=1.4 \
  "${i}"
done

echo '
 # Convert (previously generated) grayscale PDF to PNG using Alpha channel
 # (Alpha channel can make backgrounds transparent)
'
for i in out/*pdfwrite-devicegray*.pdf
do
echo_do gs \
 -o "out/$(basename "${i}")---pngalpha-from-pdfwrite-devicegray-gs.png" \
 -sDEVICE=pngalpha \
 -r300 \
  "${i}"
done

echo '
 # Convert (color) PDF to grayscale PNG using Alpha channel 
 # (Alpha channel can make backgrounds transparent)
'
for i in *.pdf
do
# Following only required for 'pdfwrite' output device, not for 'pngalpha'!
#                -dProcessColorModel=/DeviceGray 
echo_do gs \
 -o "out/${i}---pngalphagray_gs.png" \
 -sDEVICE=pngalpha \
 -dColorConversionStrategy=/Gray \
 -r300 \
  "${i}"
done

echo '
 # Convert (color) PDF to (color) PNG using Alpha channel
 # (Alpha channel can make backgrounds transparent)
'
for i in *.pdf
do
echo_do gs \
 -o "out/${i}---pngalphacolor_gs.png" \
 -sDEVICE=pngalpha \
 -r300 \
  "${i}"
done

echo '
 # Convert (color) PDF to grayscale PNG 
 # (no Alpha channel here, therefor [mostly] white backgrounds)
'
for i in *.pdf
do
echo_do gs \
 -o "out/${i}---pnggray_gs.png" \
 -sDEVICE=pnggray  \
 -r300 \
  "${i}"
done

echo " All output to be found in ./out/ ..."
echo

exécutez ce script et comparez les différentes sorties côte à côte.

Oui, le "direct-niveaux de gris-PNG-de-couleur-PDF-aide-pnggray-périphérique" on peut chercher une bit pire (et il ne porte pas le fond transparent) que l'autre -- mais c'est aussi seulement 20% de la taille de son fichier. D'autre part, si vous voulez acheter un peu plus de qualité à sacrifier un peu d'espace disque -- vous pouvez utiliser -r400 au lieu de -r300...

2
répondu Kurt Pfeifle 2012-08-08 20:38:19