Last active
August 29, 2015 14:15
-
-
Save tyjak/ea8d9f9ba0f7095259b6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#/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