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:
parent
ac10da5dad
commit
97779609f1
1 changed files with 96 additions and 92 deletions
|
@ -28,7 +28,7 @@
|
||||||
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
|
||||||
|
@ -62,59 +62,96 @@ 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 #
|
||||||
|
# ########################################################### #
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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/%s %s/%s" % (percent_program, nom_rep, fichier))
|
||||||
|
l_resultats = resultats.split(":")
|
||||||
|
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[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
|
||||||
|
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
|
||||||
|
|
||||||
|
return (float(c_total)/100, faces)
|
||||||
|
|
||||||
# ########################################################### #
|
# ########################################################### #
|
||||||
# PRIX COULEURS #
|
# PRIX COULEURS #
|
||||||
# ########################################################### #
|
# ########################################################### #
|
||||||
#
|
#
|
||||||
# Clacul le prix d'une impression couleur
|
# Clacul le prix d'une impression couleur
|
||||||
#
|
#
|
||||||
def base_prix_couleurs(path_fichier_pdf):
|
def base_prix_couleurs(path_pdf_file):
|
||||||
"""
|
"""
|
||||||
Clacul le prix d'une impression couleur sur papier A4 pour le fichier path_fichier_pdf
|
Clacul le prix d'une impression couleur 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=True)
|
||||||
# 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
|
|
||||||
|
|
||||||
# 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
|
|
||||||
for fichier in list_filepng:
|
|
||||||
resultats = commands.getoutput("nice -n 5 /usr/scripts/impression/percentcolour %s/%s" % (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])
|
|
||||||
|
|
||||||
# suppression des fichiers temporaires
|
|
||||||
shutil.rmtree(nom_rep)
|
|
||||||
|
|
||||||
total_noir = remplissage[3]
|
|
||||||
total_couleur = sum(remplissage[0:3])
|
|
||||||
faces = int(remplissage[4])
|
|
||||||
|
|
||||||
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
|
|
||||||
)
|
|
||||||
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
|
|
||||||
)
|
|
||||||
return (float(c_total)/100, faces)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ########################################################### #
|
# ########################################################### #
|
||||||
# PRIX N&B #
|
# PRIX N&B #
|
||||||
|
@ -122,41 +159,8 @@ def base_prix_couleurs(path_fichier_pdf):
|
||||||
#
|
#
|
||||||
# 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)
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue