#! /bin/bash
# Script de mide en page de plusieurs fichiers pdf.
# rédigé par F. Lévy réutilisant des idées de JC Dubacq et E. Viennet
# Appeler avec l'option -h pour avoir un mode d'emploi.

help(){
  echo
  echo "Usage: `basename $0` options  selection destination"
  echo
  echo "selection est une liste de fichiers pdf suivis éventuellement"
  echo "d'une sélection de pages (qui s'applique à ce seul fichier), ex:"
  echo "A.pdf B.pdf 3-5,9,12-14 C.pdf D.pdf 32-42 47"
  echo "La selection par defaut ne contient que la première page."
  echo "Utilisez - ou 1-last pour tout sélectionner."
  echo "n-m avec n>m imprime les pages en ordre inverse."
  echo
  echo "Options:"
  echo "On ne peut utiliser qu'une seule des options n, b ou s."
  echo "-s n : signature n, avec n multiple de 4. Réarange en cahiers de n pages."
  echo "       l'orientation (landscape/portrait) doit être inverse de celle des"
  echo "       fichiers. Imprimer en recto-verso avec reliure sur le coté long."
  echo "-b : booklet. Equivaut à une signature supérieure au nombre de pages a imprimer"
  echo "-n cxl : cxl pages logiques par page, c = nbre de colonnes, l = nbre de lignes"
  echo "-c : avec -n, remplit dans l'ordre colonnes d'abord"
  echo "-f : met un cadre (frame) autour des pages logiques" 
  echo "-l : landscape"
  echo "-r : (rotateoversized) tourne les pages en orientation inverse au lieu"
  echo "     de réduire leur taille"
  echo
  echo "destination:"
  echo "Le nom du fichier produit, ex: poly.pdf"
  echo
}

OPTIONS="["
ARGS="{"
CURDIR=$(pwd)

# utilitaires

addoptions(){
if [ "$OPTIONS" = "[" ]
    then
    OPTIONS="$OPTIONS $1"
    else
    OPTIONS="$OPTIONS, $1"
fi
}

addargs(){
if [ "$ARGS" = "{" ]
    then
    ARGS="$ARGS $1"
    else
    ARGS="$ARGS, $1"
fi
}

# recuperation des options

while getopts ":bcfhln:rs:" opt
do
    case $opt in
	b ) addoptions "booklet" ;;
	c ) addoptions "column";;
	f ) addoptions "frame" ;;
	h ) help ; exit ;;
	l ) addoptions "landscape" ;;
	n ) addoptions "nup=$OPTARG, delta=1em 1em" ;;
	r ) addoptions "rotateoversize" ;;
	s ) addoptions "signature=$OPTARG" ;;
	* ) echo "$opt n(est pas une option prevue.";;   # Default.
  esac
done

if [ "$OPTIONS" = "[" ]
    then
    OPTIONS=""
    else
    OPTIONS="$OPTIONS ]"
fi

# recuperation de la liste de fichiers à inclure, avec des selecteurs de page facultatifs

shift $(($OPTIND - 1))

if [ $# -lt "2" ]    # pas de liste de fichiers
then
help 
exit 1
fi  

while [ $# -ne "1" ]
do
    if [ -e $1 -a ${1:0:1} != "/" ] ; then
	addargs "${CURDIR}/$1"
    else
	addargs "$1"
    fi
    shift 1
done
ARGS="$ARGS }"

# le dernier est la destination

DSTFILE="$1"

# Cree le fichier latex

tmpdir=$(mktemp -d  -t pdfcombine.XXXXXXX)

cat > $tmpdir/tmp.tex <<EOF
\documentclass{article}
\usepackage[a4paper]{geometry}
\usepackage{pdfpages}
\begin{document}
\includepdfmerge$OPTIONS$ARGS
EOF
echo "\end{document}" >> $tmpdir/tmp.tex


# run pdflatex
(cd $tmpdir; pdflatex tmp)


mv $tmpdir/tmp.pdf ${DSTFILE}
/bin/rm -rf $tmpdir
