PDFs verkleinern

By Matthias • General, German, Linux, UU-Planet • 6 May 2010

Neulich bekam ich ein extrem großes PDF (~24MB) auf einem USB-Stick, welches ich ins Internet hochladen wollte. Bei 24MB ist für ein PDF ist mir da jedoch der Webspace etwas zu schade, außerdem will keiner eine so große Datei laden. Also habe ich mich dumm und dämlich gesucht, eine gute Möglichkeit zu finden, das PDF zu verkleinern. Für die meisten Tipps brauchte man aber leider entweder die Quelldatei des Dokuments (die hatte ich nicht) oder aber Adobe Acrobat, welches nur auf Windows läuft und viel Geld kostet.

Das Problem an meinem PDF waren die vielen übergroßen Bilder, womit auch GZip-Komprimierung natürlich wenig Sinn macht. Irgendwann habe ich dann aber doch noch (nach stundenlangem Suchen) eine gute Möglichkeit gefunden, die Bilder in PDFs zu verkleinern. Die Lösung funktioniert mittels GhostScript, welches auf den meisten Linux-Rechnern vorinstalliert sein sollte. Ich habe die Kommandos mal in ein kleines Bashscript gesteckt:

#!/bin/bash
#
# Shrink filesize of a PDF using GhostScript
#
# syntax :
#    ./shrinkpdf.sh in=[input-file].pdf out=[output-file].pdf res=[resolution]
 
outfile="out.pdf"
res="72"
 
for arg; do
  case $arg in
    in=*) infile=${arg#in=};;
    out=*) outfile=${arg#out=};;
    res=*) res=${arg#res=};;
  esac;
done
 
if [ -z "$infile" ]; then
   usage;
   exit 1;
fi
 
echo "Shrinking pdf..."
echo "This may take some time."
gs -q -dNOPAUSE -dBATCH -dSAFER \
	-sDEVICE=pdfwrite \
	-dCompatibilityLevel=1.3 \
	-dPDFSETTINGS=/screen \
	-dEmbedAllFonts=true \
	-dSubsetFonts=true \
	-dColorImageDownsampleType=/Bicubic \
	-dColorImageResolution=$res \
	-dGrayImageDownsampleType=/Bicubic \
	-dGrayImageResolution=$res \
	-dMonoImageDownsampleType=/Bicubic \
	-dMonoImageResolution=$res \
	-sOutputFile="$outfile" \
	 "$infile"
echo "Finished."
echo "Output data saved to $outfile"

Dieses Bashscript kann man jetzt z.B. in einer Datei “shrinkpdf.sh” speichern und ausfühbar machen. Mittels

shrinkpdf.sh in=/pfad/zur/großen/pdfdatei.pdf out=/pfad/zur/auszugebenden/datei.pdf

kann man nun die PDFs verkleinern. Mit dem “res” parameter kann man auch noch die neue Auflösung der Bilder im PDF einstellen. Gleichzeitig fügt GhostScript dann noch alle nötigen Fonts in das PDF ein.

Ich hoffe, ich konnte irgend jemandem damit die nervige Suche nach einer Lösung für dieses Problem ersparen.

EDIT: Anmerkung von Dee: Noch einfacher kann man die PDF-Größe mit PDFSizeOpt ändern.

Tags: ,

7 Responses

  1. Dee

    Du hättest Dir auch einfach die aktuelle TeXnische Komödie anschauen können, da steht ein sehr schöner Artikel zu einem bessere Werkzeug drin: http://code.google.com/p/pdfsizeopt/ Das nutzt neben GhostScript noch viele andere Ansätze und kann so die Dateigröße ggf. halbieren ohne die Qualität zu verändern.

    • Ximion

      Oh… Es kann so einfach sein :-D
      Vielen Dank für den Tipp, ich habe das mal oben im Artikel eingebaut.

  2. gibt es auch ein open source tool, welches die bitmaps in PDFs in jp2k convertiert?

  3. mario

    Hättest du nicht einfach die Datei drucken können und in Datei speichern wählen? Da geht ja PostScript und PDF…

    • sgo

      Also, “in Datei drucken” verschafft mir nicht wirklich kleinere PDF-Dateien. Hier vermisse ich schon lange eine Funktion, mit der ich die Qualität der pdf’s/enthaltenen Bilder einstellen kann (ich denke bei Openoffice geht das im PDF-Export). Sogar selbst erstelle PDF’s sind mir oftmals viel zu groß. Bei Bildern sind erstellte PDF’s oft das vielfache größer als das originale Bild.

  4. tux4fun

    Hey,

    habe letztens auch mich auf die Suche nach so einer Möglichkeit gemacht. Habe aber schnell aufgegeben, da ich nix anständiges gefunden habe.

    Somit fettes Lob an dein Skript und deine Mühe.

    Danke!

  5. Vielen Dank fuer das tolle Skript. Geht sehr flott. Habe lange nach so was gesucht.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>