Skip to content

Instantly share code, notes, and snippets.

@brunetton
Created February 5, 2018 22:46
Show Gist options
  • Save brunetton/263c35d3e8549a08d450cb80c0fdf5f4 to your computer and use it in GitHub Desktop.
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
#!/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