#!/bin/bash
#
# Wandelt Bilder und PDF-Dateien in Graustufen- bzw. CMYK-Farbraum fuer.
# Offsetdruck um. Optionen zur Datenkompression.
# 2011/01/02 by tf@wurzel.org
#
# Benoetigt:
# * NetPBM Tools (netpbm)
# * tiff2pdf (TIFF-Bibliotheken: libtiff3,tiff)
# * jpegicc, tifficc (Little CMS: lcms)
# * ICC-Profil (AdobeICCProfiles)
# * ghostscript
#
echo -e "\nKonverter zur Druckaufbereitung von Bildern (Bitmaps, PDF)"
USAGE="$USAGE\nSyntax: ${0/*\//} [-z|-q n|-p] [-c] image(s)\n"
USAGE="$USAGE\n image(s) \t zu konverierende Bilder (600dpi in Druckgroesse)"
USAGE="$USAGE\n\040\040 Kompression: [Standard: jpeg mit Qualitaet 85%]"
USAGE="$USAGE\n\t -q n\t JPEG erzeugen (Qualitaet n=1..100)\t => <image>-<color>.jpg"
USAGE="$USAGE\n\t -z  \t verlustfrei \t \t \t \t              => <image>-<color>.pdf"
USAGE="$USAGE\n\t -p  \t PDF per Ghostscript konvertieren  \t => <image>-<color>.pdf"
USAGE="$USAGE\n\040\040 Farbraum: [Standard: Umwandeln in Graustufen (<color>=gray)]"
USAGE="$USAGE\n\t -c  \t CMYK-Farbbild (<color>=cmyk) erzeugen"
USAGE="$USAGE\n\t \t Hinweise: Reine Graustufenbilder bleiben grau."
USAGE="$USAGE\n\t \t \t -p und -c vertragen sich nicht (Rotstich)."
USAGE="$USAGE\n Das Leerzeichen nach -q ist relevant!\n"
#
# Wenn keine Parameter angegeben, Syntaxhinweis ausgeben
if [ "$1" = "" ]; then
  echo -e $USAGE; exit
fi;
# Farbprofil fuer CMYK-Datei (fuer die Quelle wird immer das sRGB-Profil genommen) 
ICC="/usr/share/color/icc/Adobe ICC Profiles/CMYK Profiles/EuroscaleUncoated.icc"
# Parametervorgaben
GRAY=true
LOSSLESS=false
QUALITY=85
# Parameterliste durchgehen
while [ "${1:0:1}" = "-" ]; do
  case $1 in
    -q)
      if [[ $2 = *[[:digit:]]* ]]; then
        QUALITY=$2; shift
      else                             # "$2 is not numeric"
        echo -e "\nFEHLER: keine JPEG-Qualitaet nach \"-q\" angegeben!"
        echo -e $USAGE; exit
      fi ;;
    -z)
      LOSSLESS=true ;;
    -p)
      LOSSLESS=pdf ;;
    -c)
      GRAY=false ;;
    *)
      echo -e "\nFEHLER: unbekannte Option \"$1\"!"
      echo -e $USAGE; exit
  esac
  shift
done
echo -e "\nGraustufen=$GRAY  verlustfrei=$LOSSLESS  Qualitaet=$QUALITY"
# Ist mindestens eine Bilddatei angegeben?
if [ "$1" = "" ]; then
  echo -e "\nFEHLER: keine Bilddatei angegeben!"
  echo -e $USAGE; exit
fi;

# Konvertierungsfunktionen
function convertimage () {
  INFILE=$1
  INBASE=${INFILE%.*}                  # Dateiname ohne Endung
  # Testen, ob Datei mit anytopnm lesbar ist
  anytopnm "$INFILE" > /dev/null
  if [ $? -ne 0 ]; then
    echo -e "\nFEHLER: Datei \"$INFILE\" nicht mit anytopnm lesbar (kein Bitmap?)!"
    echo -e $USAGE; exit
  fi;
  # Testen, ob es sich um ein Graustufen- bzw. Schwarz-Weiss-Bild handelt
  GRAYSCALE=$GRAY
  anytopnm "$INFILE" 2> /dev/null | pgmtopgm &> /dev/null
  if [ $? = 0 ]; then 
    echo "Konvertiere Graustufenbild \"$INFILE\" ..."; GRAYSCALE=true
  else
    if [ $GRAYSCALE = true ]; then
      echo "Konvertiere Farbbild \"$INFILE\" zu Graustufen ..."
    else
      echo "Konvertiere Farbbild \"$INFILE\" nach CMYK ..."
    fi
  fi
  # Konvertierung des Bildes
  if [ $LOSSLESS = true ]; then        # Verlustfrei: IMAGE=>TIFF=>PDF
    TMPFILE="$INBASE-tmp.tif"
    if [ $GRAYSCALE = true ]; then     # Umwandlung in Graustufenbild
      anytopnm "$INFILE" | ppmtopgm | pnmtotiff -flate > "$TMPFILE"
      OUTFILE="$INBASE-gray.pdf"
    else                               # Umwandlung in CYMK mit ICC-Profil
      TMPFILE1="$INBASE-tmp1.tif"
      anytopnm "$INFILE" | pnmtotiff -flate > "$TMPFILE1"
      tifficc -v -o "$ICC" "$TMPFILE1" "$TMPFILE"
      rm "$TMPFILE1"
      OUTFILE="$INBASE-cmyk.pdf"
    fi;
    tiff2pdf -x600 -y600 -z "$TMPFILE" > "$OUTFILE"
    rm "$TMPFILE"
  else                                 # Verlustbehaftet: IMAGE=>JPEG
    if [ $GRAYSCALE = true ]; then     # Umwandlung in Graustufenbild
      OUTFILE="$INBASE-gray.jpg"
      anytopnm "$INFILE" | ppmtopgm | pnmtojpeg -quality=$QUALITY -optimize -density=600x600dpi > "$OUTFILE"
    else                               # Umwandlung in CYMK mit ICC-Profil
      TMPFILE="$INBASE-tmp.jpg"
      anytopnm "$INFILE" | pnmtojpeg -quality=$QUALITY -optimize -density=600x600dpi > "$TMPFILE"
      OUTFILE="$INBASE-cmyk.jpg"
      jpegicc -v -o "$ICC" "$TMPFILE" "$OUTFILE"
      rm "$TMPFILE"
    fi;
  fi;
}
function convertpdf () {
  INFILE=$1
  if [ $GRAY = true ]; then            # Umwandlung in Graustufenbild
    OUTFILE="${INFILE%.pdf}-gray.pdf"
    COLORS="-sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray"
  else                               # Umwandlung in CYMK mit ICC-Profil
    OUTFILE="${INFILE%.pdf}-cmyk.pdf"
    COLORS="-sColorConversionStrategy=CMYK -dProcessColorModel=/DeviceCMYK"
    echo -e "\nWARNUNG: PDF-Umwandlung (-p -c) nicht farbecht!"
  fi;
  gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite $COLORS -dCompatibilityLevel=1.3 -sOutputFile=$OUTFILE $INFILE
}

# Alle Bilddateien verarbeiten
while [ "$1" != "" ]; do
  INFILE=$1  
  if [ -f "$1" ]; then
    if [ "$LOSSLESS" = "pdf" ]; then
      convertpdf "$1"
    else
      convertimage "$1"
    fi
  else
    echo -e "\nFEHLER: Datei \"$1\" existiert nicht!"
    echo -e $USAGE; exit
  fi;
  shift
done
