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
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 !
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:
- 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
. - 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:
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!
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
...