Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/11/2020, à 20:27

sylvainmahe2

Les livres de sauvegarde

Bonjour wink

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.

dsc08815.jpgdsc08826.jpg
dsc08820.jpgdsc08821.jpg

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

dsc08823.jpgdsc08817.jpg

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/&/&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.

Hors ligne

#2 Le 21/11/2020, à 22: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