# -*- coding: utf-8 -*- GlobalPVersion='2.03' # aide : http://www.reportlab.com/docs/userguide.pdf import os,time,sys import reportlab.lib.pagesizes #import letter, A4, A3, A2 import reportlab.pdfgen.canvas #import canvas import reportlab.lib.units #import inch,cm,mm import PIL #Image import cStringIO #print help(reportlab.pdfgen.canvas.Canvas) #sys.exit() class pxpdf(object): ccm=reportlab.lib.units.cm def __init__(self, fichier='C:\\pxtest.pdf', pagesize='A4', compression=0, orientation=None): self.fichier=fichier if pagesize=='A4': self.page=reportlab.pdfgen.canvas.Canvas(fichier, pagesize=reportlab.lib.pagesizes.A4, pageCompression=compression) if pagesize=='A3': self.page=reportlab.pdfgen.canvas.Canvas(fichier, pagesize=reportlab.lib.pagesizes.A3, pageCompression=compression) if pagesize=='A2': self.page=reportlab.pdfgen.canvas.Canvas(fichier, pagesize=reportlab.lib.pagesizes.A2, pageCompression=compression) if pagesize=='letter': self.page=reportlab.pdfgen.canvas.Canvas(fichier, pagesize=reportlab.lib.pagesizes.letter, pageCompression=compression) self.largeur=self.page._pagesize[0]/self.ccm self.hauteur=self.page._pagesize[1]/self.ccm self.fonts=[] for f in self.page.getAvailableFonts(): self.fonts.append(f) self.fontname="Helvetica" self.fontsize=10 #self.setfont('Comic Sans MS',10,'comic.ttf') #self.setfont('Comic Sans MS Bold',10,'comicbd.ttf') self.setfont("Helvetica", 10) #print dir(self.page) #print help(self.page.drawText) self.orientation="PORTRAIT" if orientation: self.porientation(orientation) # (re)-définit la position du début self.page.translate(0,0) #reportlab.lib.units.mm,reportlab.lib.units.inch) self.colorinterior=(1,1,1) self.colorline=(0,0,0) self.groupx={} self.groupy={} self.groupnblig={} self.groupnumlig={} self.groupbreak={} self.groupligbreak={} def test(self): #+++ """ import reportlab.pdfbase import reportlab.pdfbase.ttfonts reportlab.pdfbase.pdfmetrics.registerFont(reportlab.pdfbase.ttfonts.TTFont('Comic Sans MS', 'comic.ttf')) """ import reportlab.rl_config reportlab.rl_config.warnOnMissingFontGlyphs = 0 import reportlab.pdfbase import reportlab.pdfbase.ttfonts reportlab.pdfbase.pdfmetrics.registerFont(reportlab.pdfbase.ttfonts.TTFont('Comic Sans MS', 'comic.ttf')) def cm(self,val): if val: rval=val*self.ccm else: rval=0 return rval def cmx(self,val): if val: if self.orientation=="PAYSAGE": rval=(val-self.hauteur)*self.ccm else: rval=val*self.ccm else: rval=0 return rval def cmy(self,val): if val: if self.orientation=="PAYSAGE": rval=(self.largeur-val)*self.ccm else: rval=(self.hauteur-val)*self.ccm else: rval=0 return rval def anticm(self,val): if val: rval=val/self.ccm else: rval=0 return rval def setauthorsubjecttitle(self,a=None,s=None,t=None): if a: self.page.setAuthor(a) if s: self.page.setSubject(s) if t: self.page.setTitle(t) def setcolorrgb(self, interior=None, line=None, text=None): # met les couleurs de fond et d'écriture # Attn : text = line if interior: self.colorinterior=interior self.page.setFillColorRGB(*interior) else: self.page.setFillColorRGB(*self.colorinterior) if line: self.colorline=line self.page.setStrokeColorRGB(*line) else: if not text: self.page.setStrokeColorRGB(*self.colorline) if text: self.page.setFillColorRGB(*text) def setfont(self, font="Helvetica", size=10, fontfile=''): # définit la police de caractères (nom, taille) if not font in self.fonts: import reportlab.rl_config reportlab.rl_config.warnOnMissingFontGlyphs = 0 import reportlab.pdfbase import reportlab.pdfbase.ttfonts reportlab.pdfbase.pdfmetrics.registerFont(reportlab.pdfbase.ttfonts.TTFont(font, fontfile)) self.fonts.append(font) if self.fontname!=font or self.fontsize!=size: self.page.setFont(font, size) self.fontname=font self.fontsize=size def text(self, txt="Texte d'essai.", x=0, y=0): #imprime un texte aligné à gauche xx=self.cmx(x) yy=self.cmy(y) self.page.drawString(self.cmx(x), self.cmy(y), txt) def paragraf(self, txt='', x=0, y=0): #print dir(self.page) textobj = self.page.beginText() #print dir(textobj) #print help(textobj.setCharSpace) #print help(textobj.setTextRenderMode) #print help(textobj.setTextTransform) #print help(textobj.setWordSpace) #print help(textobj.setCharSpace) textobj.setTextOrigin(self.cmx(x), self.cmy(y)) #textobj.setFont("Helvetica-Oblique", 12) #textobj.setFillGray(0.25) #textobj.setHorizScale(133) textobj.textLines(txt) self.page.drawText(textobj) def rtext(self, txt="Texte d'essai.", x=0, y=0): #imprime un texte aligné à droite self.page.drawRightString(self.cmx(x), self.cmy(y), txt) def ctext(self, txt="Texte d'essai.", x=0, y=0): #imprime un texte centré self.page.drawCentredString(self.cmx(x), self.cmy(y), txt) def pivottext(self, txt="Texte d'essai.", x=0, y=0, pivotchar='.'): #imprime un texte aligné sur le 1er caractère pivot self.page.drawAlignedString(self.cmx(x), self.cmy(y), txt, pivotchar) def gettextwidth(self, txt="Texte d'essai.", fontname=None, fontsize=None): # retourne la largeur d'un texte if fontname: fn=fontname else: fn=self.fontname if fontsize: fs=fontsize else: fs=self.fontsize return self.anticm(self.page.stringWidth(txt, fn, fs)) def linewidth(self,l=None): # définit l'épaisseur de ligne en cm self.page.setLineWidth(self.cm(l)) def line(self,x=0,y=0,xend=4,yend=4): # imprime une ligne self.page.line(self.cmx(x),self.cmy(y),self.cmx(xend),self.cmy(yend)) def dashline(self, x=0, y=0, xend=4, yend=4, pointin=3, pointout=6): # imprime une ligne en pointillé self.page.setDash(pointin, pointout) self.page.line(self.cmx(x),self.cmy(y),self.cmx(xend),self.cmy(yend)) self.page.setDash(1,0) def rectangle(self, x=0, y=0, width=4, height=4, fill=1): # rectangle self.page.rect(self.cmx(x),self.cmy(y),self.cm(width),self.cm(height),fill=fill) def rrectangle(self, x=0, y=0, width=4, height=4, radius=1, fill=1): # rectangle arrondi self.page.roundRect(self.cmx(x),self.cmy(y),self.cm(width),self.cm(height),self.cm(radius),fill=fill) def circle(self, x=0, y=0, r=10, stroke=1, fill=0): # trace un cercle self.page.circle(self.cmx(x),self.cmy(y),self.cm(r), stroke, fill) def image(self, image_file, x=0, y=0, width=None, height=None, mask=None): # trace une image ; attn : aligné sur coin bas gauche de l'image img = PIL.Image.open(image_file) self.page.drawInlineImage(img, self.cmx(x),self.cmy(y),self.cm(width), self.cm(height)) def writepage(self): # imprime le nunéro de page, en bas à  droite self.setcolorrgb(text=(0.3,0.3,0.3)) self.setfont(font="Helvetica", size=10) strpage="Page: "+str(self.getpagenumber()) largtxt=self.gettextwidth(strpage, fontname="Helvetica", fontsize=10) self.text(strpage, self.largeur-largtxt-0.25, self.hauteur-0.15) self.setfont(self.fontname, self.fontsize) def porientation(self, choix=None): # Si pas de paramètre, retourne l'orientation de page courante # Si paramètre 'PORTRAIT' ou 'PAYSAGE' ou 'LANDSCAPE', effectue la rotation if choix is None: return self.orientation if choix.upper()=='PORTRAIT' or choix.upper()=='PAYSAGE' or choix.upper()=='LANDSCAPE' : if choix.upper()=='PORTRAIT' : if self.orientation!='PORTRAIT' : self.page.setPageRotation(90.0) self.orientation='PORTRAIT' else: if self.orientation=='PORTRAIT' : self.page.setPageRotation(-90.0) self.rotate(270) self.orientation=choix.upper() return self.orientation def rotate(self, angle=90): # effectue une rotation (du papier) # ATTN : le système de coordonnées X,Y est également tourné self.page.rotate(angle) def setpagesize(self, x=21,y=29.7): # met les dimensions d'une page self.page.setPageSize((x*self.ccm,y*self.ccm)) self.largeur=self.page._pagesize[0]/self.ccm self.hauteur=self.page._pagesize[1]/self.ccm def getpagesize(self): # retourne la taille de la page courante return self.largeur,self.hauteur def getpagenumber(self): # retourne le numéro de la page courante return self.page.getPageNumber() def save(self): # écrit le fichier .pdf self.page.save() time.sleep(0.2) def finalize(self): # termine une page (et tient une nouvelle page prête) self.page.showPage() import time time.sleep(0.25) def show(self): # affiche le fichier .pdf avec le lecteure PDF par défaut. if sys.platform.upper().startswith("WIN"): if self.fichier[1]==':': os.startfile(self.fichier) else: os.startfile(os.getcwd()+'\\'+self.fichier) else: if self.fichier[1]==':': os.system('xdg-open ' + self.fichier) else: os.system('xdg-open ' + os.getcwd()+'/'+self.fichier) def sumatraprint(self): # imprime une fichier avec SumatraPDF (qui doit être installé) import _winreg a,c,b = _winreg.EnumValue(_winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, 'Applications\SumatraPDF.exe\shell\open\command'), 0) d=c.split('"')[1] commande='''start "" "'''+d+'''" -exit-on-print -print-to-default ''' #commande='''start "" "D:\\DivProg\\PDF\\SumatraPDF\\SumatraPDF.exe" -exit-on-print -print-to-default ''' if self.fichier[1]==':': commande += self.fichier else: commande += os.getcwd()+'\\'+self.fichier os.system(commande) """ noir black (0,0,0) rouge red (1,0,0) vert green (0,1,0) bleu blue (0,0,1) jaune yellow (1,1,0) cyan cyan (0,1,1) magenta magenta (1,0,1) blanc white (1,1,1) gris grey (0.5,0.5,0.5) vert_foncé dark_green (0,0.5,0) """ def newlinedata(self, lig, *data): lig.emptydata() lig.setdata(*data) self.ligne(lig) def setgroupe(self, num=0, breaks=((0,1,1),(4,1,5),(9,-1,-1))): # # les breaks : une liste des ruptures, avec 3 éléments : # numéro dernière ligne avant rupture # nouveau x (si -1 nouvelle page) # nouveau y # self.groupnumlig[num]=0 self.groupbreak[num]=breaks self.groupligbreak[num]=[] for i in self.groupbreak[num]: self.groupligbreak[num].append(i[0]) self.groupx[num]=self.groupbreak[num][0][1] self.groupy[num]=self.groupbreak[num][0][2] def ligne(self,lig): # imprime une ligne #bufferise les couleurs avant traitement de la ligne buffcouleurtext=self.colorline #(couleur du texte) buffcouleurfond=self.colorinterior #(couleur du fond/remplissage) #gestion des "sauts" du groupe de lignes group=lig.groupe nlig=self.groupnumlig[group]+1 if nlig in self.groupligbreak[group]: idx=self.groupligbreak[group].index(nlig) if self.groupbreak[group][idx][1]<0: idx=0 nlig=1 self.groupnumlig[group]=0 self.groupx[group]=self.groupbreak[group][idx][1] self.groupy[group]=self.groupbreak[group][idx][2] self.finalize() else: self.groupx[group]=self.groupbreak[group][idx][1] self.groupy[group]=self.groupbreak[group][idx][2] #calcul de l'ajout x,y au positionnement de la ligne xaj=self.groupx[group] yaj=self.groupy[group]+lig.hauteur*self.groupnumlig[group] #couleur de fond tcolor=None if lig.modulofond>0: self.linewidth(0) colnum = nlig%(lig.modulofond) tcolor=lig.fondcolor[colnum] if tcolor: self.setcolorrgb(interior = tcolor) self.rectangle(xaj,yaj, lig.largeur,lig.hauteur, 1) # restauration des couleurs self.setcolorrgb(interior=buffcouleurfond, line=buffcouleurtext) def ch_void(ch_nom, ch_format, ch_x, ch_y, ch_color, ch_font, ch_size, ch_valeur): return ch_valeur #traitement des données de la ligne self.setcolorrgb(text=(0,0,0)) for i in range(len(lig.data)): bufferChampFontName=self.fontname bufferChampFontSize=self.fontsize #détermination des paramètres du champ ch_nom=lig.noms[i] ch_format=lig.format[i] ch_x=lig.x[i] ch_y=lig.y[i] ch_color=lig.colors[i] ch_font=lig.fonts[i] ch_size=lig.sizes[i] ch_valeur=lig.data[i] #callback avant traitement de la valeur if lig.callbacks[i]: ch_nom, ch_format, ch_x, ch_y, ch_color, ch_font, ch_size, ch_valeur=lig.callbacks[i](ch_nom, ch_format, ch_x, ch_y, ch_color, ch_font, ch_size, ch_valeur) #traitement des paramètres du champ ch_valeur=str(ch_valeur) if ch_font: self.setfont(ch_font, ch_size) if ch_color: self.setcolorrgb(text = ch_color) else: self.setcolorrgb(text = (0,0,0)) x=ch_x+xaj y=ch_y+yaj if ch_format.upper()=='R': self.rtext(ch_valeur,x,y-lig.afterbase) if ch_format.upper()=='L': self.text(ch_valeur,x,y-lig.afterbase) if ch_format.upper()=='C': self.ctext(ch_valeur,x,y-lig.afterbase) if ch_format.upper()=='P': self.pivottext(ch_valeur,x,y-lig.afterbase) #restauration après traitement du champ self.setcolorrgb(line=buffcouleurtext) if bufferChampFontName!=self.fontname or bufferChampFontSize!=self.fontsize: self.setfont(bufferChampFontName, bufferChampFontSize) #préparation du traitement des lines de la ligne self.linewidth(lig.linewidth) self.setcolorrgb(line=lig.linecolor) #traitement des hline de la ligne (lignes verticales de plein hauteur) for lx in lig.hline: self.line(xaj+lx,yaj-lig.hauteur-lig.linewidth, xaj+lx,yaj+lig.linewidth) #traitement des lines autour de la ligne if lig.lineprior: self.line(xaj,yaj-lig.hauteur, xaj+lig.largeur,yaj-lig.hauteur) if lig.lineafter: self.line(xaj,yaj, xaj+lig.largeur,yaj) if lig.lineleft: self.line(xaj,yaj-lig.hauteur-lig.linewidth, xaj,yaj+lig.linewidth) if lig.lineright: self.line(xaj+lig.largeur,yaj-lig.hauteur-lig.linewidth, xaj+lig.largeur,yaj+lig.linewidth) # restauration des couleurs self.setcolorrgb(interior=buffcouleurfond, line=buffcouleurtext) #mise à jour à ligne dans la page self.groupnumlig[group]=nlig class _pligne(object): def __init__(self, parent): self.parent=parent self.groupe=0 self.noms=[] self.formats=[] self.x=[] self.y=[] self.colors=[] self.fonts=[] self.sizes=[] self.callbacks=[] self.hline=[] self.nbchamps=0 self.cadrechamp=[] self.data=[] self.fondcolor={} self.modulofond=0 self.loadmodel() def loadmodel(self, model='DEFAULT'): if model=='DEFAULT': self.largeur=19 #en cm self.hauteur=0.5 #en cm (hauteur TOTALE) self.lineprior=True self.lineafter=True self.afterbase=0.1 #en décution de la hauteur totale self.lineleft=True self.lineright=True self.linewidth=0.01 self.linecolor=(0.5,0.5,0.5) self.fondcolor[0]=(0.9,1,1) self.fondcolor[1]=(1,1,0.8) self.fondcolor[2]=(1,1,1) self.modulofond=len(self.fondcolor) def setdata(self, *data): self.data.extend(data) if len(self.data)>self.nbchamps: self.nbchamps=len(self.data) def emptydata(self, *data): self.data=[] def newlinedata(self, *data): self.data=[] self.data=data if len(self.data)>self.nbchamps: self.nbchamps=len(self.data) self.parent.ligne(self) def defliste(self, lch): noms,formats,xs,ys,colors,fonts,sizes,callbacks=([],[],[],[],[],[],[],[]) for c in lch: noms.append(c[0]) formats.append(c[1]) xs.append(c[2]) if len(c)>3: ys.append(c[3]) else: ys.append(0) if len(c)>4: colors.append(c[4]) else: colors.append(None) if len(c)>5: fonts.append(c[5]) else: fonts.append(None) if len(c)>6: sizes.append(c[6]) else: sizes.append(None) if len(c)>7: callbacks.append(c[7]) else: callbacks.append(None) self.noms=noms self.format=formats self.x=xs self.y=ys self.colors=colors self.fonts=fonts self.sizes=sizes self.callbacks=callbacks def pligne(self): """ Définit une ligne. Les propriétés sont les suivantes : largeur=19 #largeur totale de la ligne en cm hauteur=0.5 #hauteur totale de en cm lineprior=True #tracé d'une ligne horizontale avant (au-dessus) la ligne lineafter=True #tracé d'une ligne horizontale après (en-dessous) la ligne afterbase=0.1 # différence entre la ligne de base (du texte), et le bas de la ligne ; vient en déduction de la hauteur totale lineleft=True #tracé d'une ligne verticale au bord gauche de la ligne lineright=True #tracé d'une ligne verticale au bord droit de la ligne linewidth=0.01 #épaisseur des lignes avant, après, gauche, droite linecolor=(0.5,0.5,0.5) #couleur des lignes avant, après, gauche, droite fondcolor[0]=(0.9,1,1) #1er fond de couleur des lignes fondcolor[1]=(1,1,0.8) #2ème fond de couleur des lignes fondcolor[2]=(1,1,1) #3ème fond de couleur des lignes """ parent=self v=self._pligne(parent) return v if __name__=="__main__": """ page=pxpdf(fichier='pxtest.pdf',pagesize='A4', compression=0) page.setgroupe() page.setfont('Comic Sans MS',11,'comic.ttf') page.setfont('Comic Sans MS Bold',11,'comicbd.ttf') page.setfont('Helvetica',10) lig=page.pligne() # 1ère méthode de définition #lig.format=['R','L','P'] #lig.x=[1,2,9] # 2ème méthode de définition champs=[ # nom, format, x, [y, couleur, fonte, taille], ['code', 'R', 1], ['descriptif', 'L', 2, 0, (0.2,0.2,1), 'Comic Sans MS Bold', 9], #['descriptif', 'L', 2, 0, "Helvetica Oblique", 12], ['valeur', 'P', 9, 0, (0,0,0), "Helvetica", 9], ] lig.defliste(champs) #page.setfont('Comic', size=12) #page.text("AAAAAAAAAAAAIIIIIIIIIIII",3,4) # liste des séparateurs verticaux lig.hline=[1.5,7.4,10.2] lig.emptydata() lig.setdata(111,"AAAAA aaa",111111.11) page.ligne(lig) lig.emptydata() lig.setdata(123,"Descriptif") lig.setdata(112233.44) page.ligne(lig) for i in range(10,130,10): lig.emptydata() lig.setdata(str(i),"aaaaE âäÄ€ ",1234) page.ligne(lig) page.writepage() page.finalize() page.save() page.show() """ """ page=pxpdf(fichier='pxtest.pdf',pagesize='A4', compression=0) page.setgroupe() page.setfont(size=10) page.text("AAAAAAAAAAAAIIIIIIIIIIII",2,2) memo='''aaaaa\r\nbbbbbbb ccccccccc ddddddddd eeeee gdsucgudycg duyg cdyuc gudzgf zdc gfytdcf zdytcf zdytcf zdytcf ztdycf zdytcf dzytc fzdytcf ydztcf tzdyc fydtzc fdzt yc fzydtf cdytf cytd ftycf dzy ug ug ugu g u guyg. fffffff gggggggggggggggg . aaaaa-bbb-ccc. ''' page.paragraf(memo, 4, 4) page.writepage() page.finalize() page.save() page.show() """ """ #print '\r\n'*5 page=pxpdf(fichier='pxtest.pdf',pagesize='A4', compression=0) print page.getpagesize() page.setpagesize(21,29.7) print page.getpagesize() page.setauthorsubjecttitle('AAAA','SSSSSS','TTTTTT') #page.orientation() page.text(u"Bonjour, Ponx ! çéèëê€",11,3) page.setcolorrgb(interior=(0.5,1,1),line=(0,0,1)) page.linewidth(0.4) page.rectangle(9,9,10,2,1) page.circle(6, 6, r=2) if os.path.isfile('vodka.jpg'): page.image('vodka.jpg', x=2, y=28) page.setcolorrgb(line=(1,0,0)) page.line(4,4,18,28) page.rotate(90) page.setcolorrgb(text=(0,0.5,0)) page.setfont(size=18) page.text("Vive Ponx ! ",12,-14) page.rotate(-90) page.writepage() page.finalize() #page.save() #page.show() #print '\r\n'*5 #page=pxpdf(fichier='pxtest.pdf',pagesize='A4') page.setfont(size=18) page.text(u"----------",x=0,y=0.2) page.text(u"----------",x=0,y=15) page.text(u"----------",x=0,y=29.5) page.linewidth(0.03) page.setcolorrgb(line=(0.5,0.5,0)) page.line(6,3, 6,10) page.setcolorrgb(line=(0.5,0.5,0.5)) page.dashline(3,3, 3,10, 3,5) page.setcolorrgb(text=(0,0,0)) page.text("ABCDE", 3, 5) page.rtext("ABCDE", 3, 6) page.ctext("ABCDE", 3, 7) page.pivottext("123456.789", 3, 8) print page.getpagenumber() page.rrectangle(10,8,10,2,1,0) page.writepage() #page.setfont('Comic Sans MS',11,'comic.ttf') #page.setfont('Comic Sans MS Bold',11,'comicbd.ttf') page.setfont('Helvetica',10) lig=page.pligne() lig.largeur=10 page.setgroupe( breaks=((0,6,18),(20,-1,-1)) ) champs=[ # nom, format, x, [y, couleur, fonte, taille], ['code', 'R', 1], #['descriptif', 'L', 2, 0, (0.2,0.2,1), 'Comic Sans MS Bold', 9], ['descriptif', 'L', 2, 0, (0.2,0.2,1)], ['valeur', 'P', 9, 0, (0,0,0), "Helvetica", 9], ] lig.defliste(champs) # liste des séparateurs verticaux lig.hline=[1.5,7.4] lig.emptydata() lig.setdata(111,"AAAAA aaa",111111.11) page.ligne(lig) lig.emptydata() lig.setdata(123,"Descriptif") lig.setdata(112233.44) page.ligne(lig) for i in range(10,140,10): lig.emptydata() lig.setdata(str(i),"Plusieur lignes à‚éèêë€ç@",1234) page.ligne(lig) page.setfont('Helvetica-Bold',24) page.setcolorrgb(text=(1,0,0)) page.rotate(45) page.text("Texte incliné", 18, 26) page.finalize() page.save() page.show() """ # ATRIR page=pxpdf(fichier='pxtest.pdf',pagesize='A4', compression=0) page.setpagesize(21,29.7) page.setauthorsubjecttitle('ATRIR','Archives','Liste alphabétique') page.setfont('Helvetica',10) lig=page.pligne() lig.largeur=19.2 page.setgroupe( breaks=((0,1,1),(58,-1,-1)) ) champs=[ # nom, format, x, [y, couleur, fonte, taille], ['Nom + prénom', 'L', 0.3], ['Naissance', 'L', 10], ['Num', 'L', 12.5], ['Geo', 'L', 13.8], ['Der.Visite', 'L', 15], ['Lieu', 'L', 17.5], ['dc', 'L', 18.6], ] lig.defliste(champs) # liste des séparateurs verticaux lig.hline=[10,12.5,13.8,15,17.5,18.6] for i in range(len(lig.hline)): lig.hline[i]=lig.hline[i]-0.2 lig.emptydata() lig.setdata("Nom+prénom","Naissance","Num","Geo","Der.Visite","Lieu","dc") page.ligne(lig) for i in range(10,1840,10): lig.emptydata() lig.setdata("AAAAAAAA Bbbbbbbbbbb","11.03.1955",str(i),"CLI","01.01.2009","L","N") page.ligne(lig) page.setfont('Helvetica-Bold',24) page.setcolorrgb(text=(1,0,0)) page.finalize() page.save() page.show()