on converti d'abord les fichiers envoye en ps avant de generer les png

+ factorisation du code de calcul de cout

darcs-hash:20070916003015-7b604-9048fca4e8ca07d37e83ed270090f2f95de0c3cc.gz
This commit is contained in:
dimino 2007-09-16 02:30:15 +02:00
parent ac10da5dad
commit 97779609f1

View file

@ -1,34 +1,34 @@
#! /usr/bin/env python #! /usr/bin/env python
# -*- coding: iso-8859-15 -*- # -*- coding: iso-8859-15 -*-
# ############################################################# # #############################################################
# .. # ..
# .... ............ ........ # .... ............ ........
# . ....... . .... .. # . ....... . .... ..
# . ... .. .. .. .. ..... . .. # . ... .. .. .. .. ..... . ..
# .. .. ....@@@. .. . ........ . # .. .. ....@@@. .. . ........ .
# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. .... # .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... .... # .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. .. # @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. ..... # .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
# ...@@@.... @@@ .@@.......... ........ ..... .. # ...@@@.... @@@ .@@.......... ........ ..... ..
# . ..@@@@.. . .@@@@. .. ....... . ............. # . ..@@@@.. . .@@@@. .. ....... . .............
# . .. .... .. .. . ... .... # . .. .... .. .. . ... ....
# . . .... ............. .. ... # . . .... ............. .. ...
# .. .. ... ........ ... ... # .. .. ... ........ ... ...
# ................................ # ................................
# #
# ############################################################# # #############################################################
""" """
cout.py cout.py
Fonctions pour calculer le prix d'une impression Fonctions pour calculer le prix d'une impression
(ne calcul que le prix de l'encre. (ne calcul que le prix de l'encre.
retourne le prix pour une copie en A4) 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') sys.path.append('/usr/scripts/gestion')
import config import config
from crans.utils import QuoteForPOSIX as escapeForShell from crans.utils import QuoteForPOSIX as escapeForShell
@ -38,7 +38,7 @@ def __init__():
# ########################################################### # # ########################################################### #
# CONSTANTES # # CONSTANTES #
# ########################################################### # # ########################################################### #
# #
# #
import config import config
COUT_UNITE_COULEUR = config.impression.c_coul COUT_UNITE_COULEUR = config.impression.c_coul
@ -49,7 +49,7 @@ COUT_PASSAGE_TAMBOUR_COULEUR = config.impression.c_tambour_coul
# ########################################################### # # ########################################################### #
# ERREURS # # ERREURS #
# ########################################################### # # ########################################################### #
# #
# #
class FichierInvalide(Exception): class FichierInvalide(Exception):
""" """
@ -62,101 +62,105 @@ class FichierInvalide(Exception):
return self.args[1] return self.args[1]
except: except:
return "n/a" 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 #
# ########################################################### # # ########################################################### #
# def base_prix(path_pdf_file, color=False):
# Clacul le prix d'une impression couleur u""" Calcul le prix d'une impression couleur ou noir et blanc sur papier A4 """
#
def base_prix_couleurs(path_fichier_pdf):
"""
Clacul le prix d'une impression couleur sur papier A4 pour le fichier path_fichier_pdf
"""
# nom_rep seras le dossier dans tmp ou tous les fichier créé par # nom_rep seras le dossier dans tmp ou tous les fichier créé par
# convert seront entreposé # convert seront entreposé
nom_rep = tempfile.mkdtemp(prefix='tmpimpr') nom_rep = tempfile.mkdtemp(prefix='tmpimpr')
nom_png = "%s/convert.png" % nom_rep # Nom prefixe et chemin des png créé par convert nom_png = "%s/convert.png" % nom_rep # Nom prefixe et chemin des png créé par convert
escaped_path_pdf_file = escapeForShell(path_pdf_file)
# Convertit les pdf en png couleur escaped_path_ps_file = path_pdf_file + ".ps"
(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))) error_msg = "ERREUR %%d : Fichier invalide. Aucun %s cree."
if status: if color:
# suppression des fichiers temporaires error_msg += " (couleurs)"
shutil.rmtree(nom_rep) gs_device = "png16m"
raise ValueError, "ERREUR %s : Fichier invalide. Aucun png cree. (couleurs)" % status 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 # Récupère la liste des fichiers
list_filepng=os.listdir(nom_rep) list_filepng=os.listdir(nom_rep)
# Calcule le nombre de pixel de couleur # Calcule le nombre de pixel
remplissage = [0, 0, 0, 0, 0] # C, M, J, N, nombre de pages remplissage = [0] * (nb_composante + 1) # couleurs (N ou CMJN), nombre de pages
for fichier in list_filepng: 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(":") l_resultats = resultats.split(":")
for i in [0, 1, 2, 3]: for i in range(nb_composante):
remplissage[i] += float(l_resultats[i])*float(l_resultats[4]) remplissage[i] += float(l_resultats[i])*float(l_resultats[nb_composante])
remplissage[4] += float(l_resultats[4]) remplissage[nb_composante] += float(l_resultats[nb_composante])
# suppression des fichiers temporaires # suppression des fichiers temporaires
shutil.rmtree(nom_rep) shutil.rmtree(nom_rep)
total_noir = remplissage[3] total_noir = remplissage[nb_composante-1]
total_couleur = sum(remplissage[0:3]) total_couleur = sum(remplissage[0:nb_composante-1])
faces = int(remplissage[4]) faces = int(remplissage[nb_composante])
if total_couleur > 0: if total_couleur > 0:
c_total = ( (COUT_PASSAGE_TAMBOUR_COULEUR + COUT_PASSAGE_TAMBOUR_NOIR) * faces # passage dans les toners 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_NOIRE * total_noir # cout encre noire
+ COUT_UNITE_COULEUR * total_couleur # cout encre couleur + COUT_UNITE_COULEUR * total_couleur) # cout encre couleur
)
else: # Pas de couleur, malgre l'indication else: # Pas de couleur, malgre l'indication
c_total = (COUT_PASSAGE_TAMBOUR_NOIR * faces # passage dans les toners 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) 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 # # PRIX N&B #
# ########################################################### # # ########################################################### #
# #
# calcul le prix d'une impression en noir et blanc # 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 return base_prix(path_pdf_file, color=False)
# 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)