SCRIPT : "Sauver des arbres"
Qui n'a jamais essayé d'imprimer en deux pages par feuilles, recto-verso, (sur une imprimante recto) sans se planter ?
J'ai rédigé un petit script python qui donne des instructions pour que tout fonctionne bien :
#!/usr/bin/env python
# -*- coding: UTF8 -*-
def liste_congruence_vrac(first_page,last_page,indice_congruence):
"""
Résultat :
Retourne la liste des numéros de page compris entre first_page et last_page, dont les congruences modulo 4 sont dans la liste indice_congruence.
Paramètres :
Première page (first_page)
Dernière page (last_page)
Choix des congruences modulo 4 :
- indice_congruence = [1,2] pour les congruences 1 et 2
- indice_congruence = [3,4] pour les congruences 3 et 4
Exemple :
indice_congruence == [1,2]
first_page == 1
last_page == 7
La fonction retourne [1,2,5,6]
"""
# Traduction des congruences pour qu'elles soient lisibles par python (congruences lisibles : 0, 1, 2, 3)
for c in range(len(indice_congruence)):
indice_congruence[c] = indice_congruence[c] %4
liste_vrac = [] #liste en vrac des nombres des bonnes congruence
for i in range(first_page,last_page + 1):
if (i %4 in indice_congruence):
liste_vrac.append(i)
return liste_vrac
def str_congruence_recto(first_page,last_page,indice_congruence):
"""
Résultat :
Retourne un tuple composé de deux éléments :
- chaîne de caractères utilisable par un logiciel d'impression en recto, composé des pages aux congruences choisies
- un entier :
- 0 si le nombre de pages à imprimer est pair
- 1 si le nombre de pages à imprimer est impair
Paramètres :
Première page (first_page)
Dernière page (last_page)
Choix des congruences modulo 4 :
- indice_congruence = [1,2] pour les congruences 1 et 2
- indice_congruence = [3,4] pour les congruences 3 et 4
Exemple :
indice_congruence == [1,2]
first_page == 1
last_page == 7
La fonction retourne ('1;2;5;6;',0)
"""
# Récupération des pages aux congruences souhaitées, sous forme de liste
liste_vrac = liste_congruence_vrac(first_page,last_page,indice_congruence)
chaine_impression = ''
for page in liste_vrac:
chaine_impression += str(page) + ';'
return (chaine_impression,len(liste_vrac) %2)
def str_congruence_verso(first_page,last_page,indice_congruence):
"""
Résultat :
Retourne un tuple composé de deux éléments :
- chaîne de caractères utilisable par un logiciel d'impression en *verso*, composé des pages aux congruences choisies
- un entier :
- 0 si le nombre de pages à imprimer est pair
- 1 si le nombre de pages à imprimer est impair
Paramètres :
Première page (first_page)
Dernière page (last_page)
Choix des congruences modulo 4 :
- indice_congruence = [1,2] pour les congruences 1 et 2
- indice_congruence = [3,4] pour les congruences 3 et 4
Exemple :
indice_congruence == [1,2]
first_page == 1
last_page == 7
La fonction retourne ** Je sais pas encore **
"""
# Récupération des pages aux congruences souhaitées, sous forme de liste
liste_vrac = liste_congruence_vrac(first_page,last_page,indice_congruence)
chaine_impression = ''
if len(liste_vrac) %2 == 0:
for j in range(1,len(liste_vrac)+1,2):
chaine_impression += str(liste_vrac[-j-1]) + ';' + str(liste_vrac[-j]) +';'
if len(liste_vrac) %2 == 1:
chaine_impression += str(liste_vrac[-1]) +';'
for j in range(2,len(liste_vrac)+1,2):
chaine_impression += str(liste_vrac[-j-1]) + ';' + str(liste_vrac[-j]) + ';'
return (chaine_impression,len(liste_vrac) %2)
####### Définition de quelques phrases utiles #######
mode_imprimante = "* Passer l\'imprimante en mode 2 pages par feuilles\n"
retourner = "* Retourner le paquet de feuilles\n"
sens = "* Ne pas oublier de mettre le haut du recto à droite de l'imprimante\n"
retirer = "* Retirer la dernière page du paquet\n"
chaine = "** Imprimer la chaine suivante : "
#####################################################
def impression(first_page,last_page):
"""
Résultat :
Instructions pour une impression recto-verso en deux pages par feuilles
Paramètres :
Première page, dernière page
Exemple :
faire un test ... ^^
"""
nombre_de_pages = last_page - first_page + 1
print '############### Impression p.' + str(first__page) + ' à p.' + str(last__page) + ' ###############'
print '\n'
print mode_imprimante
if nombre_de_pages %4 == 0:
print chaine + str_congruence_recto(first_page,last_page,[1,2])[0] + '\n'
print retourner
print sens
print chaine + str_congruence_verso(first_page,last_page,[3,4])[0] + '\n'
if nombre_de_pages %4 in [1,2]:
print chaine + str_congruence_recto(first_page,last_page,[1,2])[0] + '\n'
print retirer
print retourner
print sens
print chaine + str_congruence_verso(first_page,last_page,[3,4])[0] + '\n'
if nombre_de_pages %4 == 3:
print chaine + str_congruence_recto(first_page,last_page,[3,4])[0] + '\n'
print retourner
print sens
print chaine + str_congruence_verso(first_page,last_page,[1,2])[0] + '\n'
def test():
print '############ Test pages 1 à 23 ############\n'
print '## Congruences recto [1,2] ##'
print str_congruence_recto(1,23,[1,2])
print '\n'
print '## Congruences verso [3,4] ##'
print str_congruence_verso(1,23,[3,4])
print '\n'
print '###########################################'
#test()
first__page = input('Entrez la première page à imprimer : ')
last__page = input('Entrez la dernière page à imprimer : ')
print '\n'
impression(first__page,last__page)
import time
time.sleep(10000)
Exemple de résultat renvoyé par le script :
Entrez la première page à imprimer : 5
Entrez la dernière page à imprimer : 65
############### Impression p.5 à p.65 ###############
* Passer l'imprimante en mode 2 pages par feuilles
** Imprimer la chaine suivante : 5;6;9;10;13;14;17;18;21;22;25;26;29;30;33;34;37;38;41;42;45;46;49;50;53;54;57;58;61;62;65;
* Retirer la dernière page du paquet
* Retourner le paquet de feuilles
* Ne pas oublier de mettre le haut du recto à droite de l'imprimante
** Imprimer la chaine suivante : 63;64;59;60;55;56;51;52;47;48;43;44;39;40;35;36;31;32;27;28;23;24;19;20;15;16;11;12;7;8;
- J'aimerais faire évoluer ce script, pour qu'il communique directement avec cups, m'enfin j'en suis encore loin.
- evidemment l'indication "à droite" n'est valable que pour mon imprimante ^^