#!/bin/bash

#------------------------------------------------------------------------------
# Author: Dr. Heinz Breinlinger
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
checkReturn() {
  if [ ! $? -eq 0 ] ; then
    die $@
  fi
}
#------------------------------------------------------------------------------
die() {
  echo "Fatal Error: $@"
  exit
}
#------------------------------------------------------------------------------

color="no"
name=""
page="largePortrait"
resolution="300"
quality=40

#------------------------------------------------------------------------------
#
# Scanprogramm fuer Flachbettscanner (hier: Canon Lide 210)
#   scanned Buecher verschiedener Formate und Ausrichtungen so, dass Scans
#   mit einem einzigen manuellen Abschluss-Befehl
#     convert *.jpg <Ausgabedatei>.pdf
#   korrekt beschnitten und ausgerichtet zu PDF zusammengefuegt werden 
#   koennen, sofern Einzelscans von 01.jpg bis nm.jpg richtig benannt worden waren.
# 
# Logisch "oben" ist die Bedienleiste des Scanners, das Deckelgelenk ist "unten".
#
# 3 Modi fuer Buecher
# - Buchseite etwa DIN A4
#   - hochkant/portrait (Default)
#   - quer/landscape
#     - Buchauflage fuer rechte oder linke Seite
#         -------
#         | |  ||  <= Scanner mit Knopfleiste unten
#         | | x||
#         | |--||  <= Buchauflage mit rechter oder linker Seite auf Scanner
#         --|  |-
#           |  |
#     - Beispielbefehlsfolge fuer 3 Seiten, beginnend mit linker Seite
#         myscancanon -L -n 01
#         myscancanon -R -n 02
#         myscancanon -L -n 03
#         convert *.jpg Ausgabe.pdf
# - Buchseite etwa 12 x 18,5 cm2 (stets portrait/hochkant)
#   - Buch an Knopfleiste des Scanners unten buendig und vollflaechig
#       anlegen wie folgt:
#         Kopf der Seite zeigt zur Knopfleiste
#         Buch liegt vollflaechig und entweder links oder rechts buendig auf
#   - Beispielbefehlsfolge fuer 2 Seiten, beginnend mit linker Seite
#       myscancanon -l -n 01
#         Kleine Linke Seite namens "01" nur scannen (kein PDF) => 01.jpg
#         Buchauflage links buendig, Seitenkopf an Knopfleiste unten
#           -------
#           |     |   <= Scanner mit Knopfleiste unten
#           |     |
#           | x |   |  <= Buchauflage mit Kopf nach unten
#           -------
#       myscancanon -r -n 02
#         Kleine rechte Seite namens "02" nur scannen (kein PDF) => 02.jpg
#         Buchauflage rechts buendig, Seitenkopf an Knopfleiste unten
#           -------  
#           |     |   <= Scanner mit Knopfleiste unten
#           |     |
#         |   | x |   <= Buchauflage mit Kopf nach unten
#           -------
#       convert *.jpg Ausgabe.pdf
#         Zusammenfuegen beider Seiten zu PDF
#------------------------------------------------------------------------------

while getopts a:chLln:q:Rr opt; do
  case $opt in
    a) resolution=$OPTARG ;;
    L) page="largeLeftLandscape" ;;
    l) page=smallLeftPortrait ;;
    c) color="yes" ;;
    n) name="$OPTARG" ;;
    q) quality=$OPTARG ;;
    R) page="largeRightLandscape" ;;
    r) page=smallRightPortrait ;;
    h) cat << ENDE
       Usage: $0 [-a <aufloesung>[-h] [-c] [-L] [-l] -n outfile [-q 1-100 ] [-R] [-r]

         Default ist: grosse Buchseite hochkant, 40% Kompression, Graustufen

         -a: Aufloesung (Default 300)
               75|100|150|300|600|1200|2400|4800
         -h: diese Anzeige
         -c: Farbscan (Default: Graustufen)
         -L: linke grosse Buchseite (quer)
         -l: linke kleine Buchseite
         -n: Name der Jpg-Ausgabedatei (ohne Endung '.jpg' !)
         -q: Jpg-Qualitaetsstufe und damit Dateigroesse des Einzelscans
               1-100 (Default: 40)
         -R: rechte grosse Buchseite (quer)
         -r: rechte kleine Buchseite
ENDE
       exit ;;
  esac
done

[ -z "$name" ] && die "Ausgabedatei wurde nicht angegeben"
nameJpg="${name}".jpg

cat << END

  color $color
  name $name
  page $page
  resolution $resolution
  quality $quality

END

#------------------------------------------------------------------------------
# Canon LIDE 210
# Canoscan N650U (da andere Default-Werte)
#   scanimage --resolution 150 --mode Gray -l 0 -y 0 -x 215 -y 290 > Dummy
#------------------------------------------------------------------------------
if [ "${color}" == "yes" ]; then
  scanimage --resolution $resolution --mode Color > Dummy
else
  scanimage --resolution $resolution > Dummy
fi
checkReturn "Scan-Fehler"

#------------------------------------------------------------------------------
# Bei Kleinformat muessen Versatz und Ausschnittgroesse nach der gewaehlten
# Aufloesung angepasst werden
#------------------------------------------------------------------------------
case $page in
  small*) case $resolution in
            300) xoffset=1200; yoffset=1300; width=1400; height=2250 ;;
            150) xoffset=600; yoffset=650; width=700; height=1125 ;;
              *) die "Ungueltiger Aufloesungswert fuer Kleinformat: $resolution" ;;
          esac ;;
esac

#------------------------------------------------------------------------------
# Nachverarbeitung
#------------------------------------------------------------------------------
case $page in
       largePortrait) convert Dummy -compress jpeg -quality $quality "${nameJpg}" ;;
 largeRightLandscape) convert Dummy -rotate "-90" -compress jpeg -quality $quality "${nameJpg}" ;;
  largeLeftLandscape) convert Dummy -rotate 90 -compress jpeg -quality $quality "${nameJpg}" ;;
   smallLeftPortrait) convert Dummy -gravity southwest -crop ${width}x${height}+0+${yoffset} +repage -compress jpeg -quality $quality "${nameJpg}" ;;
  smallRightPortrait) convert Dummy -gravity southwest -crop ${width}x${height}+${xoffset}+${yoffset} +repage -compress jpeg -quality $quality "${nameJpg}" ;;
                   *) die "Ungueltiger Wert: $page" ;;
esac
checkReturn "Wandlungsfehler"

rm Dummy

display "${nameJpg}"
