Created
February 5, 2018 22:46
-
-
Save brunetton/263c35d3e8549a08d450cb80c0fdf5f4 to your computer and use it in GitHub Desktop.
Old old old code to make a book from a serie of svg files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/ruby | |
require 'fileutils' | |
require 'enumerator' | |
# crée le livret à partir des fichiers svg double page contenus dans le répertoire PagesRep | |
# nécessite : | |
# - des doubles pages dans pages/, dont | |
# - une page de garde (à droite dans le fichier 0.svg) | |
# - un fichier 'pages_blanches.svg' contenant deux pages blanches | |
# | |
# crée le répertoire livret contenant deux sous répertoires : rectos et versos. | |
# crée le répertoire 'tmp' pendant le traitement, puis le supprime à la fin | |
# pour imprimer, il faut imprimer les rectos, puis inverser l'ordre des feuilles de sorte que le premier verso soit imprimé au dos du premier recto imprimé | |
# sources svg double pages | |
PagesRep = "pages" | |
ResolutionPng = 150 | |
TmpRep = 'tmp' | |
LivretRep = 'livret' | |
PagesBlanches = [File.join(TmpRep, 'pages_blanches-1.png'), File.join(TmpRep, 'pages_blanches-2.png')] | |
# pour 5 pages : {:rectos => [nil, 1, nil, 3], :versos => [2, nil, 4, nil]} | |
def get_ordre_pages(nb_pages_originales) | |
# ([8, 1, 6, 3], 5) --> [nil, 1, nil, 3] | |
def nil_pour_pages_inexistantes(ordre, nb_pages) | |
return ordre.collect{|e| e > nb_pages ? nil : e} | |
end | |
nombre_mini_pages_finales = (nb_pages_originales / 4.0).ceil * 4 | |
nombre_feuilles_finales = nombre_mini_pages_finales / 4 | |
rectos = [] | |
versos = [] | |
# Rectos | |
for i in 1..nombre_feuilles_finales | |
rectos << nombre_mini_pages_finales - 2*i + 2 | |
rectos << 2*i - 1 | |
end | |
# Versos | |
for i in 1..nombre_feuilles_finales | |
versos << 2*i | |
versos << nombre_mini_pages_finales - 2*i + 1 | |
end | |
return {:rectos => nil_pour_pages_inexistantes(rectos, nb_pages_originales), :versos => nil_pour_pages_inexistantes(versos, nb_pages_originales)} | |
end | |
# exporte tous les fichiers svg doubles pages en pages simples au format png | |
# 1.svg --> 1-1.png et 1-2.png | |
def decouper_pages_originales(fichiers) | |
for fichier in fichiers | |
nom_fichier_sans_extension = File.basename(fichier).gsub('.svg', '') | |
system("inkscape -z -f #{fichier} -d #{ResolutionPng} --export-id=export_page_gauche -e #{File.join(TmpRep, nom_fichier_sans_extension + '-1.png')}") | |
system("inkscape -z -f #{fichier} -d #{ResolutionPng} --export-id=export_page_droite -e #{File.join(TmpRep, nom_fichier_sans_extension + '-2.png')}") | |
end | |
# suppression page gauche de la page de garde | |
FileUtils.rm File.join(TmpRep, '0-1.png') | |
end | |
# regroupe dans le bon ordre les pages simples trouvées dans le rep tmp | |
def regrouper_pages | |
def regrouper(ordre, fichiers_originaux, rep_dest) | |
i = 1 | |
ordre.each_slice(2) do |double_page| | |
gauche = double_page[0] ? fichiers_originaux[double_page[0] - 1] : PagesBlanches[0] | |
droite = double_page[1] ? fichiers_originaux[double_page[1] - 1] : PagesBlanches[1] | |
puts "regroupement de #{gauche} et #{droite}" | |
system "montage -tile 2x1 -geometry +0+0 #{gauche} #{droite} #{File.join(rep_dest, "#{i}.png")}" | |
i += 1 | |
end | |
end | |
FileUtils.rm_rf LivretRep | |
FileUtils.mkdir_p LivretRep | |
rep_rectos = File.join(LivretRep, 'rectos') | |
rep_versos = File.join(LivretRep, 'versos') | |
for rep in [rep_rectos, rep_versos] | |
FileUtils.mkdir_p rep | |
end | |
fichiers_originaux = Dir.glob(File.join(TmpRep, '*.png')).sort | |
nb_pages = fichiers_originaux.size | |
ordre = get_ordre_pages(nb_pages) | |
regrouper(ordre[:rectos], fichiers_originaux, rep_rectos) | |
regrouper(ordre[:versos], fichiers_originaux, rep_versos) | |
end | |
liste_fichiers_svg = Dir.glob(File.join(PagesRep, '*.svg')) | |
FileUtils.rm_rf TmpRep | |
FileUtils.mkdir_p TmpRep | |
decouper_pages_originales(liste_fichiers_svg) | |
regrouper_pages | |
FileUtils.rm_rf TmpRep | |
puts 'fin' | |
puts 'Les pages à imprimer se trouvent dans le répertoire livret' | |
puts 'pour imprimer, il faut imprimer les rectos, puis inverser l\'ordre des feuilles ' | |
puts 'de sorte que le premier verso soit imprimé au dos du premier recto imprimé' | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment