Retour Suite
sylvainmahe.site LE SITE de Sylvain Mahé contact@sylvainmahe.site
Article : Sylvain Mahé contact@sylvainmahe.site Création automatique du contenu d'un livre à partir d'une arborescence de fichiers Cette routine (pour le système d'exploitation Linux que j'utilise) permet de générer automatiquement le contenu d'un livre complet sous la forme d'un seul fichier PDF via une arborescence de fichiers (organisation hiérarchique des fichiers dans des répertoires) dont le contenu UTF-8 est extrait : C'est le contenu UTF-8 (pour "Unicode Transformation Format 8" ou format de transformation Unicode sur 8 bits) de vos fichiers à sauvegarder qui est utilisé afin de générer un fichier unique PDF imprimable (book content.pdf), contenu prenant ainsi la forme de caractères normalisés qui peut être issu de divers langages, soit par exemple du binaire, de l'hexadécimal, du C++, ou tout autre caractère UTF-8 imprimable. Attention cependant, si des caractères dans vos fichiers ne font pas partie de la norme UTF-8, il ne pourront pas être traités correctement. Ainsi ce que je propose ici est un outil qui, bien utilisé, vous permettra de sauvegarder vos fichiers sur des supports imprimés (livres, documents divers), via la simple génération d'un seul fichier .pdf (pour "Portable Document Format" ou format de document portable), un format de fichier pris en charge par tous les imprimeurs. Ma routine d'automatisation prend donc en entrée une arborescence de fichiers, elle permet de choisir les dimensions des pages du livre, les dimensions des marges générales, la dimension de la marge de reliure qui servira à positionner le texte en retrait par rapport à la reliure du livre (ceci afin de faciliter l'ergonomie de lecture), la taille des caractères du texte qui sera imprimé, la police de caractère utilisée, et les dimensions du fond perdu (soit la marge qui sera rognée par la machine de coupe). Si besoin, il est possible également de trier manuellement l'ordre d'apparition des fichiers dans le livre, ce qui peut être intéressant si le tri alphanumérique par défaut n'est pas souhaité. Une fois ces choix effectués, un fichier nommé book content.pdf est créé. Ce fichier répertorie tout le contenu des fichiers de l'arborescence, avec la pagination, la numérotation des lignes, la numérotation des pages (paires et impaires), et la table des fichiers en toute fin du livre. Ci dessous, la routine (.sh) permettant la création automatique d'un livre .pdf à partir d'une arborescence de fichiers : #!/bin/bash echo "Page width in mm ?" read widthPage echo -e "\nPage height in mm ?" read heightPage echo -e "\nPage margin in mm ?" read marginPage echo -e "\nGutter margin in mm ?" read marginGutter echo -e "\nFont size in mm ?" read fontSize echo -e "\nFont name ?" read fontName echo -e "\nCutter margin in mm ?" read marginCutter nameBash=$(basename "$0") countTable=0 shopt -s globstar for file in **/* do if [ -f "$file" ] && [ "$file" != "$nameBash" ] then fileTable[countTable]=$file ((countTable++)) fi done echo "" next=false while [ $next == false ] do echo "Sort option ?" echo "a = Alphanumeric sort" echo "m = Manual sort" read menuOptionSort if [ $menuOptionSort == "a" ] || [ $menuOptionSort == "m" ] then next=true fi clear done if [ $countTable == 0 ] then echo "No file detected" else rm tmp -r -f rm "book content.pdf" -f mkdir tmp iterationTable=0 if [ $menuOptionSort == "m" ] then next=false while [ $next == false ] do echo "Manual sort :" echo "e = Exit" echo "s = Save file tree (file.tree)" echo "l = Load file tree (file.tree)" echo "d = Delete file tree (file.tree)" echo "" echo "File tree :" for ((iterationTableDisplay=0; iterationTableDisplay < countTable; iterationTableDisplay++)) do if [ $iterationTableDisplay == $iterationTable ] then echo $((iterationTableDisplay+1))" = "${fileTable[iterationTableDisplay]}" <" else echo $((iterationTableDisplay+1))" = "${fileTable[iterationTableDisplay]} fi done read menuManualSort if [ $menuManualSort == "e" ] then next=true elif [ $menuManualSort == "s" ] then rm file.tree -f for ((iterationTableForWriting=0; iterationTableForWriting < countTable; iterationTableForWriting++)) do echo ${fileTable[iterationTableForWriting]} >> file.tree done elif [ $menuManualSort == "l" ] then iterationLine=0 while read line do fileTable[$iterationLine]=$line ((iterationLine++)) done < file.tree elif [ $menuManualSort == "d" ] then rm file.tree -f elif (($menuManualSort >= 1 && $menuManualSort <= $countTable)) then saveTable=${fileTable[$iterationTable]} fileTable[$iterationTable]=${fileTable[$((menuManualSort-1))]} fileTable[$((menuManualSort-1))]=$saveTable fi clear if (($iterationTable == $countTable - 1)) then iterationTable=0 else ((iterationTable++)) fi done fi echo "Progress = 0.0%" bashString="__BASH_" countLineTotal=0 characterMeasure="" for ((iterationCharacter=0; iterationCharacter < 1000; iterationCharacter++)) do characterMeasure=$characterMeasure"_" done ratioFontSize=$(inkscape --without-gui -W <(echo "<svg><text font-family=\""$fontName"\" font-size=\""$fontSize"\">"$characterMeasure"</text></svg>") 2>/dev/null) countCharacterPerLine=$(echo "("$widthPage"-(("$marginPage"*2)+"$marginGutter"))/("$ratioFontSize"/1000)" | bc -l) countCharacterPerLineDisplay=$(echo "scale=0;("$countCharacterPerLine"*10)/10" | bc -l) countLinePerPage=$(echo "("$heightPage"-(("$marginPage"*2)+("$fontSize"/3)))/"$fontSize | bc -l) countLinePerPageDisplay=$(echo "scale=0;("$countLinePerPage"*10)/10" | bc -l) for ((iterationTable=0; iterationTable < countTable; iterationTable++)) do clear progress=$(echo "25/("$countTable"/("$iterationTable"+1))" | bc -l) progressDisplay=$(echo "scale=1;(("$progress"+0.05)*10)/10" | bc -l) if ((${#progressDisplay} == 2)) then echo "Progress = 0"$progressDisplay"%" else echo "Progress = "$progressDisplay"%" fi sizeRaw=$(stat -c "%s" "${fileTable[iterationTable]}") if [ $sizeRaw == 0 ] then size="(0 octet)" elif [ $sizeRaw == 1 ] then size="(1 octet)" elif (($sizeRaw < 1024)) then size="("$sizeRaw" octets)" elif (($sizeRaw < 1048576)) then sizeInteger=$((sizeRaw/1024)) sizeDecimal=$(echo "("$sizeRaw"/1024)-"$((sizeRaw/1024)) | bc -l) sizeDecimalDisplay=$(echo "scale=1;("$sizeDecimal"*10)/10" | bc -l) sizeNumber=$(echo $sizeRaw"/1024" | bc -l) sizeNumberDisplay=$(echo "scale=1;("$sizeNumber"*10)/10" | bc -l) if [ $sizeDecimalDisplay == 0 ] then if (($(echo $sizeNumberDisplay" == "$sizeNumber | bc -l))) then size="("$sizeRaw" octets = "$sizeInteger"Kio)" else size="("$sizeRaw" octets ≈ "$sizeInteger"Kio)" fi else if (($(echo $sizeNumberDisplay" == "$sizeNumber | bc -l))) then size="("$sizeRaw" octets = "$sizeNumberDisplay"Kio)" else size="("$sizeRaw" octets ≈ "$sizeNumberDisplay"Kio)" fi fi elif (($sizeRaw < 1073741824)) then sizeInteger=$((sizeRaw/1048576)) sizeDecimal=$(echo "("$sizeRaw"/1048576)-"$((sizeRaw/1048576)) | bc -l) sizeDecimalDisplay=$(echo "scale=1;("$sizeDecimal"*10)/10" | bc -l) sizeNumber=$(echo $sizeRaw"/1048576" | bc -l) sizeNumberDisplay=$(echo "scale=1;("$sizeNumber"*10)/10" | bc -l) if [ $sizeDecimalDisplay == 0 ] then if (($(echo $sizeNumberDisplay" == "$sizeNumber | bc -l))) then size="("$sizeRaw" octets = "$sizeInteger"Mio)" else size="("$sizeRaw" octets ≈ "$sizeInteger"Mio)" fi else if (($(echo $sizeNumberDisplay" == "$sizeNumber | bc -l))) then size="("$sizeRaw" octets = "$sizeNumberDisplay"Mio)" else size="("$sizeRaw" octets ≈ "$sizeNumberDisplay"Mio)" fi fi fi echo -e "Fichier "${fileTable[iterationTable]}" "$size"\u00a0:\n" | fold -s -w$countCharacterPerLineDisplay >> tmp/tmp3 cp "${fileTable[iterationTable]}" tmp/tmp2 sed -i tmp/tmp2 -e "s/ /"$bashString"SPACE/g" -e "s/\t/"$bashString"TABULATION/g" -e "s/*/"$bashString"STAR/g" -e "s/\\\/"$bashString"ESCAPE/g" countTmpLine=$(wc -l < tmp/tmp2) iterationTmpLine=1 while read line do spacePrefixLine="" for ((iterationSpace=0; iterationSpace < ${#countTmpLine} - ${#iterationTmpLine}; iterationSpace++)) do spacePrefixLine=$spacePrefixLine$bashString"SPACE" done spacePrefixSubline="" for ((iterationSpace=0; iterationSpace < ${#countTmpLine}; iterationSpace++)) do spacePrefixSubline=$spacePrefixSubline$bashString"SPACE" done echo $line | sed -e "s/"$bashString"SPACE/ /g" -e "s/"$bashString"TABULATION/ /g" -e "s/"$bashString"STAR/*/g" -e "s/"$bashString"ESCAPE/\\\/g" | fold -s -w$((countCharacterPerLineDisplay-(${#countTmpLine}+3))) | sed -e "s/ /"$bashString"SPACE/g" -e "s/*/"$bashString"STAR/g" -e "s/\\\/"$bashString"ESCAPE/g" > tmp/tmp1 iterationTmpSubline=1 while read subline do if [ $iterationTmpSubline == 1 ] then echo $spacePrefixLine$iterationTmpLine" : "$subline | sed -e "s/"$bashString"SPACE/ /g" -e "s/"$bashString"STAR/*/g" -e "s/"$bashString"ESCAPE/\\\/g" >> tmp/tmp3 else echo $spacePrefixSubline" : "$subline | sed -e "s/"$bashString"SPACE/ /g" -e "s/"$bashString"STAR/*/g" -e "s/"$bashString"ESCAPE/\\\/g" >> tmp/tmp3 fi ((iterationTmpSubline++)) done < tmp/tmp1 ((iterationTmpLine++)) done < tmp/tmp2 countLine=$(wc -l < tmp/tmp3) iterationLinePerPage=0 fillPage=$((countLinePerPageDisplay-2)) for ((iterationLine=0; iterationLine < countLine - 1; iterationLine++)) do if (($iterationLinePerPage == $countLinePerPageDisplay - 3)) then fillPage=$((fillPage+(countLinePerPageDisplay-2))) iterationLinePerPage=0 else ((iterationLinePerPage++)) fi done for ((iterationLine=0; iterationLine < fillPage - countLine; iterationLine++)) do echo "" >> tmp/tmp3 done titlePageTable[iterationTable]=${fileTable[iterationTable]} if [ $countLineTotal == 0 ] then numberPageTable[iterationTable]=1 else numberPageTable[iterationTable]=$(((countLineTotal/(countLinePerPageDisplay-2))+1)) fi countLineTotal=$(wc -l < tmp/tmp3) done iterationLinePerPage=0 numberPageContent=1 flipFlop=false for ((iterationLine=0; iterationLine < countLineTotal; iterationLine++)) do if (($iterationLinePerPage == $countLinePerPageDisplay - 1)) then sed -i tmp/tmp3 -e "$iterationLine i \\\\" if [ $flipFlop == false ] then lenghtNumberPageContent=${#numberPageContent} fillSpace="" for ((iterationCharacter=0; iterationCharacter < countCharacterPerLineDisplay - lenghtNumberPageContent; iterationCharacter++)) do fillSpace=$fillSpace"\ " done sed -i tmp/tmp3 -e "$((iterationLine+1)) i $fillSpace$numberPageContent" flipFlop=true else sed -i tmp/tmp3 -e $((iterationLine+1))"i"$numberPageContent flipFlop=false fi iterationLinePerPage=0 ((numberPageContent++)) clear progress=$(echo "25+(25/("$countLineTotal"/("$iterationLine"+1)))" | bc -l) progressDisplay=$(echo "scale=1;(("$progress"+0.05)*10)/10" | bc -l) echo "Progress = "$progressDisplay"%" else ((iterationLinePerPage++)) fi countLineTotal=$(wc -l < tmp/tmp3) done if [ $flipFlop == false ] then lenghtNumberPageContent=${#numberPageContent} fillSpace="" for ((iterationCharacter=0; iterationCharacter < countCharacterPerLineDisplay - lenghtNumberPageContent; iterationCharacter++)) do fillSpace=$fillSpace$bashString"SPACE" done echo -e "\n"$fillSpace$numberPageContent | sed -e "s/"$bashString"SPACE/ /g" >> tmp/tmp3 else echo -e "\n"$numberPageContent >> tmp/tmp3 fi echo -e "Table des fichiers\u00a0:\n" | fold -s -w$countCharacterPerLineDisplay >> tmp/tmp3 lenghtMaxPageNumber=${#numberPageTable[$((countTable-1))]} lenghtMaxPageTitle=$(((countCharacterPerLineDisplay-3)-${#numberPageTable[$((countTable-1))]})) for ((iterationTable=0; iterationTable < countTable; iterationTable++)) do echo ${titlePageTable[$iterationTable]} | fold -s -w$lenghtMaxPageTitle > tmp/tmp4 countTmpLine=$(wc -l < tmp/tmp4) iterationTmpLine=1 point="." while read line do if [ $iterationTmpLine != $countTmpLine ] then echo $line >> tmp/tmp3 else lenghtLastLine=$((${#line}+${#numberPageTable[iterationTable]})) for ((iterationCharacter=0; iterationCharacter < countCharacterPerLineDisplay - (lenghtLastLine + 3); iterationCharacter++)) do point=$point"." done echo $line" "$point" "${numberPageTable[iterationTable]} >> tmp/tmp3 fi ((iterationTmpLine++)) done < tmp/tmp4 done countLineTotal=$(wc -l < tmp/tmp3) iterationLinePerPage=0 fillPage=$countLinePerPageDisplay for ((iterationLine=0; iterationLine < countLineTotal - 1; iterationLine++)) do if (($iterationLinePerPage == $countLinePerPageDisplay - 1)) then fillPage=$((fillPage+countLinePerPageDisplay)) iterationLinePerPage=0 else ((iterationLinePerPage++)) fi done for ((iterationLine=0; iterationLine < fillPage - countLineTotal; iterationLine++)) do echo "" >> tmp/tmp3 done cp tmp/tmp3 tmp/tmp5 sed -i tmp/tmp5 -e "s/ /_/g" -e "s/*/_/g" -e "s/\\\/_/g" iterationLine=0 while read line do lenghtLineContent[iterationLine]=${#line} ((iterationLine++)) done < tmp/tmp5 countLineTotal=$(wc -l < tmp/tmp3) iterationLine=0 iterationLineDisplayed=0 cp tmp/tmp3 tmp/tmp6 sed -i tmp/tmp6 -e "s/ /"$bashString"SPACE/g" -e "s/*/"$bashString"STAR/g" -e "s/\\\/"$bashString"ESCAPE/g" clear echo "Progress = 50.0%" while read line do fillSpace="" for ((iterationCharacter=0; iterationCharacter < countCharacterPerLineDisplay - lenghtLineContent[iterationLine]; iterationCharacter++)) do fillSpace=$fillSpace$bashString"SPACE" done echo $line$fillSpace | sed -e "s/"$bashString"SPACE/ /g" -e "s/"$bashString"STAR/*/g" -e "s/"$bashString"ESCAPE/\\\/g" >> tmp/tmp7 ((iterationLine++)) if (($iterationLineDisplayed == $countLinePerPageDisplay - 1)) then clear progress=$(echo "50+(25/("$countLineTotal"/"$iterationLine"))" | bc -l) progressDisplay=$(echo "scale=1;(("$progress"+0.05)*10)/10" | bc -l) echo "Progress = "$progressDisplay"%" iterationLineDisplayed=0 else ((iterationLineDisplayed++)) fi done < tmp/tmp6 iterationLine=0 iterationFileDisplayed=0 firstPage=false flipFlop=false countPageTotal=$(($(wc -l < tmp/tmp3)/countLinePerPageDisplay)) sed -i tmp/tmp7 -e "s/ /"$bashString"SPACE/g" -e "s/*/"$bashString"STAR/g" -e "s/\\\/"$bashString"ESCAPE/g" while read line do if [ $iterationLine == 0 ] then echo "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?><svg width=\""$(echo "("$marginCutter"*2)+"$widthPage | bc -l)"mm\" height=\""$(echo "("$marginCutter"*2)+"$heightPage | bc -l)"mm\">" > tmp/tmp.svg fi if [ $flipFlop == false ] then echo "<text text-anchor=\"end\" xml:space=\"preserve\" x=\""$(echo $marginCutter"+("$widthPage"-"$marginPage")" | bc -l)"mm\" y=\""$(echo $marginCutter"+("$marginPage"+("$fontSize"*("$iterationLine"+1)))" | bc -l)"mm\" font-family=\""$fontName"\" font-size=\""$fontSize"mm\" fill=\"#000000\">"$(echo $line | sed -e "s/&/&amp;/g" -e "s/</\&lt;/g" -e "s/>/\&gt;/g" -e "s/\"/\&quot;/g" -e "s/'/\&apos;/g")"</text>" | sed -e "s/"$bashString"SPACE/ /g" -e "s/"$bashString"STAR/*/g" -e "s/"$bashString"ESCAPE/\\\/g" >> tmp/tmp.svg else echo "<text text-anchor=\"start\" xml:space=\"preserve\" x=\""$(echo $marginCutter"+"$marginPage | bc -l)"mm\" y=\""$(echo $marginCutter"+("$marginPage"+("$fontSize"*("$iterationLine"+1)))" | bc -l)"mm\" font-family=\""$fontName"\" font-size=\""$fontSize"mm\" fill=\"#000000\">"$(echo $line | sed -e "s/&/&amp;/g" -e "s/</\&lt;/g" -e "s/>/\&gt;/g" -e "s/\"/\&quot;/g" -e "s/'/\&apos;/g")"</text>" | sed -e "s/"$bashString"SPACE/ /g" -e "s/"$bashString"STAR/*/g" -e "s/"$bashString"ESCAPE/\\\/g" >> tmp/tmp.svg fi if (($iterationLine == $countLinePerPageDisplay - 1)) then echo "<rect x=\"0mm\" y=\"0mm\" width=\""$(echo "("$marginCutter"*2)+"$widthPage | bc -l)"mm\" height=\""$(echo $marginCutter"+"$marginPage | bc -l)"mm\" fill=\"#ffffff\"/>" >> tmp/tmp.svg echo "<rect x=\"0mm\" y=\""$(echo $marginCutter"+("$heightPage"-"$marginPage")" | bc -l)"mm\" width=\""$(echo "("$marginCutter"*2)+"$widthPage | bc -l)"mm\" height=\""$(echo $marginCutter"+"$marginPage | bc -l)"mm\" fill=\"#ffffff\"/>" >> tmp/tmp.svg echo "<rect x=\"0mm\" y=\""$(echo $marginCutter"+"$marginPage | bc -l)"mm\" width=\""$(echo $marginCutter"+"$marginPage | bc -l)"mm\" height=\""$(echo $heightPage"-("$marginPage"*2)" | bc -l)"mm\" fill=\"#ffffff\"/>" >> tmp/tmp.svg echo "<rect x=\""$(echo $marginCutter"+("$widthPage"-"$marginPage")" | bc -l)"mm\" y=\""$(echo $marginCutter"+"$marginPage | bc -l)"mm\" width=\""$(echo $marginCutter"+"$marginPage | bc -l)"mm\" height=\""$(echo $heightPage"-("$marginPage"*2)" | bc -l)"mm\" fill=\"#ffffff\"/>" >> tmp/tmp.svg echo "</svg>" >> tmp/tmp.svg if [ $firstPage == false ] then rsvg-convert -f pdf -d 72 -p 72 tmp/tmp.svg -o tmp/tmp1.pdf firstPage=true else rsvg-convert -f pdf -d 72 -p 72 tmp/tmp.svg -o tmp/tmp2.pdf pdftk tmp/tmp1.pdf tmp/tmp2.pdf cat output tmp/tmp3.pdf mv tmp/tmp3.pdf tmp/tmp1.pdf fi if [ $flipFlop == false ] then flipFlop=true else flipFlop=false fi iterationLine=0 ((iterationFileDisplayed++)) clear progress=$(echo "75+(25/("$countPageTotal"/"$iterationFileDisplayed"))" | bc -l) progressDisplay=$(echo "scale=1;(("$progress"+0.05)*10)/10" | bc -l) echo "Progress = "$progressDisplay"%" else ((iterationLine++)) fi done < tmp/tmp7 exiftool -q -all= tmp/tmp1.pdf mv tmp/tmp1.pdf "book content.pdf" rm tmp -r -f lenghtTotalCover=$(echo "(("$marginCutter"*2)+("$widthPage"*2))+("$countPageTotal"*0.06)" | bc -l) widthFrontBackCover=$(echo $marginCutter"+"$widthPage | bc -l) heightFrontBackCover=$(echo "("$marginCutter"*2)+"$heightPage | bc -l) widthSideCover=$(echo "("$countPageTotal"*0.06)" | bc -l) lenghtTotalCoverDisplay=$(echo "scale=3;(("$lenghtTotalCover"+0.0005)*10)/10" | bc -l) widthFrontBackCoverDisplay=$(echo "scale=3;(("$widthFrontBackCover"+0.0005)*10)/10" | bc -l) heightFrontBackCoverDisplay=$(echo "scale=3;(("$heightFrontBackCover"+0.0005)*10)/10" | bc -l) widthSideCoverDisplay=$(echo "scale=3;(("$widthSideCover"+0.0005)*10)/10" | bc -l) sizeRaw=0 for ((iterationTable=0; iterationTable < countTable; iterationTable++)) do sizeRaw=$((sizeRaw+$(stat -c "%s" "${fileTable[iterationTable]}"))) done if [ $sizeRaw == 0 ] then size="0 byte" elif [ $sizeRaw == 1 ] then size="1 byte" elif (($sizeRaw < 1024)) then size=$sizeRaw" bytes" elif (($sizeRaw < 1048576)) then sizeInteger=$((sizeRaw/1024)) sizeDecimal=$(echo "("$sizeRaw"/1024)-"$((sizeRaw/1024)) | bc -l) sizeDecimalDisplay=$(echo "scale=1;("$sizeDecimal"*10)/10" | bc -l) sizeNumber=$(echo $sizeRaw"/1024" | bc -l) sizeNumberDisplay=$(echo "scale=1;("$sizeNumber"*10)/10" | bc -l) if [ $sizeDecimalDisplay == 0 ] then if (($(echo $sizeNumberDisplay" == "$sizeNumber | bc -l))) then size=$sizeRaw" bytes ("$sizeInteger"KiB)" else size=$sizeRaw" bytes (≈ "$sizeInteger"KiB)" fi else if (($(echo $sizeNumberDisplay" == "$sizeNumber | bc -l))) then size=$sizeRaw" bytes ("$sizeNumberDisplay"KiB)" else size=$sizeRaw" bytes (≈ "$sizeNumberDisplay"KiB)" fi fi elif (($sizeRaw < 1073741824)) then sizeInteger=$((sizeRaw/1048576)) sizeDecimal=$(echo "("$sizeRaw"/1048576)-"$((sizeRaw/1048576)) | bc -l) sizeDecimalDisplay=$(echo "scale=1;("$sizeDecimal"*10)/10" | bc -l) sizeNumber=$(echo $sizeRaw"/1048576" | bc -l) sizeNumberDisplay=$(echo "scale=1;("$sizeNumber"*10)/10" | bc -l) if [ $sizeDecimalDisplay == 0 ] then if (($(echo $sizeNumberDisplay" == "$sizeNumber | bc -l))) then size=$sizeRaw" bytes ("$sizeInteger"MiB)" else size=$sizeRaw" bytes (≈ "$sizeInteger"MiB)" fi else if (($(echo $sizeNumberDisplay" == "$sizeNumber | bc -l))) then size=$sizeRaw" bytes ("$sizeNumberDisplay"MiB)" else size=$sizeRaw" bytes (≈ "$sizeNumberOne"MiB)" fi fi fi clear echo "Book cover specifications for printing :" if ((${#lenghtTotalCoverDisplay} == 4)) then echo "Total lenght (front + side + back) = 0"$lenghtTotalCoverDisplay"mm" else echo "Total lenght (front + side + back) = "$lenghtTotalCoverDisplay"mm" fi if ((${#widthFrontBackCoverDisplay} == 4)) then echo "Front width = 0"$widthFrontBackCoverDisplay"mm" else echo "Front width = "$widthFrontBackCoverDisplay"mm" fi if ((${#heightFrontBackCoverDisplay} == 4)) then echo "Front height = 0"$heightFrontBackCoverDisplay"mm" else echo "Front height = "$heightFrontBackCoverDisplay"mm" fi if ((${#widthSideCoverDisplay} == 4)) then echo "Side width = 0"$widthSideCoverDisplay"mm" else echo "Side width = "$widthSideCoverDisplay"mm" fi if ((${#heightFrontBackCoverDisplay} == 4)) then echo "Side height = 0"$heightFrontBackCoverDisplay"mm" else echo "Side height = "$heightFrontBackCoverDisplay"mm" fi if ((${#widthFrontBackCoverDisplay} == 4)) then echo "Back width = 0"$widthFrontBackCoverDisplay"mm" else echo "Back width = "$widthFrontBackCoverDisplay"mm" fi if ((${#heightFrontBackCoverDisplay} == 4)) then echo "Back height = 0"$heightFrontBackCoverDisplay"mm" else echo "Back height = "$heightFrontBackCoverDisplay"mm" fi echo -e "\nBook content specifications for printing :" echo "Number of pages = "$countPageTotal if [ $countTable == 1 ] then echo "Total file size = "$size else echo "Total files size = "$size fi fi read exit 0 La routine présentée ci-dessus utilise les programmes (ou paquets) inkscape, librsvg2-bin, pdftk, et exiftool afin d'effectuer tous les traitements nécessaires. Il vous faut donc les installer à l'aide de la ligne de commande suivante (à écrire dans le terminal de Linux) : sudo apt-get install inkscape librsvg2-bin pdftk exiftool -y Une fois cette installation effectuée, lorsque vous exécutez la routine (.sh), se propose à vous dans l'ordre d'apparition les questions suivantes : - Page width in mm ? : largeur des pages (en millimètres).
- Page height in mm ? : hauteur des pages (en millimètres).
- Page margin in mm ? : dimensions des marges générales (en millimètres).
- Gutter margin in mm ? : dimension de la marge de reliure qui servira à positionner le texte en retrait par rapport à la reliure du livre (en millimètres).
- Font size in mm ? : taille des caractères du texte qui sera imprimé (en millimètres).
- Font name ? : police de caractère utilisée (elle doit être à espacement unique, par exemple "ubuntu mono").
- Cutter margin ? : dimensions du fond perdu (en millimètres).
Lorsque vous validez cette dernière question, se propose à vous le choix "Sort option ?". Choisissez "a" (pour "Alphanumeric sort" ou tri alphanumérique) puis validez pour trier automatiquement les fichiers dans l'ordre alphanumérique, ou choisissez "m" (pour "Manual sort" ou tri manuel) pour effectuer vous-même le tri. Si vous avez choisi l'option de tri "m", le menu "Manual sort :" (tri manuel) s'affiche à l'écran suivi de quelques commandes (détaillées ci-dessous), ainsi que l'arborescence des fichiers qui vont être inclus dans le livre, avec successivement le numéro d'apparition des fichiers et le chemin d'accès, c'est à ce moment que vous pouvez modifier l'ordre du tri. Voici ci-dessous le détail des commandes possibles : Détail des commandes du menu "Manual sort :" :
- e (pour "Exit" ou sortie) permet de sortir du menu et commencer la génération du livre.
- s (pour "Save" ou sauvegarde) permet de sauvegarder l'arborescence de fichiers dans un fichier nommé file.tree.
- l (pour "Load" ou chargement) permet de charger le fichier nommé file.tree contenant l'arborescence de fichiers.
- d (pour "Delete" ou suppression) permet de supprimer le fichier nommé file.tree contenant l'arborescence de fichiers.

Utilisez ces options pour sauvegarder l'arborescence avec la commande "s", la modifier en ouvrant manuellement le fichier file.tree avec un éditeur de texte (comme gedit par exemple). Puis rechargez cette arborescence modifiée avec la commande "l", vous verrez les modifications s'afficher dans le menu "File tree :".
Plus bas le menu "File tree :" est affiché, c'est l'arborescence de fichiers : La flèche orientée vers la gauche en suffixe des chemins d'accès aux fichiers indique la position de la destination d'un autre fichier source que vous pouvez choisir de déplacer. Validez pour décaler ce curseur vers une autre destination (c'est-à-dire vers le bas), ou écrivez un nombre, puis validez afin de changer la position dans l'arborescence (l'ordre de tri) du fichier indiqué en source (soit le nombre indiqué) vers la destination (soit le curseur en forme de flèche). Exemple :
- Le curseur est positionné sur le fichier numéro 3, c'est la destination.
- J'indique le numéro 10, c'est la source, puis je valide.
- Le fichier en position 10 (la source) prend la position 3 (la destination), et inversement, le 3 prend la position 10.
Lorsque l'ordre de tri des fichiers correspond à ce que vous souhaitez, indiquez la commande "e" puis validez pour sortir du menu et débuter la génération du livre. La génération du livre commence alors. Elle prend logiquement un temps proportionnel à la complexité de l'arborescence de fichiers utilisée comme source, ainsi que le nombre de lignes et de caractères dans la programmation et l'encodage de chaque fichiers. Une fois la génération du livre terminée, un fichier PDF nommé book content.pdf est constitué, et les spécifications utiles pour l'impression du livre sont affichées : - Book cover specifications for printing : caractéristiques de la couverture du livre pour l'impression.
- Total lenght (front + side + back) : longueur totale de la couverture (soit la somme des largeurs de la face avant, du dos, et de la face arrière).
- Front width : largeur de la face avant.
- Front height : hauteur de la face avant.
- Side width : largeur du dos.
- Side height : hauteur du dos.
- Back width : largeur de la face arrière.
- Back height : hauteur de la face arrière.

- Book content specifications for printing : caractéristiques du contenu du livre pour l'impression.
- Number of pages : nombre total de pages du contenu du livre.
- Total files size : taille totale des fichiers de votre arborescence faisant partie du contenu, ce qui correspond à la taille totale des fichiers inclus dans le livre, autrement dit, le contenu utile (cette taille exclue donc les titres et la numérotation des pages, de même que la table des fichiers à la toute fin du livre qui n'est là que pour faciliter la navigation dans l'ouvrage final imprimé).
Toutes ces caractéristiques vont vous permettre de créer la couverture du livre manuellement. Dans la continuité, la génération de la couverture aurait pu être également automatisée, mais je pense que c'est contre-artistique, ne laissant plus aucun libre cours à la création et l'imagination. C'est donc un choix mûrement réfléchit de ma part que de laisser la création de la couverture à la charge de l'auteur. Après avoir créé la couverture de votre livre à votre guise, il suffit simplement d'envoyer cette dernière ainsi que le fichier book content.pdf à un imprimeur ! Libre à vous de faire une utilisation de ce petit programme de génération automatique de contenu de livre, lorsque vous aurez besoin de sauvegarder vos fichiers sur un autre support que ceux habituellement utilisés dans le monde du numérique !