# -*- coding: utf-8 -*- GlobalPVersion='1.6' """ pximprime est basé sur PrintMG.dll ; cette DLL a été construite par "Martin", qui fréquente les forums d'autoit. Voir : http://www.autoitscript.com/forum/index.php?s=2117bf31ae84b99bcefe3ea3f2982a64&showtopic=51054&view=findpost&p=386214 version 1.6: textright() textcenter() textpivot() modif text() pour gérer Unicode version 1.5: reinit(nb) getpagenumber() SelectPrinter modifié (paramètre False pour définir aussi comme imprimante par défaut) version 1.4: getpaperheight() getpaperwidth() def getpaperheight version 1.3: PrinterBegin Version 1.2: getlistprinters getcurrentprinter sélection de l'imprimante (à l'init) settitre rectanglerounded """ import ctypes class ipage(object): def __init__(self,chooseprinter=None,orientation='portrait',titre='pximprime.py', nb=1): if not(chooseprinter is None): if chooseprinter.upper() in ('CHOIX','CHOICE'): result=ctypes.windll.printmg.SetPrinter() else: result=ctypes.windll.printmg.SelectPrinter(chooseprinter+chr(0),False) # # Orientation ('portrait' ou 'landscape') # WARNING ! ATTENTION ! orientation obligatoirement avant PrinterBegin # if titre!='': result=ctypes.windll.printmg.SetTitle(titre) if orientation.upper()=='LANDSCAPE': result=ctypes.windll.printmg.Portrait(2) else: result=ctypes.windll.printmg.Portrait(1) #result=ctypes.windll.printmg.PrinterBegin(ctypes.c_uint16(nb)) #import ponx #ponx.msginfo(46,nb) self.nb=nb result=ctypes.windll.printmg.PrinterBegin(int(nb)) #nb = nb de copies imprimées def getversion(self): # version de la DLL return ctypes.c_char_p(ctypes.windll.printmg.version()).value def gethorres(self): # résolution horizontale return ctypes.windll.printmg.GetHorRes() def getverres(self): # résolution verticale return ctypes.windll.printmg.GetVertRes() def getpagewidth(self): # largeur page en /10e de mm return ctypes.windll.printmg.GetPageWidth() def getpageheight(self): # hauteur de page en /10e de mm return ctypes.windll.printmg.GetPageHeight() def getpaperwidth(self): # largeur du papier en /10e de mm return ctypes.windll.printmg.GetPaperWidth() def getpaperheight(self): # hauteur du papier en /10e de mm return ctypes.windll.printmg.GetPaperHeight() def gethormarge(self): # marge horizontale en /10e de mm return ctypes.windll.printmg.GetXOffset() def getvermarge(self): # marge verticale en /10e de mm return ctypes.windll.printmg.GetYOffset() def gettextwidth(self,txt): # largeur d'un texte donné en /10e de mm return ctypes.windll.printmg.TextWidth(txt) def gettextheight(self,txt): # hauteur d'un texte donné en /10e de mm return ctypes.windll.printmg.TextHeight(txt) def getlistprinters(self): #lret = ctypes.windll.printmg.ListPrinters() temp = ctypes.c_char_p(ctypes.windll.printmg.ListPrinters()).value return [i for i in temp.split('|') if i!=''] def getcurrentprinter(self): #lret = ctypes.windll.printmg.ListPrinters() return ctypes.c_char_p(ctypes.windll.printmg.GetPrinterName()).value def getpagenumber(self): #retourne le numéro de page courante ; -1 si erreur return ctypes.c_char_p(ctypes.windll.printmg.GetPageNumber()).value def setfont(self,font="comic sans MS",size=10,color=[0,0,0],style=""): # définit la police de caractères (nom, taille, couleur, style) def dlstyle(txt): vret=0 if txt.find("bold")>-1: vret+=1 if txt.find("italic")>-1: vret+=2 if txt.find("underline")>-1: vret+=4 if txt.find("strikeout")>-1: vret+=8 #print "style",vret return vret def rvb(r,v,b): return int(b*256*256+v*256+r) result=ctypes.windll.printmg.SetFont(font,size,rvb(*color),dlstyle(style)) def setlinewidth(self,size=10): # définit la largeur de ligne en /10e de mm result=ctypes.windll.printmg.SetLineWid(size) def setlinecolor(self,color=[250,0,0]): # définit la couleur de ligne def rvb(r,v,b): return int(b*256*256+v*256+r) result=ctypes.windll.printmg.SetLineCol(rvb(*color)) def setbrushcolor(self,color=[250,0,0]): # définit la couloeur de peinture (remplissage) def rvb(r,v,b): return int(b*256*256+v*256+r) result=ctypes.windll.printmg.SetBrushCol(rvb(*color)) def text(self,txt="Texte d'essai.",x=0,y=0,angle=0): #imprime un texte if isinstance(txt,unicode): t=txt.encode('cp1252','replace') #t=txt.encode('utf-8','replace') else: t=txt result=ctypes.windll.printmg.printText(t,x,y,angle) def textright(self,txt="Texte d'essai.",x=0,y=0,angle=0): #imprime un texte aligné à droite (angle toujours à 0) larg=self.gettextwidth(txt) result=self.text(txt,x-larg,y,0) def textcenter(self,txt="Texte d'essai.",x=0,y=0,angle=0): #imprime un texte centré (angle toujours à 0) larg=self.gettextwidth(txt) result=self.text(txt,x-int(larg/2),y,0) def textpivot(self,txt="Texte d'essai.",x=0,y=0,angle=0, pivot='.'): #imprime un texte aligné sur le caractère-pivot (angle toujours à 0) ipivot=txt.find(pivot) if ipivot<0: txt+=pivot ipivot=txt.find(pivot) t1=txt[:ipivot+1] t2=txt[ipivot+1:] larg=self.gettextwidth(t1) self.textright(t1,x,y,0) self.text(t2,x,y,0) def tnumber(self,n=0,x=0,y=0,nbdecimales=2,*bof,**kbof): if abs(n)>0.0005: t="% .*f" % (nbdecimales,n) self.textpivot(t,x,y) def tnumbmillier(self,n=0,x=0,y=0,nbdecimales=2,*bof,**kbof): if abs(n)>0.0005: tmp="% .*f" % (nbdecimales,n) i=tmp.find(".") l=range(i,1,-3) l.reverse() t=tmp[:l[0]]+" " for j in l: t += tmp[j:j+3]+" " t=t.replace(" .",",") self.textpivot(t,x,y,pivot=",") def znumber(self,n=0,x=0,y=0,nbdecimales=2,*bof,**kbof): t="% .*f" % (nbdecimales,n) self.textpivot(t,x,y) def octetsbin(self,txt="Texte d'essai.",x=0,y=0,angle=0): #imprime un texte result=ctypes.windll.printmg.PrintBytesDirect(txt+chr(0),len(txt)) #+++ #$vDllAns = DllCall($hDll, 'int', 'PrintBytesDirect', 'str',$sPrinter, 'ptr', $pData, 'int', $iNum) def line(self,x=0,y=0,xend=200,yend=200): # imprime une ligne result=ctypes.windll.printmg.Line(x,y,xend,yend) def rectangle(self,x=100,y=100,xend=200,yend=200): # imprime un rectangle (plein) result=ctypes.windll.printmg.Rectangle(x,y,xend,yend) def rectanglerounded(self, x=100,y=100, xend=200,yend=200, rx=0,ry=0): # imprime un rectangle (plein) result=ctypes.windll.printmg.RoundedRectangle(x,y,xend,yend,rx,ry) def ellipse(self,x=100,y=100,xend=200,yend=200): # imprime une ellipse (pleine) result=ctypes.windll.printmg.Ellipse(x,y,xend,yend) def pie(self,x=100,y=100,xend=200,yend=200, x1=50,y1=150, x2=150,y2=250): # imprime un secteur d'ellipse (plein) result=ctypes.windll.printmg.Pie(x,y,xend,yend, x1,y1,x2,y2) def arc(self,x=100,y=100,xend=200,yend=200, x1=50,y1=150, x2=150,y2=250): # imprime une arc d'ellipse result=ctypes.windll.printmg.Arc(x,y,xend,yend, x1,y1,x2,y2) def image(self,fichier="D:\\dev\\python\\pluie\\ponx.jpg",x=200,y=400,largeur=300,hauteur=100): # imprime une image (JPG ou BMP seulement) import os.path if os.path.isfile(fichier): result=ctypes.windll.printmg.Image(fichier,x,y,largeur,hauteur) def abort(self): #arrête l'impression #result: 0 OK ; -1 pas d'impression en cours ; -2 impossible d'arrêter result=ctypes.windll.printmg.AbortPrint() def reinit(self, nb=0): #ré-initialisation de l'imprimante ; nb = nb d'exemplaires self.abort() self.imprime() if nb>0: self.nb=nb ctypes.windll.printmg.PrinterBegin(int(self.nb)) def newpage(self): #ajoute (append) une nouvelle page vide result=ctypes.windll.printmg.NewPage() def imprime(self): # envoie la page sur l'imprimante et ferme la page result=ctypes.windll.printmg.PrinterEnd() #ici se termine la classe ipage """ à cf ; àcf : _PrintBytesDirect ImageFromHandle """ def exemple1(): """ p=ipage(chooseprinter=True, orientation='landscape') p.setfont("comic sans MS",18,[255,0,255],"bold") #couleur : R,V,B p.text("Quatrième ligne textuelle.", 140, 600) p.imprime() """ p=ipage() print "version : ",p.getversion() print "res hor (pixels) ",p.gethorres() print "res ver (pixels) ",p.getverres() print "width (10e mm) ",p.getpagewidth() print "height (10e mm) ",p.getpageheight() print "marge hor (10e mm)",p.gethormarge() print "marge ver (10e mm)",p.getvermarge() p.text("Essai de texte", 50, 50) p.text(u"Deuxième ligne", 80, 240) p.text(u"3ème ligne, penchée à 30°", 110, 500, 30) p.setfont("comic sans MS",16,[255,0,255],"bold") #couleur : R,V,B p.text(u"Quatrième ligne textuelle.", 140, 600) print "Largeur de 'ABCDE' (10e mm):",p.gettextwidth('ABCDE') print "Hauteur de 'ABCDE' (10e mm):",p.gettextheight('ABCDE') for i in range(0,360,24): p.setfont("Arial",18,[int(255-(i*255/360)),0,int(i*255/360)],"bold") p.text(" Vive Python ", 1050,1485,i) p.setlinewidth(10) p.setlinecolor([0,255,255]) p.line( 500,900, 500,2030) p.line( 500,2030, 1600,2030) p.line( 500,900, 1600,900) p.line( 1600,900, 1600,2030) p.image('C:\\vodka.jpg',1500,100,200,300) p.setlinewidth(30) p.setlinecolor([255,0,0]) p.setbrushcolor((255,255,0)) p.rectangle(500,2100, 1000,2300) p.ellipse(1100,2100, 1600,2300) p.setlinewidth(20) p.ellipse(1100,500, 1300,700) p.rectangle(1000,600, 1200,800) p.pie(1500,500, 1700,700, 1400,600, 1600,800) p.arc(1800,500, 2000,700, 1700,600, 1900,800) p.newpage() p.text(u"Deuxième page", 200, 400) p.newpage() p.text(u"Trisième page", 200, 400) p.newpage() p.text(u"Quatrième page", 200, 400) p.imprime() """ p=ipage() p.setfont("Arial narrow",12) #couleur : R,V,B p.text("Quatrième ligne textuelle.", 140, 600) """ def exemple2(): #p=ipage(chooseprinter='PDFCreator') p=ipage(titre="Document d'essai",nb=3) print l= p.getlistprinters() for i in l: print i print print 234,p.getcurrentprinter() print p.setbrushcolor((255,255,0)) p.rectangle(500,2100, 1000,2300) p.setbrushcolor((0,255,255)) p.rectanglerounded(400,2000, 800,1600,50,50) print "Taille papier : (en 1/10e de mm)" print p.getpaperheight() print p.getpaperwidth() p.imprime() def exemple3(): #p=ipage(chooseprinter='PDFCreator') p=ipage(titre="L:\\essai",orientation='landscape') #p.setfont("comic sans MS",32,[255,0,32],"bold") #couleur : R,V,B p.setfont("univers Condensed",64,[64,0,0]) #couleur : R,V,B p.text("ABCDE", 200, 250) p.imprime() if __name__=="__main__": pass #exemple1() #exemple2() exemple3()