#!/usr/bin/env python # -*- coding: iso-8859-15 -*- # Utilisé par /var/www/impression/analyse.py # et /usr/scripts/impression/crans_backend.py # Écrit initial par Benoit # modifié par Brice DUBOST et Benoit # Licence : GNU General Public Licence, version 2 import locale locale.setlocale(locale.LC_ALL, 'fr_FR') import commands, os, string, sys, tempfile sys.path.append('/usr/scripts/gestion') from config import impression class cout: """Classe pour le calcul du cout d'une impression et de sa mise en page""" c_total=0 # en centimes c_total_euros=0 # en euros total_noir=0 total_couleur=0 faces=1 pages=1 nb_copie=1 taille="" erreur="" recto_v="None" media="" str_cout="" From=u"Imprimante <%s>" % impression.From_imprimante def __init__(self, fichierps, media="", mode_couleur="Couleur", recto_v="None", taille="A4", nb_copie=1): """ * fichierps est le fichier PostScript (ou pdf) à analyser * media vaut transparent le cas écheant (dans ce cas taille=A4) * mode_couleur = Couleur pour traiter en couleur * recto_v = Recto si l'on ne desire pas un recto-verso * taille vaut A3 ou A4 selon le bac choisi * nb_copie est le nombre de copies désirées Le PostScript a toujours priorité sur ces paramètres """ # Vérification du format de fichier. try: en_tete=open(fichierps).read(4) except: self.erreur="Le fichier ne peut etre ouvert" return # On vérifie que ce que l'on nous a envoyé est bien un PS ou un PDF if en_tete!='%!PS' and en_tete!='%PDF': self.erreur="Format de fichier non supporte" return self.nb_copie=nb_copie # on compte le nb de copies et on enlève les balises pour ne pas recalculer nb_copie_ps=0 original = open(fichierps) fichier = tempfile.NamedTemporaryFile().name fic = open(fichier,'w') ligne = original.readline() while ligne: if ligne.startswith('%%BeginFeature: *PageSize') or ligne.startswith('%%BeginFeature: *PageRegion'): taille=ligne.split(' ')[-1].strip() if ligne.startswith('%%BeginFeature: *Duplex'): recto_v=ligne.split(' ')[-1].strip() if ligne.startswith('%%BeginFeature: *ColorasGray True'): mode_couleur="GRAY" if ligne.startswith('%%BeginFeature: *InputSlot Transparency'): media="transparent" taille='A4' if ligne.find('%RBIBeginNonPPDFeature: *NumCopies') != -1: nb_copie_ps=int(ligne.split(' ')[-1]) while ligne.find('%RBIEndNonPPDFeature') == -1: ligne = original.readline() ligne = original.readline() fic.write(ligne) ligne = original.readline() fic.close() original.close() # Le PS a priorité if nb_copie_ps: self.nb_copie=nb_copie_ps self.taille=taille if not (taille=="A4" or taille=="A3"): self.erreur="Taille invalide" os.remove(fichier) return if recto_v == "None" or recto_v == "Recto": recto_v="Recto" else: recto_v="Recto-verso" self.recto_v=recto_v if (mode_couleur == "Couleur"): device = "png16m" else: device = "pnggray" if (self.taille == "A3"): # Une feuille A3 couvre 2 fois plus de surface que A4 c_taille = impression.c_a3 cout_coul = 2*impression.c_coul cout_noir = 2*impression.c_noir else: cout_coul = impression.c_coul cout_noir = impression.c_noir if (media == "transparent"): c_taille = impression.c_trans self.media="transparent" else: c_taille = impression.c_a4 (status,rep) = commands.getstatusoutput("nice -n 10 gs -sDEVICE=%s -r100 -dBATCH -dNOPAUSE -dSAFER -dPARANOIDSAFER -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dMaxBitmap=50000000 -sOutputFile='%s' -q '%s'" % (device, fichier+"%d.png", fichier) ) # On n'a plus besoin du fichier temp, donc on le supprime. os.remove(fichier) if (status != 0): self.erreur="ERREUR : Ghostscript : Fichier Postscript invalide.\n" self.erreur+= rep # On détaille l'erreur dans le mail et # il faut stopper l'impression. return if os.system("ls '%s'*.png > /dev/null" % (fichier)): self.erreur=u"ERREUR : Fichier postscript invalide. Aucun png n'a été créé\n" else: if (mode_couleur == "Couleur"): remplissage = [0, 0, 0, 0, 0] # C, M, J, N, nombre de pages for file in string.split(commands.getoutput("ls '%s'*.png" % (fichier)),"\n"): resultats = commands.getoutput("/usr/scripts/impression/percentcolour '%s'" % (file) ) l_resultats = string.split(resultats,":") for i in [0, 1, 2, 3]: remplissage[i] += float(l_resultats[i])*float(l_resultats[4]) remplissage[4] += float(l_resultats[4]) os.system("rm -f '%s'" % (file)) self.total_noir = remplissage[3] self.total_couleur = sum(remplissage[0:3]) self.faces = int(remplissage[4]) if (recto_v == "Recto"): self.pages = self.faces # nb de pages par copies else: self.pages = int(self.faces/2.+0.5) if self.total_couleur > 0: self.c_total = c_taille*self.pages+(impression.c_tambour_coul+impression.c_tambour_noir)*self.faces+cout_noir*self.total_noir+cout_coul*self.total_couleur else: # Pas de couleur, malgre l'indication self.c_total = c_taille*self.pages+impression.c_tambour_noir*self.faces+cout_noir*self.total_noir else: remplissage = [0, 0] # Noir, nombre de pages for file in string.split(commands.getoutput("ls '%s'*.png" % (fichier)),"\n"): resultats = commands.getoutput("/usr/scripts/impression/percentblack '%s'" % (file)) l_resultats = string.split(resultats,":") remplissage[0] += float(l_resultats[0])*float(l_resultats[1]) remplissage[1] += float(l_resultats[1]) os.system("rm -f '%s'" % (file)) self.total_noir = remplissage[0] self.faces = int(remplissage[1]) if (recto_v == "Recto"): self.pages = self.faces # nb de pages par copies else: self.pages = int(self.faces/2.+0.5) self.c_total = c_taille*self.pages+impression.c_tambour_noir*self.faces+cout_noir*self.total_noir self.c_total = int(self.nb_copie*self.c_total+impression.fact+0.5) # arrondi et facture self.c_total_euros=float(self.c_total)/100 if (self.c_total < 100): self.str_cout = "%s centimes d'euros" % (self.c_total) else : self.str_cout = "%s euros" % (self.c_total_euros) os.system("rm -f '%s'*.png" %(fichier)) def remplis_template(self,template): """Cette fonction rempli le template avec les bonnes valeurs""" if self.erreur=="Taille invalide": taille="Le format de papier que vous avez demandé n'est pas valide" elif self.media=="transparent": taille="transparent A4" else: taille=self.taille return template % { 'noir' : self.total_noir, 'couleur' : self.total_couleur, 'faces' : self.faces, 'pages' : self.pages, 'copies' : self.nb_copie, 'taille' : taille, 'prix' : self.str_cout}