Mittwoch, 29. Oktober 2014

Alle Seiten von PDF-Dateien unter Windows in Grafikdateien umwandeln

Kürzlich nahm ich mir vor, besonders visuell ansprechende Folien von Abschlusspräsentationen im Powerpoint-Format in einer Galerie zu sammeln, damit sich künftige Autoren an guten Beispielen inspirieren lassen können.

Als erstes sammelte ich alle Präsentationen, die mir auf unserem Netzlaufwerk bei der Durchsicht begegneten. Anschliessend öffnete ich jede Präsentation von Hand in Powerpoint und speicherte diese als PDF-Datei in einem zentralen Verzeichnis ab.

Da die Foliensätze nun in einem elektronischen Standardformat vorlagen, machte ich mich hinter ein Bash-Script, mit welchem ich alle Seiten der PDF-Dateien mittels ImageMagicks convert in einzelne Grafiken umwandeln konnte. Das Resultat:

# /bin/sh

DESTEXT="jpg"
DESTEXT="png"

echo "Starting up ..."
echo ""

echo "Working in directory $PWD ..."
echo ""

CONVERT=$(which convert)

if [ ! -f "$CONVERT" ]
then
echo "ERROR: convert binary 'convert' not found ($CONVERT). Aborting"
exit 1
fi

echo "Using convert binary at $CONVERT"
echo ""

# Ghostscript not in path in WIN32, won't succeed
# This is how imagemagick does it: http://trac.imagemagick.org/browser/ImageMagick/branches/ImageMagick-6/magick/nt-base.c?rev=13427
# https://www.google.ch/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=site%3Atrac.imagemagick.org%20gswin32c.exe
#GS32=$(which gswin32c.exe)
#GS64=$(which gswin64c.exe)
#if [ ! -f "$GS32" ] && [ ! -f "$GS64" ]
#then
#	echo "ERROR: Ghostscript binary 'gswin[32|64]c.exe' not found (32-bit: $GS32, 64-bit: $GS64). Aborting"
#	exit 1
#fi

#echo "All binaries exist, continuing conversion process."
#echo ""

echo "Using convert binary at $CONVERT"
echo ""

# http://unix.stackexchange.com/questions/9496/looping-through-files-with-spaces-in-the-names
find . -type f -iname "*.pdf" -print0 | while IFS= read -r -d '' PDF; do
echo "Converting $PDF ..."
SOURCE="$PDF"
DEST="$PDF.$DESTEXT"

CMD="\"$CONVERT\" -density 72 \"$SOURCE\" \"$DEST\""
echo "Command: $CMD"
eval $CMD
echo "Done"
echo ""
done

exit 0

Siehe auch:

Probleme

Fehlendes bash

Ich verwende die Git for Windows, um auch unter Windows auf eine bash zugreifen zu können. Git for Windows bringt unter anderem eine bash-Shell mit sich. Im Windows-Explorer öffnet man bash im aktuellen Verzeichnis, indem man nach einem Rechtsklick auf eine leere Fläche im Zielordner im Kontextmenu auf Git Bash klickt.

Fehlendes ImageMagick

ImageMagick steht auch als kompilierte Windows-Binaries zur Verfügung. Bei mir hat das Script mit folgendem Paket funktioniert:

C:\Users\USER>convert --version
Version: ImageMagick 6.8.9-6 Q16 x64 2014-07-22 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules OpenMP
Delegates: bzlib cairo freetype jbig jng jp2 jpeg lcms lqr pangocairo png ps rsv
g tiff webp xml zlib

Fehlendes Ghostscript

Wenn ImageMagick folgenden Fehler meldet …

convert.exe: FailedToExecuteCommand `"gswin32c.exe" -q -dQUIET -dSAFER -dBATCH -
dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEV
ICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r72x72" "-sOutputFile=C
:/Users/USER/AppData/Local/Temp/magick-4444uMzVadN1QsOl%d" "-fC:/Users/USER/AppData/Local/Temp/magick-4444-MgLEhwrf1qK" "-fC:/Users/USER/AppData/Loc
al/Temp/magick-4444WnOaJKpe5I_Y"' (-1) @ error/utility.c/SystemCommand/2051.

… bedeutet dies, dass auf dem lokalen Windows-System die Installation von Ghostscript (gswin32c.exe) fehlt.

Ghostscript steht natürlich auch in Form von Windows-Binaries zur Verfügung und lässt sich mit einigen wenigen Mausklicks installieren.

Beim Debugging des oben genannten Problems drang ich tief in den Source Code ein, um die Stelle zu finden, wo ImageMagick herausfindet, wo die Ghostscript-Executables liegen:

Man schaue sich die Funktion NTLocateGhostscript() in nt-base.c genauer an: Die Pfade sind nicht hardkodiert, sondern werden aus der Windows-Registry ausgelesen. Dies bedingt, dass Ghostscript ordnungsgemäss installiert wurde.

Liked this post? Follow this blog to get more. 

Labels: Programmierung

Kommentar erfassen