diff --git a/lib/impression/cout.py b/lib/impression/cout.py index 7ca78e0c..10e74671 100755 --- a/lib/impression/cout.py +++ b/lib/impression/cout.py @@ -1,34 +1,34 @@ #! /usr/bin/env python # -*- coding: iso-8859-15 -*- # ############################################################# -# .. -# .... ............ ........ -# . ....... . .... .. -# . ... .. .. .. .. ..... . .. -# .. .. ....@@@. .. . ........ . -# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. .... -# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... .... -# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. .. -# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. ..... -# ...@@@.... @@@ .@@.......... ........ ..... .. -# . ..@@@@.. . .@@@@. .. ....... . ............. -# . .. .... .. .. . ... .... -# . . .... ............. .. ... -# .. .. ... ........ ... ... -# ................................ -# +# .. +# .... ............ ........ +# . ....... . .... .. +# . ... .. .. .. .. ..... . .. +# .. .. ....@@@. .. . ........ . +# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. .... +# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... .... +# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. .. +# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. ..... +# ...@@@.... @@@ .@@.......... ........ ..... .. +# . ..@@@@.. . .@@@@. .. ....... . ............. +# . .. .... .. .. . ... .... +# . . .... ............. .. ... +# .. .. ... ........ ... ... +# ................................ +# # ############################################################# """ - cout.py + cout.py Fonctions pour calculer le prix d'une impression (ne calcul que le prix de l'encre. retourne le prix pour une copie en A4) - Copyright (c) 2006 by www.crans.org + Copyright (c) 2006 by www.crans.org """ -import sys, tempfile, os, commands, shutil +import sys, tempfile, os, commands, shutil, syslog, stat sys.path.append('/usr/scripts/gestion') import config from crans.utils import QuoteForPOSIX as escapeForShell @@ -38,7 +38,7 @@ def __init__(): # ########################################################### # # CONSTANTES # # ########################################################### # -# +# # import config COUT_UNITE_COULEUR = config.impression.c_coul @@ -49,7 +49,7 @@ COUT_PASSAGE_TAMBOUR_COULEUR = config.impression.c_tambour_coul # ########################################################### # # ERREURS # # ########################################################### # -# +# # class FichierInvalide(Exception): """ @@ -62,101 +62,105 @@ class FichierInvalide(Exception): return self.args[1] except: return "n/a" + +def try_command(cmd, tmp_rep, error_msg): + u""" Execute a command, log output and raise exception if it fails. """ + + (status, rep) = commands.getstatusoutput(cmd) + if status: + syslog.openlog('impression') + syslog.syslog(syslog.LOG_ERR, 'command failed (%d): %s' % (status, cmd)) + for l in rep.split('\n'): + syslog.syslog(syslog.LOG_ERR, 'output: %s' % l) + syslog.closelog() + shutil.rmtree(tmp_rep) + raise ValueError, error_msg % status + # ########################################################### # -# PRIX COULEURS # +# PRIX # # ########################################################### # -# -# Clacul le prix d'une impression couleur -# -def base_prix_couleurs(path_fichier_pdf): - """ - Clacul le prix d'une impression couleur sur papier A4 pour le fichier path_fichier_pdf - """ +def base_prix(path_pdf_file, color=False): + u""" Calcul le prix d'une impression couleur ou noir et blanc sur papier A4 """ + # nom_rep seras le dossier dans tmp ou tous les fichier créé par # convert seront entreposé - nom_rep = tempfile.mkdtemp(prefix='tmpimpr') nom_png = "%s/convert.png" % nom_rep # Nom prefixe et chemin des png créé par convert - - # Convertit les pdf en png couleur - (status, rep) = commands.getstatusoutput("nice -n 5 gs -sDEVICE=png16m -r30 -dBATCH -dNOPAUSE -dSAFER -dPARANOIDSAFER -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dMaxBitmap=50000000 -sOutputFile=%s%%d -q %s" % (nom_png, escapeForShell(path_fichier_pdf))) - if status: - # suppression des fichiers temporaires - shutil.rmtree(nom_rep) - raise ValueError, "ERREUR %s : Fichier invalide. Aucun png cree. (couleurs)" % status - + escaped_path_pdf_file = escapeForShell(path_pdf_file) + escaped_path_ps_file = path_pdf_file + ".ps" + error_msg = "ERREUR %%d : Fichier invalide. Aucun %s cree." + if color: + error_msg += " (couleurs)" + gs_device = "png16m" + nb_composante = 4 # Cyan, Magenta, Jaune, Noir + percent_program = "percentcolour" + else: + gs_device = "pnggray" + nb_composante = 1 # Noir + percent_program = "percentblack" + + if os.stat(path_pdf_file)[stat.ST_MTIME] > os.stat(path_pdf_file + ".ps")[stat.ST_MTIME]: + # Convertit les pdf en ps + try_command("nice -n 5 pdftops %s %s" % (escaped_path_pdf_file, + escaped_path_ps_file), + nom_rep, + error_msg % "ps") + + # Convertit les ps en png (il est néscessaire de passer par un ps + # car ghostscript refuse certain pdf) + try_command("nice -n 5 gs -sDEVICE=%s -r30 -dBATCH -dNOPAUSE -dSAFER -dPARANOIDSAFER -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dMaxBitmap=50000000 -sOutputFile=%s%%d -q %s" % + (gs_device, nom_png, escaped_path_ps_file), + nom_rep, + error_msg % "png") + # Récupère la liste des fichiers list_filepng=os.listdir(nom_rep) - # Calcule le nombre de pixel de couleur - remplissage = [0, 0, 0, 0, 0] # C, M, J, N, nombre de pages + # Calcule le nombre de pixel + remplissage = [0] * (nb_composante + 1) # couleurs (N ou CMJN), nombre de pages for fichier in list_filepng: - resultats = commands.getoutput("nice -n 5 /usr/scripts/impression/percentcolour %s/%s" % (nom_rep, fichier)) + resultats = commands.getoutput("nice -n 5 /usr/scripts/impression/%s %s/%s" % (percent_program, nom_rep, fichier)) l_resultats = resultats.split(":") - for i in [0, 1, 2, 3]: - remplissage[i] += float(l_resultats[i])*float(l_resultats[4]) - remplissage[4] += float(l_resultats[4]) + for i in range(nb_composante): + remplissage[i] += float(l_resultats[i])*float(l_resultats[nb_composante]) + remplissage[nb_composante] += float(l_resultats[nb_composante]) # suppression des fichiers temporaires shutil.rmtree(nom_rep) - - total_noir = remplissage[3] - total_couleur = sum(remplissage[0:3]) - faces = int(remplissage[4]) + + total_noir = remplissage[nb_composante-1] + total_couleur = sum(remplissage[0:nb_composante-1]) + faces = int(remplissage[nb_composante]) if total_couleur > 0: - c_total = ( (COUT_PASSAGE_TAMBOUR_COULEUR + COUT_PASSAGE_TAMBOUR_NOIR) * faces # passage dans les toners - + COUT_UNITE_NOIRE * total_noir # cout encre noire - + COUT_UNITE_COULEUR * total_couleur # cout encre couleur - ) + c_total = ((COUT_PASSAGE_TAMBOUR_COULEUR + COUT_PASSAGE_TAMBOUR_NOIR) * faces # passage dans les toners + + COUT_UNITE_NOIRE * total_noir # cout encre noire + + COUT_UNITE_COULEUR * total_couleur) # cout encre couleur else: # Pas de couleur, malgre l'indication c_total = (COUT_PASSAGE_TAMBOUR_NOIR * faces # passage dans les toners - + COUT_UNITE_NOIRE * total_noir # cout encre noire - ) + + COUT_UNITE_NOIRE * total_noir) # cout encre noire + return (float(c_total)/100, faces) - +# ########################################################### # +# PRIX COULEURS # +# ########################################################### # +# +# Clacul le prix d'une impression couleur +# +def base_prix_couleurs(path_pdf_file): + """ + Clacul le prix d'une impression couleur sur papier A4 pour le fichier path_pdf_file + """ + return base_prix(path_pdf_file, color=True) # ########################################################### # # PRIX N&B # # ########################################################### # -# +# # calcul le prix d'une impression en noir et blanc # -def base_prix_nb(path_fichier_pdf): +def base_prix_nb(path_pdf_file): """ - Clacul le prix d'une impression noire et blanc sur papier A4 pour le fichier path_fichier_pdf + Clacul le prix d'une impression noire et blanc sur papier A4 pour le fichier path_pdf_file """ - # nom_rep seras le dossier dans tmp ou tous les fichier créé par - # convert seront entreposé - - nom_rep = tempfile.mkdtemp(prefix='tmpimpr') - nom_png = "%s/convert.png" % nom_rep # Nom prefixe et chemin des png créé par convert - - # Convertit les pdf en png - (status, rep) = commands.getstatusoutput("nice -n 5 gs -sDEVICE=pnggray -r30 -dBATCH -dNOPAUSE -dSAFER -dPARANOIDSAFER -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dMaxBitmap=50000000 -sOutputFile=%s%%d -q %s" % (nom_png, escapeForShell( path_fichier_pdf ) )) - if status: - # suppression des fichiers temporaires - shutil.rmtree(nom_rep) - raise ValueError("ERREUR : Fichier invalide. Aucun png n'a ete cree.\n") - - #récupère la liste des fichiers - list_filepng=os.listdir(nom_rep) - - remplissage = [0, 0] # Noir, nombre de pages - for fichier in list_filepng: - resultats = commands.getoutput("nice -n 5 /usr/scripts/impression/percentblack '%s/%s'" % (nom_rep, fichier)) - l_resultats = resultats.split(":") - remplissage[0] += float(l_resultats[0])*float(l_resultats[1]) - remplissage[1] += float(l_resultats[1]) - - # suppression des fichiers temporaires - shutil.rmtree(nom_rep) - - total_noir = remplissage[0] - faces = int(remplissage[1]) - - c_total = (COUT_PASSAGE_TAMBOUR_NOIR * faces # passage dans les toners - + COUT_UNITE_NOIRE * total_noir # cout encre noire - ) - - return (float(c_total)/100, faces) + return base_prix(path_pdf_file, color=False)