Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
https://forum.bidouilleur.ca/index.php?action=signup Les demandes d'inscription sont révisées quotidiennement.

Menu principal

Les livres de sauvegarde

Démarré par sylvainmahe, Novembre 21, 2020, 06:14:36 PM

« précédent - suivant »

sylvainmahe

Bonjour ;)

Je me permets de partager avec vous une idée que j'ai titré "Les livres de sauvegarde" :

CitationFace à  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 oeuvre 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 :
CitationC'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[$countTable]=$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"BACKSLASH/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"BACKSLASH/\\\/g" | fold -s -w$((countCharacterPerLineDisplay-(${#countTmpLine}+3))) | sed -e "s/ /"$bashString"SPACE/g" -e "s/*/"$bashString"STAR/g" -e "s/\\\/"$bashString"BACKSLASH/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"BACKSLASH/\\\/g" >> tmp/tmp3
else
echo $spacePrefixSubline" : "$subline | sed -e "s/"$bashString"SPACE/ /g" -e "s/"$bashString"STAR/*/g" -e "s/"$bashString"BACKSLASH/\\\/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$bashString"SPACE"
done

sed -i tmp/tmp3 -e $((iterationLine+1))"i"$fillSpace$numberPageContent | sed -e "s/"$bashString"SPACE/ /g"

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"BACKSLASH/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"BACKSLASH/\\\/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"BACKSLASH/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 x=\""$(echo $marginCutter"+("$widthPage"-"$marginPage")" | bc -l)"mm\" y=\""$(echo $marginCutter"+("$marginPage"+("$fontSize"*("$iterationLine"+1)))" | bc -l)"mm\" text-anchor=\"end\" font-family=\""$fontName"\" font-size=\""$fontSize"mm\" fill=\"#000000\" xml:space=\"preserve\">"$(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"BACKSLASH/\\\/g" >> tmp/tmp.svg
else
echo "<text x=\""$(echo $marginCutter"+"$marginPage | bc -l)"mm\" y=\""$(echo $marginCutter"+("$marginPage"+("$fontSize"*("$iterationLine"+1)))" | bc -l)"mm\" text-anchor=\"start\" font-family=\""$fontName"\" font-size=\""$fontSize"mm\" fill=\"#000000\" xml:space=\"preserve\">"$(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"BACKSLASH/\\\/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 -m -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 :

Citation- 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 in mm ? : 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 :" :

Citation- 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 :

Citation- 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.

Électro-Bidouilleur


rikigeek

Ouahou, idée intéressante. C'est surtout orienté code source et texte "brut", c'est bien ça ? J'imagine que les fichiers odt ou docx ne sont pas supportés ?
jolie travail, faudrait que je teste ça (en script shell en plus !)

sylvainmahe

Bonjour, merci pour vos messages d'encouragement :)

Effectivement je persévère en tant que poisson qui nage à  contre courant, mais l'important dans cette histoire c'est de partager avec vous des projets libres dans la gratuité et la volonté que vous puissiez éventuellement en trouver un intérêt.

Tout à  fait rikigeek, c'est surtout orienté code et texte "brut", du moment que les caractères du texte en question se trouvent dans la norme UTF-8 (choix arbitraire de ma part mais réfléchi au vue du grand nombre de personnes à  utiliser ce format).

C'est une bonne question pour les .odt et .docx. Je n'ai pas mon pc avec linux ubuntu cette semaine, je pourrais vous en dire plus samedi quand je serais à  mon atelier, mais dans l'idée même si la base semble être du xml d'après ce que j'ai lu, après avoir ouvert un .odt (sous windows) je pense que ça ne fonctionnera pas.

J'ai écrit simplement dans un odt :
Test
é »(‘(è-è_è_i*/-+

fghfhrty’(-


Et voici le contenu que je vois dans notepad++ :
PK    à...HxQ^à†2 '   '      mimetypeapplication/vnd.oasis.opendocument.textPK    à...HxQ               Configurations2/progressbar/PK    à...HxQ               Configurations2/menubar/PK    à...HxQ               Configurations2/popupmenu/PK    à...HxQ               Configurations2/statusbar/PK    à...HxQ               Configurations2/toolbar/PK    à...HxQ               Configurations2/accelerator/PK    à...HxQ               Configurations2/floater/PK    à...HxQ               Configurations2/toolpanel/PK    à...HxQ               Configurations2/images/Bitmaps/PK  à...HxQ               manifest.rdfàâ€œànÆ'0„ï<!eàŽà˜@/r(àŠÂ¹jŸÀ5†X/à²Å¡àžÂ¾Å½â€œVQ¤ªêŸà"à£Â®F3àŸÅ½Â´â€ºà­aàˆâ€¹Â²Â¨àT4c)%àŠHhµé+:».¹¥à›:àšà˜Â¶+Å¡à±jÆ'¥Ÿ*ºwn*9_â€"!-7 làÂ³Â¢(xÅ¡à³<O¼"àà•8qH à†Â´Å½ Biàµà¤|9àŽâ fWQtૠyà· =‹à:© ²
a¶R½‡¶ ‘@ LàŠâ€žtÆ'ºNKà...3â€"à³Q9àÂ¡à­âÇ`½à"Æ'¢<`à°+Žàà˜àžË† ¦à¥^à Â½Â°î\Æ'àŸ|•hzîczuà"à...à±àŸ#”`oe2îOê»;yà¿çà¾.àà¿⯴vDl@àŽÂ£gàºÂç´à²UG¯PK´à·hà'  Æ'  PK  à...HxQ           
   styles.xmlà­Koà›6à¸Â¾_ahà˜n´,;ic¯é†
h;`é;´DY\)Q )?àºà«à·â€˜%Jâ€"5i7 sàŒïà½à¤GR¯~<à¦l¶'BR^àœà'|àŒHà³â€ž»ûà Âà·?£»à Çà—àŸÂ¼âiJc²Ix\à¥Â¤PHª#rà,,!àœà¤Dà¡û à...†cIà¥Â¦À9‘oxI
G²iq7FÅ'à½mO¥®à•à°èS>•à¶(J9Å y^bE·¬àƒâ€ sà â€œ)Unà,Pà"ZAs.và¡r±¸ à­o‡}d´à¸à˜à ‡ùaep£àµz¨CM⯬3XIF´j2Å'à¦QèpS§šc}9ª©à,,à—§M>LÂ¥à•Â¸Â]à²U2|•à¸Â´r¿›là²~7¾8àƒb²à±à™Â§¥ºà¼à›P’ à•à¸o§GÉ û²Š*àŸ1à™YXà¡Â³@C®.&à«APE„‡_D1‹à›roe^Å  à"²à£â€à‹E´
R2àšf¬à˜5½%à¥UvC?ªà¥â€œcIà• àŒ à™Â¦àƒÂ¡Å¸Çµˆ¡à†qà¸Å'?A!º y:
‰à¦Å Â¡â€˜>àˆâ€ s”KD ˆ/7µà.Ç*é4wà¡[ Å¡oàŸÂ´à½Pà¤SC¨q;Â¥ ZN.#‹àà±>àâ€¡T!à˜G!` ²à—-¯i¢â,,¢àŠà™xà•P‡ºI2ˆ
¬W!4T(´§à¤à°m“]R®à"à...ûàŸC
Cº†àMè±ôu{@Roà"\¯àâ,,¢rà˜S”˜Éà—¯lù6à‹3û[;à¶>xSà...4àÂ³\àˆ(ËœA{sx9e§ûà {\rùÆ'‡d‚Y‡§à†E;R@fAà‹•2‘K¡â,,¢à¼Å¾= Y:.»‡8Aàs\t0Jªbàˆà¡=à"4€àPlž¤à›çà¸à¦9ªµ¡à¸Rà¡:IEà²çèôâ€"à†â€šKžªà™Å¸à¸BGàµêà¡à½#º½{ ùCU èà"Bž+?+¼zàNªNàâ€žÂ¤Â¸bàµà¼ê8à—:à­.3·à¾ÂJhàD(
à³Â®Â¶C*à?D‡}à¼à›à•àâ€¹[|àŒô¶à­â€ºÂ±à²r¹Nc¨­”oÀ
à±Râ,,¢~Qp¤à—$2àƒ ? àV!Žà·àb¾Šà³Aà Â©T0Ç 6 ’%Ža&Côà—à›â€¹F]àž]Dàžk£âsTèôS¹ž¡à°Â¬ÂàŒÀŽU²sjÅ â,,¢ôà²Â§à,,w¼m@à¡Jq-’Š&„[TàŒàŠ ;F­ s•Æ'èqHà«â€"à³àˆâ,,¢@jà›I*Z$Dooàº\à£à£â€t:à,à¸yàƒK©³n\à­]à«}fM% ¸¡àQ5à,à«dQ¢‚à...\‹W:à˜àŸuôà«àÂ_.é'€Gà‹Râ,,¢5†‹]!w°”
³àƒT£à°à½ùà·à†iDàô>QÆ'­=â,,¢F\ à—¬â€"éà à'b~[6^wâôSঠµà°à"»s‰zàŠgà¤à˜ï¸=¹
â€"µ¹'·f´/¹à½àº.hÆ'à™é
SFà½à bÆ'à«Â¹€L-à¤}°´ୀBà¼â€º_à™Â©àŒHaBÅ NˆQà"t
Fsàšà˜6±àŠÂªË†UeêN. §@€¯â€"à£(¡à1
-¦à¼à›Â¨-à¤n5•à é¶Š¯)à¿Å¸Hy?éˆà«rà½L$Ç´@àºÂ°à¬à'à±<]à‹Jf}Q à'8à†Â¥ôÅ¡à¾S+àŽÅ¾ ½†àŒË†Å¸oà¶Â´Â½à¥Bà—NPà˜â€¡ à›à—à™à¿\àHà°CO8¬ôJà½#!%R|GT¦àùºZଠ´࿠µâ€"`‘£Ç!â€"a Žà•!à—â€"à¡9¿_N¼àºe àà­VÂ¥à5î#¼‡!à‹à...‡-ONCj=à–s, 7à‹J=4àœ,àààÂ®o¹Ràº\ à³D´là›P %àœ+àŒàºà›u3mfàšÀ଀Oà²Â±F5à'rL!ºŽà³àµà à½à¦và"àºY:à¾à$à—ËœO;8ê±Qàœà[à¥Çॠà¶Â¼Z›ïà³ÂX-à­Â¨

à†Â¸mà›à•v´à¥à¼H•l¬%àƒ'¯xf>à¸9Â¥ùà¤Âª­¸›â€"S+àŽÅ'¡» àŠ-Å n¿›îÂ¥70j<à...༠‡iâ€"Š½“¢à‹Â©)}½u·7à"<à·6GàŠ/Ëœ;à *?³eà—}ù9-à›Â¼Gà˜Â«qs“]ˆI.ws¾oà£#c¡]à"02àƒ)àŽà¸â€œâ€œÀàºÂ¬â€ à¿kI2m4ôlhà Âµ“³à¬W8¿`ŽQàƒïbŽ}¡|à¸ïUº1WàŠàžCoe!â7 zˆÅ'ଠ«à'­Æ'ôàš mUŽôm?†à¦àœx^7Éš´ïzà,,%5S<à,,à'à"-q)x `HÂ¥]¡_†à˜à¶Pjàžf1!±oeH‚¶'à›Â®ažà¶àœ1¨@ÇàŒÅ¾èà¥à•!]‡¬®é:à¤à¦ê®Cn¯é:à¤à...à•!]‡¼¼:¤à«ÂÂ»Â«CºY_à'àŒà¿#tA¾›
®ˆ„â,,¢Â¸H鮪ïà' ª )çJà¿à²XTà¬à«à¦³Šè]t„²à±Tà½^à¡à"à˜S„~ààà¼àœ'.àšàžé’"S+èà˜k´ ‰=à™7aseº^·‡à¬!ïà"LZ/0’ªF‹XËœOàµNï=§nà­+º¾à†žp‚q wzà›A´ౠ¢à›à½*¡àŒÂ£` ©wZ7Mô7Nà‹h¾XDàµM‚¸à«Â¤à¥zà¾rà"à,Z8P!.¨à¾Â¶Âª5J`ª‚à¾Âà...àˆmEoYûèlQà"
=‡àµâ€"mà¾Â¡[ô][ûà'D Iéà˜Y_,à¦â€¹è®âà£àâ€"€à¥_à£D‹h §àº}k¥­?8rF›Æ'9Nà¾ÂªÂ¤Â²Y`sàƒÂ® (bà›à¦eàŽ}àŸÂ°0à¿>ggmF°~â€"1?BàŸàžâ9£6#àS°à¤X6<iàµÂ¢à¦tà±eà...à—à™K]¯zà¬àƒà¡O¡_à¿
PKçc±  J-  PK  à...HxQ               meta.xml“à‹Å½à› †à·}
‹vk¾9ž]W•Z©©àš]Dà à,,¡uÀà,d<}û_2â,,¢IàµÅ½à¿|?ç†à«Â§â€"S<Æ'”à'D#‚àà,HÂ¥à›
àºÂ±à½â€"è©ùP›àƒA `à'ˆೠ´ Oà xà Â­z`Â­â€¢Â²à› Â£s=àƒxÇhL"c[’à Kîxà¸Â¬`à¼Ë†Çà...¼Ag«â,,¢à¡Æ'Ëœà¦'ËœàŒô à—à¬â€¢eSYà³y.à¤àKà™Â·~c®µ^ 3±à–›âù¼à'/à'àµFǻà,StE¥¸rà½à™v%†.ൠ˜F£`)èfà  jà–é^zmê©ca;O„~zàà,,$&!Â¥aoen)a$cI•YF¦¯à†µà¬â€˜5g”DY^­à–›³‚TàŽ/>”g;àà•|à›&à±à·%à]à°Â­Gà¼
}G/à²àŒ^Ÿàà à¼Æ'S"ËœtÇà·„à,oeÂµà› Â¿ÂªIT'àžàžâ€°fà¿„{¯à¶7$½jâ€"·â€"à·Ç5,à'X¹j颉£§!{!à£%¢à½DÇ£r0ô\à¸$w Exé®
~4à†6_à"àžà,à—i©¸ˆH”Dôà"Oà¥ç8à¬~•ù.OÆ'dà—[sé
à‹"K‹2+%¡©Là...!¯àŠÂ¢â€{ZT2‰à³Æ'Hà'2Rà†à‹Ë†_à³à•à¸à à,à¾à–à¦PKà—%®àºà  à«  PK  à...HxQ               settings.xmlµZQsâ8 ~¿_à'à¡Â½Kà™à¶z-à"v'àÂ²à‹-- àà­àœÂ¾â,,¢D@®Ž•±à¿à¾dà˜!â€"%à'S§à,,‘,YàºôIàŽà•â€"y"^@›à•uÂ¥à¶é¤r*à,,(V“à«àŠà£Â°u|Qùrà³ÇŽÇqàµàƒ,e
XKKàŒ½®L}ùà¸Âºâ€™iUGabSW"S·aSP«à—ê¯Wà—½²à¼à,,à«àŠà"àšÂ´^­ºâ€"+>¡žT?ŸoeoeUâ€"à¿Â¯Vàe¬žà—à«g³à™Â§à™Â©_[»¼¼¬àºÂ§Â«Â¥!ªq<à™wcà‹à•à‹Âà¥â€º|à¥Å¡à"àŠààŠ+à³o®à²Wâ€"Žc ‰à³àQà¾Â³Sv]!à«ê/1àŒà–^«l{ïà¿ï༠àµÂ1à,,´²zb)=Ԭ&•›“«ê[û‹à­Àà˜ràˆ}Å #;à*à¸à¬à²à¤âs1à¡àŸ žL·oûs­V;?Làº`Š³>D5àoe
5³¡a„(A¨àŠÂà•¦£­gî1‚]à'ÇBš½à...'"=ŽUsˆàž:k{€ùw(à˜àµb?â€"·£­«cçlà‹Žrgà¬à•à¾Âºà¸Â³€àœ]©rzy~°T$”Ÿ,^lé©à­Â¥à¶wà¦Ë†à‹Àb²h-&;à°à¬0à¡?“!‰àšÅ'¶)j[:bâ,,¢m¢àŒµâ,,¢à"¹ôZQé
à,,çà'²àºÂ­_Z"´¨wà¬à½à¤@àŸÂ´à $„¢â€"¦¶¨à¶à'à¦Â¶K%t,‘à'~"à,à...àŠÂ¶à¼à¸àŠv=àŽà'qûªà,,ûà—îà¥â,,¢â€"ËœÀïà±Å¾FK~n¡àžLÅ¡2oeàœ#4¶ àžaà"à•Âeàœ%#ˆ"ˆn!#a °f¦5àŠJâ€"û;ÀL‡‡Kକ{L#a·UàŽb)DQOh1„kÆ'T„´£À¬àâ€ºà YBùoIà–:MËœ=‰àŸÀQà±à°Â¨FD’ž½šÅ'àŽUû(-_O+â,,¢à...à¥É”ï.:Å¡ m
éª;Sà'qËœà'à¡à³Dc¦|,8¤ºà•bà†à¤Â·-W¾ïˆà,jà‹y8Iàžà,,$jSàœ#àƒs€à6à™Â~à–ˆ•àâ€¹}D2ž(à²îÀbàšC;´.àŸà¾|àƒ=‘‚niL¶î¼„hi›ï U`b¡zâ,,¢
m&àžÂ³Â§€"1à,,2@à"Q¦Å'kwK§cAÅ¡àŠà...£¡à¼Â¢Â¸)à¿Pnà±à­àŸâ,,¢Â±à±xA5àŒSl§à·BeB6&2¸m ^`8%oeU"â€"à¥[à¤à,,•8à²6ŸQ¸ZàˆKÆ'DHà™©é•jeà...àŽà9âl+pl‰4àŠÂ¯Æ'à£àŒÂ¹à­Çrdà"UM‰†Æ'à.¡à•%à¿’T²À¬h:›ip5©;àºà—tUâ€¡àƒ Ž£‚&-à,,WWà ùN*J[$[à,àŸ8âˆhOj CZ¨XˆC^àšà"c¸1¢KOàŸL©)?&lÂ¥Và"9à¶àÅ à#Xà£Ca&\¤à¡nNŽSBv@D,èàž<¡Ž\5»•«à‹Â¹acà'’‡´Ÿ{$OWFkà†à ¡›Y7à¬À àˆù6oeàš<à²ôÀ±à•ÀZmH£à‹%¢3Q¨¡kà£J´}6µ§‰”8à³)Là"*†
¾Ugà•|¿xW‘+¢o/Å¡ %àƒ;à—àµàŠ ^}kº9à'“iàŠà£àƒ|à¼Å¸Âk ¿àƒ¤à¸àf¤‰àŠà,,à'¯wà•V*¬ »à·'àÇà™w ŽF„à,,›>à‹â€°â€°à°â2=nH<
8]ŠRà—¥£w‘à–2àŒ$Wà·à"§Sê#nZà¤9hà­ââô¬và àAEà"§‡Š¥ê4eoefàÂ»Â­®OÅ¡â€"j*t¾Žà³Lâ,,¢à¦t0!།TàŠ?¨â!à«jN´î˜Tàˆâ€=u7<à‹àˆ&à›à,,M(e§¦Môàpà"<uÂ¥Gàœ/àž3à"à"“à'©,à³Ë†aà¿à·à,N„ˆ5à½à˜à¥=BZà¤àšô´mU ù*h¥¤à¶î’à".\%sP¾1h««†q]H0x c‘IŽu€â€œBà"‹Cà—’²µm\
›àžU~à...«¤CÂ¥J
B§à¶]=‡¶Wà£'Æ'àŒj(nG~àœà¿ÂÂ¸Å'à¡É oC- sV{಼à·0•DÆ'àˆà‹;g?z Å'àšÂ°M!3à­Â¯/V4à"à³8º 7¿]Frà¡Â³#à¦à,‘³O#Bž¾j6Sà­f à«V‘F³‘u„Š”YQªÀà¿Çà'hÇà†1à·îxà¬"„wèà–¤”ŠU†â,,¢Â¹S‘¢6‡g(à¦û'à·IDBà,¨à,c‡à¼oDgà—\£î³aà¬{ÀWtˆ(:àŸàà¬Â¾â>pîà¥u ûu.xF3|f²:nî„à‹â€"9à†^¼Gà¿àµ53“à¿=: ˜¢¤à¸à¥:Š.Ç ZA$Æ'Z0g â€"&%à¼à â€™ïG1l‘”o¾?à¬pà­Â¿î{gà˜¦!à¥Â»A<g2·à,,¼à'LyàŠ2àŸà­{-ž^苝Ÿ´UàŸ| ^ààµéà¾àPKàšà¾/ià—  à¼/  PK  à...HxQ               content.xml½WMnà£6àžà·‚
A †Q<&jà¬à™Æ'HŠ¢NvUà$%Â¥D•¤,{7Çhw]àŽoeav“›àŒIàºHYŽà¥hê¢@à X|àŸûï}ûj›É`àƒÂµ*Ÿ‡à'à¥Uà°oe*&à²tà¾à¼à°½ _->»UI"(â,,¢Â¢eà†sܬàŠ-à¼@;7qà†-â,,¢â€¡Â¥àŽcEÅ'0qN2nbKcUà°Â¼à'‰;là¬à½à"àÂµà¥Â©àšû8zàºâ€°Å¡ÂªÂ»5%
Bà
bà...JàŒ(và–à–1à†N·vt©tŠ¯¯®^à àºÂ¹AoÂ¥àˆoà±UU]V3nnn°â€"6PF[\QjéQÅ'b.¹ àà è2à,
à–à˜Âoe\
î§`ùà–NUvà˜Â¾.à"¤šªà«Â°0C൛®>c}]³I'§¼IGàšGà—DONàžÆ'ûàšÂºÂ°'Å¡à¿5à–¼PàšÂ¶u&«é]à²à Â¾Â¯Â¼àŒV\O.±à¤I£aV«“àƒZia¹îàéI8%’và«8}!¦à«AQN/à'
ච¶eà Âµâ€ºX¶à¤â€™Â¨2‡¼à¶à¾ù¶à Z8‘^-X8oeà£â€œQDWà˜a¼Tà¿"„= àµ, Ipà™,Cà«à½Â¨Â¥Pf &à•ÂªË†{àš}s±à«¦y‰ïAè?îï:>à"à™à":à¬`©à...à¤5ªà'Æ'ê«à¬X¨àûà±ÂÂ£Â¼â€"D{3¢pkq 6là"ô/à·wKºà¦éÀây0àžX’w¤îà¼m§5àŽ%£Xrà˜Â»Æ'rnà—6“à£o 'm ©fà¬(bžaxc  à à•çà­àº3³Ç4~à,N†à...à£n­]2àà­gà³â€™à›Â§àžÂ»àŒà,Es¨à›np{À] %„rà,,8•fq[V{à"àÂ®Âà³à°Â®Â¤â€šâ€˜`Ir!zÆ'à‹â€žàœààƒ/H¡àŒ7=P}›‹RžCK€à™L%Å' à±3~°®àŸè` jɸïà â€ž ´àŠH>@à,Rà˜àš
à'à,Sàž'9OÅ à­SjsNh]+à¾Â«và­Å'à¥à™91à Âªâ€¢Q‰
~%àŸq1à—î‰à­â€¡Â¥àˆâ€"e~$¦Nr®<¶xûsRZËœH+(à²vàšÂôŸÆ'hÅ'Z_û( ¢IªI±npà .à¼à¾à•ZK MF4 àƒÅ½jPDàˆÂµàœ-à›à,,@ Àà›À»tà...¢aOà':Bâ€"`/àž.àÂ§ià­+à...và­Æ'‹eqà«ï·†à¿Qà,â,,¢Â¶<Oà,,„)$à™!UZ¸¹s$à¡=d <îà...uà'àŸKY[oŸ‹à±,cM+àÂ³_à6à²m}›?à›àŽk‘â€"ºàà±âµFËœ`àœà˜Â½Zqùà¸îàƒàŸàž_||à³çà...à£[ôà¸à¶7à¸_bôà•$u|àšx’®“µ¶»oà¾Âº@A<Ëœ,<:<à²àƒxà±PK!à•çà¡à  Y  PK    à...HxQà²Âª@Aâ  â     Thumbnails/thumbnail.png‰PNG

   
IHDR   Âµ      à,à½Çé   PLTEYbkd\Ywyty}vˆv‚‹}“ªŽŽ!Ž˜â€"‘Å'oe‘‡â,,¢â€Å½â€"â€"â€"â€"â€"›oeâ€"•‰“¨oe¤ž žž¤¬â€"¡±Ÿ¦³ª“¬¦â€"¨¡Ÿ¤£¤¢¥ª©§¦ª«©³©¦´®ª²³µ´¹¹½½½«µàÂ©Â·É¯¾ÉºàƒàÂ¿à,,ɶàŠàœÂ»à'à¦àÂ¬Â£àƒÂºÂ®à,¿¼É¿±à"¿­à,à,¿àŠàÂµà"ɵà,,àƒàƒà,à...àŠàŠà†ÀàŒàààà‹à—àà"à™à'à†àà'àŒà†à"à"à"àžà™à'àšàšàœàà'à¡àŽà—à¡Éà™çàà¡à¬àžïà±à¤à"Éà¬à™àƒâàœà–à¤àŸàžà¦à¡àœà²éàžà¿éà"à£à¤à¤à¡à¦à¬à¤éïïéà¤à­à­à­à¬à±à¶îôàºà«àºà¿à¼à²à¥ùôïà¿ùïà±à±à±ôùà¿à¼à¶à±à¿àºàµà¾à¿à¾   à¿à¿à¿3làŒI  ’IDATxàšà­à•ÉJQàvžgÆ'Å cˆ8à,,€â€°Â­â€™ç)NQ1±à¾à¿SÅ'[wn4
çnê-[TyLBMMMMMMMMMMMà½#à—Cµˆ·fàžà¾z¦’ônçM=v\àš]à˜à–à«Â¿PwjiàµÂ¶Q‹»à"ˆjD=[º‰htµº’¼à¬à‹â€¢dsd àžz¶b1›Mêà£ànV_â€""à‹Å Â±àœâ,,¢à¥Â£x_jà...êKoeD|t¯O¢à½àŸà¥Zo4m#5àµà¿Â¨Â³Â¸iµ«­ïgûà±9'ê«à¡à...àÂ¹Éà,àœza>­¯oeà¥D}?1½·6µ¿6X9ïoà­\à"à²Â¡~*ôà"jZ/?otnàºÂ¡m¤¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦à¾e¾ K?¼)à¡â€"à9    IEND®B`‚PK  à...HxQ               META-INF/manifest.xml­“Mjàƒ0Fà·9!à'¶XJà›Mq²(ôéT{ठH#¡ŸàœÂ¾Â²â€°â€"ˆ!;É¿à·àà˜àšà¬Nà–TG5à¬â€¢Â¯Yà"º©oà˜à·à¾Â«à¾`»à­jc¡†˜à¤Â´Â¨àŠ{¯à›â€ à¥@à'©ˆQ’²ejÂ¥à³@k³Jà²o½Mà—à,À;» Æ'à"à,,
½oe@àšeêT*à•oe<Ž”‘NklAàŽ£iȻn-h4Pâ€"à²p¾àà™ËœàšÂ«th˜¸›à«6èPà•éà¬Â¡aàŠ{Æ'à­H©à£à£ à¸Â¼užJ &â€"dà¸t¤±àaà,,à†7à± ;fâÂ¥už‘·sà,2ùôÅ'‡N? .U/EºàŒà"à™@à,àž1 3‹±’z:4BJà¥:<?mùFià¸?žàà²à½!!&Å 4-¹§à¾Å½­êA çà...²à¿Â®àºà¶PKT´O.  %  PK     à...HxQ^à†2 '   '                    mimetypePK     à...HxQ                         M   Configurations2/progressbar/PK     à...HxQ                         â€¡   Configurations2/menubar/PK     à...HxQ                         Â½   Configurations2/popupmenu/PK     à...HxQ                         àµ   Configurations2/statusbar/PK     à...HxQ                         -  Configurations2/toolbar/PK     à...HxQ                         c  Configurations2/accelerator/PK     à...HxQ                         Â  Configurations2/floater/PK     à...HxQ                         à"  Configurations2/toolpanel/PK     à...HxQ                            Configurations2/images/Bitmaps/PK   à...HxQ´à·hà'  Æ'               H  manifest.rdfPK   à...HxQçc±  J- 
             â€¡  styles.xmlPK   à...HxQà—%®àºà  à«               à   meta.xmlPK   à...HxQàšà¾/ià—  à¼/               à"
  settings.xmlPK   à...HxQ!à•çà¡à  Y               à¥  content.xmlPK     à...HxQà²Âª@Aâ  â               î  Thumbnails/thumbnail.pngPK   à...HxQT´O.  %                 META-INF/manifest.xmlPK      e  w   


(ce que vous voyez ci-dessus n'est pas exact et est converti par le php du forum)

Sinon il me semble qu'il y a possibilité d'enregistrer ou de convertir un odt en pure xml, à  réfléchir :)

sylvainmahe

N'hésitez pas si vous avez besoin de créer un livre de vos fichiers informatiques, je peux vous aider. J'en ai encore mis un en production récemment afin de sauvegarder, et de partager cela avec des amis autour d'une table sans avoir besoin de faire appel à  de l'électricité et des écrans d'ordinateur :)

Je fais appel à  l'imprimeur https://www.pumbo.fr/ qui est vraiment simple, rapide, et respecte vraiment bien les caractéristiques de mes fichiers PDF.

Ils demandent 2 fichiers, un pour le contenu et un pour la couverture du livre.

N'hésitez pas si vous avez des questions ;)