From b5990eaa477c8e6bd35831bb416cd64596b65d33 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Tue, 14 Apr 2015 00:00:45 +0200 Subject: [PATCH] Ecriture d'un backend cups pdf-> pcl avec options --- impression/filter_hp.py | 122 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100755 impression/filter_hp.py diff --git a/impression/filter_hp.py b/impression/filter_hp.py new file mode 100755 index 00000000..94a12567 --- /dev/null +++ b/impression/filter_hp.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import subprocess +import sys + +DEFAULT_BAC = 7 + +# Commande ghostscript de conversion en PCL +params = ['gs', '-dNOPAUSE', '-dBATCH', '-sDEVICE=pxlmono', + #'-sPAPERSIZE=A4', + '-dDuplex=true', + '-dMediaPosition=%d' % DEFAULT_BAC, + '-sOutputFile=%stdout%', + '-sstdout=/dev/null', + '-f', # To be continued +] + +def tweak(source, dest, **opt_): + """Tweak un fichier pcl (source est un descripteur de fichier en lecture) + en rajoutant les options PJL nécessaires, et en modifiant le PCL + pour que les deux premières pages (première feuille) soient prises depuis + un autre bac""" + raw = False + opt = { + # Nombre de pages depuis le début à piocher depuis bac séparé + 'manual_feed_count': 0, + 'copies': 1, + 'finish': 'STAPLE', + #'hold': 'STORE', + 'hold': 'OFF', + 'jobname': 'None', + 'staple': 'NONE', + 'hole': 'NONE', + } + opt.update(opt_) + while not raw: + l = source.readline() + if l.startswith('@PJL ENTER LANGUAGE'): + raw = True # Derniere ligne avant les trucs degueux + dest.write("""@PJL SET JOBNAME = "%(jobname)s" +@PJL SET HOLD = "%(hold)s" +@PJL SET QTY = %(copies)d +@PJL SET PROCESSINGACTION=APPEND +@PJL SET PROCESSINGTYPE="STAPLING" +@PJL SET PROCESSINGOPTION="%(staple)s" +@PJL SET PROCESSINGBOUNDARY=MOPY +@PJL SET PROCESSINGTYPE="PUNCH" +@PJL SET PROCESSINGOPTION="%(hole)s" +@PJL SET PROCESSINGBOUNDARY=MOPY +""" % opt) + dest.write(l) + + # Entrée manuelle sur les n premières pages. On remplace n fois + s_string = '\xf8\x25\xc0' + chr(DEFAULT_BAC) + r_string = '\xf8\x25\xc0\x01' + count = opt['manual_feed_count'] + # + while True: + x = source.read(102400) + #print "Read 100ko" + #sys.stdout.flush() + if not x: + return + while count: + y = x.replace(s_string, r_string, 1) + if x != y: + x = y + count -= 1 + else: + break + dest.write(x) + +if __name__ == '__main__': + + opt = {} + try: + opt['jobname'] = sys.argv[3] + except ValueError: + pass + +# Pour le nombre de copies + + opt['copies'] = int(sys.argv[4]) + +# Pour les agraphes et les trous + + optns = sys.argv[5].split() + for options in optns: + option = options.split("=") + if option[0]=="HPPunchingOptions": + if option[1]=="2HolePunchLeft": + opt['hole']= "LEFT_2PT_DIN" + elif option[1]=="2HolePunchRight": + opt['hole']= "RIGHT_2PT_DIN" + elif option[1]=="2HolePunchTop": + opt['hole']= "TOP_2PT_DIN" + elif option[1]=="2HolePunchBottom": + opt['hole']= "BT_2PT_DIN" + elif option[1]=="4HolePunchLeft": + opt['hole']= "LEFT_4PT_DIN" + elif option[1]=="4HolePunchRight": + opt['hole']= "RIGHT_4PT_DIN" + if option[0]=="HPStaplerOptions": + if option[1]=="TopLeft": + opt['staple']= "LEFT_1PT_ANGLED" + elif option[1]=="TopRight": + opt['staple']= "RIGHT_1PT_ANGLED" + elif option[1]=="Left": + opt['staple']= "LEFT_2PT" + elif option[1]=="Right": + opt['staple']= "RIGHT_2PT" + + + + fname = '-' + proc = subprocess.Popen(params + [fname], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + stdin=sys.stdin) + tweak(proc.stdout, sys.stdout, **opt) +