Skip to content

Instantly share code, notes, and snippets.

@tyjak
Last active August 29, 2015 14:15
Show Gist options
  • Save tyjak/ea8d9f9ba0f7095259b6 to your computer and use it in GitHub Desktop.
Save tyjak/ea8d9f9ba0f7095259b6 to your computer and use it in GitHub Desktop.
#/bin/bash
#
#écrit par Ouessant http://forum.ubuntu-fr.org/viewtopic.php?id=1542381
################ AIDE
aide ()
{
echo -e "
USAGE : pdflivre [OPTIONS]\n
Manipulation de pdf utilisant pdfjam (TeX).
Imposition en livret ou en cahier, déplacement des pages, gouttière.\n
Seule la première option est obligatoire.
-i FICHIER FICHIER est un document pdf (format portrait).
-o FICHIER FICHIER est le document de sortie.
[Défaut : ~/pdflivre.pdf].
-f NPFEUILLE NPFEUILLE est le nombre de pages par feuilles.
* 4 : 2 pages par face (utilise pdfbook).
* 8
* 16 [Defaut: 4]
-c NPCAHIER NPCAHIER est le nombre de pages par cahier.
* libre pour 4 pages par feuilles,
1 pour un seul livret [Defaut].
* de 8 ou de 16 pour 8 pages par feuilles.
* non disponible pour 16.
-d DELTAH DELTAH est un nombre. Il permet de décaler toutes
les pages vers le haut d'autant de pt.
-v DELTAV Décalage les pages vers l'extérieur d'autant de pt.
-g GOUTTIÈRE Toujours un nombre en point. C'est le décalage
vers l'extérieur des pages extérieures
des cahiers. Les autres pages sont décalées
proportionnelement.
-h Cette aide.
"
exit 0
}
####################
mkdir -p /tmp/pdflivre
##########################################################
# Les variables
##########################################################
while getopts "i:o:c:f:d:v:g:h" option ; do
case $option in
i) IN="$OPTARG";;
o) OUT="$OPTARG";;
c) NPCAHIER="$OPTARG";;
f) NPFEUILLE="$OPTARG";;
d) DELTAG="$OPTARG";; # Décalage horizontal vers l'extérieur (pour toutes les pages)
v) DELTAV="$OPTARG";;
g) OFFSETG="$OPTARG";; # Offset (décalage vers l'extérieur des pages extérieures
#+ des cahiers, les intérieures sont décalées selon
# une fonction linéaire)
h) aide ;;
?) echo "Option -$OPTARG inconnue" ; aide ;;
esac
done
if [ -z $IN ]; then
aide
fi
if [ -z $OUT ]; then
OUT=`echo ~/pdflivre.pdf`
fi
if [ -z $NPCAHIER ]; then # Nombre de page par cahier : pour 4 page par feuille
NPCAHIER=1 #+ c'est "--signature" de pdfbook.
fi
if [ -z $NPFEUILLE ]; then # Le nombre de page par feuille : peut-être 4 (pdfbook), 8 ou 16
NPFEUILLE=4
fi
if [ -z $DELTAG ]; then # Décalage horizontal vers l'extérieur (pour toutes les pages)
DELTAG=0
fi
if [ -z $DELTAV ]; then # Décalage vertical (pour toutes les pages)
DELTAV=0
fi
if [ -z $OFFSETG ]; then # Offset (décalage vers l'extérieur des pages extérieures
OFFSETG=0 #+ des cahiers, les intérieures sont décalées selon
fi # une fonction linéaire)
NPAGE=`pdfinfo "$IN" |grep "Pages:"|cut -c 17-` # Nombre de page du pdf.
let " NPTOTAL = ((( "$NPAGE" -1)/ "$NPCAHIER")+1)*"$NPCAHIER" " # Nombre final de page du pdf : premier multiple du nombre de cahier.
##########################################################
# Les fonctions
##########################################################
####### Pour faire joli et donner des nouvelles
message ()
{
echo -e "\n********************************************\n$1 \n********************************************\n"
}
####### Fonction de dispersion des pages en autant de documents
dispersion ()
{
p=0
pt='pt' # Variable bidon pour éviter d'écrire "$VAR pt"
#+ qui donne 10 pt et donc une erreur.
#+ Il faut "$VAR$pt" et 10pt (en l. 67).
# Calcul de l'offset :
# Pour les pages le plus à l'extérieur il faut tout l'offset. Exemple dans le cas de 8
# pages par cahier : les pages 1 et 8, puis 9 et 16...
# Tandis que l'offset doit être à 0 pour les pages intérieures. Ex : 4 et 5.
# Dans notre exemple on va donc tacher de donner 3/3 d'offset aux pages 1 et 8,
# 2/3 aux 2 et 7, 1/3 aux 3 et 6, 0/3 aux 4 et 5.
# y est ce 3 , x prend les valeurs de 3 à 0 puis 0 à 3 grâce à z qui le fait s'incrémenter ou se décrémenter...
let " y = ($NPCAHIER /2)-1 "
x="$y"
z=-1
####### La boucle de dispersion
while [ $p != "$NPAGE" ]
do
let " p = $p +1 "
# Calcul de l'offset (Histoire x,y et z...
let " x = x + z "
case $x in
0|"$y") let " z = - $z " ;;
esac
let " DELTAH = $DELTAG + (($x* $OFFSETG)/$y) " # Le delta horizontal vaut le delta
#+ general plus l'offset
# Le décalage horizontal doit être négatif pour les pages impaires
#+ afin d'être toujours vers l'exterieur.
let " n = 2* ($p /2) "
if [ $p -eq "$n" ]; then
DELTA="-$DELTAH$pt $DELTAV$pt"
else
DELTA="$DELTAH$pt $DELTAV$pt"
fi
#Tout est prêt.
NOMPAGE="/tmp/pdflivre/$p.pdf"
message "Export de la page $p sur $NPAGE\n décalée de $DELTAH$pt $DELTAV$pt" # Message
pdfjam $IN $p --offset "$DELTA" --outfile $NOMPAGE
done
}
if [ $NPFEUILLE = 4 ]; then
##########################################################
# 4 pages par FEUILLES -> pdfbook
##########################################################
message 'Export du document final.' # Eh oui! pdfjam fait ça très bien tout seul.
if [ $NPCAHIER -eq 1 ]; then
pdfbook $IN --landscape -o $OUT
else
pdfbook $IN --signature $NPCAHIER --landscape -o $OUT
fi
elif [ $NPFEUILLE = 8 ]; then
##########################################################
# 8 pages par FEUILLES
##########################################################
# 2 cas : 8 ou 16 pages par cahier
if [ $NPCAHIER = 8 ]; then
#---------------------------------------------------------
# 8 pages par CAHIER
#---------------------------------------------------------
####### DISPERSION des pages
message 'DISPERSION'
dispersion
#################### Création de la liste de pages à TOURNER
liste=''
p=1
while [ $p -le "$NPAGE" ]
do
let " a = $p +1 " ; let " b = $p +6 " ; let " c = $p +7 "
liste="$liste $p $a $b $c"
let " p = $p +8"
done
#################### On TOURNE ces pages
for p in $liste
do
NOMPAGE="/tmp/pdflivre/$p.pdf"
let " POURCENT = (100 * $p) / $NPTOTAL " # Un petit message
message "Rotation des pages : $POURCENT %"
pdf180 $NOMPAGE --outfile $NOMPAGE
done
#################### On les rassemble en complétant par des pages blanches
liste=''
p=0
while [ $p != "$NPAGE" ]
do
let " p = $p +1 "
liste="$liste /tmp/pdflivre/$p.pdf 1"
done
while [ $p != "$NPTOTAL" ]
do
let " p = $p +1 "
liste="$liste,{}"
done
output=/tmp/pdflivre/temp.pdf
pdfjam $liste -o $output
#################### Reste à donner le bon ordre
liste=''
p=1
while [ $p -le "$NPTOTAL" ]
do
let " a = $p "
let " b = $p +7 "
let " c = $p +3 "
let " d = $p +4 "
let " e = $p +6 "
let " f = $p +1 "
let " g = $p +5 "
let " h = $p +2 "
liste="$liste$a,$b,$c,$d,$e,$f,$g,$h"
let " p = $p +8"
if [ $p -lt "$NPTOTAL" ]; then
liste="$liste,"
fi
done
#################### Exportation
message 'Export du document final.'
pdfjam --nup 2x2 $output $liste --outfile $OUT
elif [ $NPCAHIER = 16 ]; then
#--------------------------------------------------------------------
# 16 pages par CAHIER
#--------------------------------------------------------------------
#(Mais toujours en 8 pages par feuilles. Exemple : impression de 16 a5 sur 2 a3, on plie chaque feuille en 4 et on les emboîte ensemble)
####### DISPERSION des pages
message 'DISPERSION'
dispersion
######### On TOURNE les pages qu'il faut
######### Création de la liste des pages à tourner
liste=''
p=1
while [ $p -le "$NPAGE" ]
do
let " a = $p " ; let " b = $p +1 " ; let " c = $p +4 " ; let " d = $p +5 " ; let " e = $p +10 " ; let " f = $p +11 " ; let " g = $p +14 " ; let " h = $p +15 "
liste="$liste $a $b $c $d $e $f $g $h"
let " p = $p +8"
done
######### On tourne ces pages
for p in $liste
do
NOMPAGE="/tmp/pdflivre/$p.pdf"
let " POURCENT = (100 * $p) / $NPTOTAL " # Un petit message
message "Rotation des pages : $POURCENT %"
pdf180 $NOMPAGE --outfile $NOMPAGE
done
######### On RASSEMBLE les pages (la liste est la liste des pages dans l'ordre).
liste=''
p=0
while [ $p != "$NPAGE" ]
do
let " p = $p +1 "
liste="$liste /tmp/pdflivre/$p.pdf 1"
done
while [ $p != "$NPTOTAL" ]
do
let " p = $p +1 "
liste="$liste,{}"
done
output=/tmp/pdflivre/temp.pdf
pdfjam $liste -o $output
######### IMPOSITION des pages (On fabrique la liste des pages dans le bon ordre)
liste=''
p=1
while [ $p -le "$NPTOTAL" ]
do
let " a = $p "
let " b = $p +15 "
let " c = $p +3 "
let " d = $p +12 "
let " e = $p +14 "
let " f = $p +1 "
let " g = $p +13 "
let " h = $p +2 "
let " i = $p +4 "
let " j = $p +11 "
let " k = $p +7 "
let " l = $p +8 "
let " m = $p +10 "
let " n = $p +5 "
let " o = $p +9 "
let " q = $p +6 "
liste="$liste$a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n,$o,$q"
let " p = $p +16 "
if [ $p -lt "$NPTOTAL" ]; then
liste="$liste,"
fi
done
######### Exportation
message 'Export du document final.'
pdfjam --nup 2x2 $output $liste --outfile $OUT
######### FIN de 8 pages par feuilles
else
echo "Dans le cas de 8 pages par feuilles, le nombre de pages par cahier ne peut être que de 8 ou de 16"
fi
elif [ $NPFEUILLE = 16 ]; then
####################################################################
#
# 16 pages par FEUILLE
#
####################################################################
NPCAHIER=16
let " NPTOTAL = ((( "$NPAGE" -1)/ "$NPCAHIER")+1)*"$NPCAHIER" "
####### DISPERSION des pages
message 'DISPERSION'
dispersion
######### Création de la liste de pages à tourner
liste=''
p=1
while [ $p -le "$NPAGE" ]
do
let " a = $p +4 " ; let " b = $p +5 " ; let " c = $p +6 " ; let " d = $p +7 " ; let " e = $p +8 " ; let " f = $p +9 " ; let " g = $p +10 " ; let " h = $p +10 "
liste="$liste $a $b $c $d $e $f $g $h"
let " p = $p +8 "
done
######### On tourne ces pages
for p in $liste
do
NOMPAGE="/tmp/pdflivre/$p.pdf"
echo "$NOMPAGE"
pdf180 $NOMPAGE --outfile $NOMPAGE
done
######### On les rassemble en complétant par des pages blanches
liste=''
p=0
while [ $p != "$NPAGE" ]
do
let " p = $p +1 "
liste="$liste /tmp/pdflivre/$p.pdf 1"
done
while [ $p != "$NPTOTAL" ]
do
let " p = $p +1 "
liste="$liste,{}"
done
output=/tmp/pdflivre/temp.pdf
pdfjam $liste -o $output
######### Reste à donner le bon ordre
liste=''
p=1
while [ $p -le "$NPTOTAL" ]
do
let " a = $p +4 "
let " b = $p +11 "
let " c = $p +8 "
let " d = $p +7 "
let " e = $p +3 "
let " f = $p +12 "
let " g = $p +15 "
let " h = $p "
let " i = $p +6 "
let " j = $p +9 "
let " k = $p +10 "
let " l = $p +5 "
let " m = $p +1 "
let " n = $p +14 "
let " o = $p +13 "
let " q = $p +2 "
liste="$liste$a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n,$o,$q"
let " p = $p +16"
if [ $p -lt "$NPTOTAL" ]; then
liste="$liste,"
fi
done
######### Exportation
message 'Export du document final'
pdfjam --landscape --nup 4x2 $output $liste --outfile $OUT
#fin de la condition générale
else # Si c'est pas rentré dans les cases c'est que c'est pas bon....
aide
fi
message "Le fichier de sortie est $OUT :\nIl compte $NPFEUILLE pages par feuille et $NPCAHIER par cahier.\nDécalage général des pages :\n $DELTAG vers l'exterieur \n $DELTAV pt vers le haut \nGouttière : de $OFFSETG vers l'exterieur pour les pages extérieures des cahiers."
rm -r /tmp/pdflivre
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment