Pages : 1
#1 Le 21/11/2020, à 19:27
- sylvainmahe2
Les livres de sauvegarde
Bonjour
Je me permets de partager avec vous une idée que j'ai titré "Les livres de sauvegarde" :
Face à l'obsolescence progressive, mais bien réelle, des systèmes analogiques et numériques dans le paysage informatique complexe actuel (multitude de technologies matérielles et logicielles plus ou moins hétérogènes), nul ne sait si un matériel de sauvegarde standard considéré de nos jours pourra encore être lu (ouvert en lecture) dans les décennies à venir, et ce malgré le soin apporté à la propagation dans le temps des normes de standardisation de l'analogique et du numérique dans leur ensemble.
Le support imprimé comme le papier relié sous la forme d'un livre peut, dans de bonnes conditions de conservation, rester lisible après plusieurs siècles, voir millénaires. Contrairement aux mémoires non volatiles analogiques ou numériques qui peuvent faire office de supports de sauvegarde (rubans perforés, bandes magnétiques, mémoires à base de semi-conducteurs, etc...), la lecture du papier imprimé s'affranchit d'utiliser un matériel spécifique pour être compréhensible ou décodable, ce qui en fait un candidat relativement pérenne afin d'archiver et de transmettre des informations aux générations futures, en considération de la dépréciation et de l'évolution continue et accélérée respectivement des anciennes et des nouvelles technologies. De surcroît, la grande accessibilité du livre en lecture/écriture est fonction des caractéristiques rudimentaires propres aux techniques de l'imprimerie. La rusticité du support d'impression et de fait, son fonctionnement et sa mise en œuvre minimaliste (sans source d'énergie et dépourvu de composants complexes), participent grandement à sa relative robustesse eu égard les aléas et la sensibilité électromagnétique à l'environnement extérieur des technologies de rétention informatiques analogiques et numériques conventionnelles.
C'est pourquoi je pense être utile l'existence de ce présent dispositif particulièrement dans des contextes critiques, c'est-à-dire en cas d'obsolescence des techniques informatiques dites modernes à l'échéance de périodes dépréciatives et évolutives, de crash d'un ou de plusieurs systèmes redondants à différents lieux géographiques, de suppression intentionnelle de données à l'aide des techniques de piratage sur des machines particulières ou des serveurs connectés à internet, ceci conjointement à des situations éventuelles de crises systémiques, de conflits armés de types multiples, ou plus largement d'effondrement civilisationnel favorisant la dispersion et l'élimination d'informations importantes.
Le contenu de chacun de mes livres a pour origine un seul fichier PDF généré automatiquement via une routine que j'ai développé. En effet cette routine explore l'arborescence de fichiers que vous souhaitez sauvegarder, en extrait le contenu UTF-8, et compile le tout en un fichier PDF que vous pouvez directement envoyer à un imprimeur (voir plus bas).
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 du contenu d'un livre PDF (.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
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
rm tmp -r -f
rm "book content.pdf" -f
nameBash=$(basename "$0")
nameLink=$(basename "$1")
countTable=0
shopt -s globstar
for file in **/*
do
if [ -f "$file" ] && [ "$file" != "$nameBash" ] && [ "$file" != "$nameLink" ]
then
fileTable[countTable]=$file
((countTable++))
fi
done
if [ $countTable == 0 ]
then
echo "No file detected"
else
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
countTable=0
while read line
do
fileTable[$iterationLine]=$line
((countTable++))
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%"
rm tmp -r -f
mkdir tmp
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\"?>" > tmp/tmp.svg
echo "<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/&/&/g" -e "s/</\</g" -e "s/>/\>/g" -e "s/\"/\"/g" -e "s/'/\'/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/&/&/g" -e "s/</\</g" -e "s/>/\>/g" -e "s/\"/\"/g" -e "s/'/\'/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.
Hors ligne
#2 Le 21/11/2020, à 21:07
- arnoxz
Re : Les livres de sauvegarde
....intéressant..... cela dit en temps de guerre ou autre le feu, l'eau, le temps, les insectes, champignons,... a ravagé bien des bibliothèques (en papier)...
Hors ligne
Pages : 1