162 lines
6.7 KiB
Python
Executable file
162 lines
6.7 KiB
Python
Executable file
#! /usr/bin/env python
|
||
# -*- coding: iso-8859-15 -*-
|
||
# #############################################################
|
||
# ..
|
||
# .... ............ ........
|
||
# . ....... . .... ..
|
||
# . ... .. .. .. .. ..... . ..
|
||
# .. .. ....@@@. .. . ........ .
|
||
# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
|
||
# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
|
||
# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
|
||
# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
|
||
# ...@@@.... @@@ .@@.......... ........ ..... ..
|
||
# . ..@@@@.. . .@@@@. .. ....... . .............
|
||
# . .. .... .. .. . ... ....
|
||
# . . .... ............. .. ...
|
||
# .. .. ... ........ ... ...
|
||
# ................................
|
||
#
|
||
# #############################################################
|
||
"""
|
||
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
|
||
"""
|
||
|
||
import sys, tempfile, os, commands, shutil
|
||
sys.path.append('/usr/scripts/gestion')
|
||
import config
|
||
from crans.utils import QuoteForPOSIX as escapeForShell
|
||
def __init__():
|
||
pass
|
||
|
||
# ########################################################### #
|
||
# CONSTANTES #
|
||
# ########################################################### #
|
||
#
|
||
#
|
||
import config
|
||
COUT_UNITE_COULEUR = config.impression.c_coul
|
||
COUT_UNITE_NOIRE = config.impression.c_noir
|
||
COUT_PASSAGE_TAMBOUR_NOIR = config.impression.c_tambour_noir
|
||
COUT_PASSAGE_TAMBOUR_COULEUR = config.impression.c_tambour_coul
|
||
|
||
# ########################################################### #
|
||
# ERREURS #
|
||
# ########################################################### #
|
||
#
|
||
#
|
||
class FichierInvalide(Exception):
|
||
"""
|
||
Si le fichier est invalide
|
||
"""
|
||
def __str__(self):
|
||
return self.args[0]
|
||
def file(self):
|
||
try:
|
||
return self.args[1]
|
||
except:
|
||
return "n/a"
|
||
# ########################################################### #
|
||
# PRIX COULEURS #
|
||
# ########################################################### #
|
||
#
|
||
# 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
|
||
"""
|
||
# nom_rep seras le dossier dans tmp ou tous les fichier cr<63><72> par
|
||
# convert seront entrepos<6F>
|
||
|
||
nom_rep = tempfile.mkdtemp(prefix='tmpimpr')
|
||
nom_png = "%s/convert.png" % nom_rep # Nom prefixe et chemin des png cr<63><72> 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<75>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 #
|
||
# ########################################################### #
|
||
#
|
||
# calcul le prix d'une impression en noir et blanc
|
||
#
|
||
def base_prix_nb(path_fichier_pdf):
|
||
"""
|
||
Clacul le prix d'une impression noire et blanc sur papier A4 pour le fichier path_fichier_pdf
|
||
"""
|
||
# nom_rep seras le dossier dans tmp ou tous les fichier cr<63><72> par
|
||
# convert seront entrepos<6F>
|
||
|
||
nom_rep = tempfile.mkdtemp(prefix='tmpimpr')
|
||
nom_png = "%s/convert.png" % nom_rep # Nom prefixe et chemin des png cr<63><72> 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<75>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)
|