Ceci est une ancienne révision du document !
Prenons un exemple: dans le cadre d'un concours, il faut pouvoir informer plusieurs centaines de participants de leurs résultats, et ceci:
Les informations de résultats étant extrait d'une base de données.
La particularité du code proposé ici, c'est que le programme n'imprime pas lui-même: il crée des pages .pdf. Cela permet de vérifier visuellement ce qui va être imprimé, et on laissera le visualiseur pdf utilisé (acrobat reader ou autres) imprimer lui-même.
Ce code est multiplateforme (au moins Windows-Linux)
Afin de permettre l'impression de lettres complexes avec mise en page, tableau, images, (etc…), il a été choisi un format html (comme les pages web). On peut donc construire les courrier avec un éditeur html comme par exemple Kompozer, mais il faut procéder à quelques modifications du code html pour aboutir: voir la construction d'un exemple après le code.
L'impression et l'affichage des étiquettes est présenté sous forme de classe.
La seule donnée à passer à l'instanciation de la classe est:
D'autres données peuvent être modifiées (voir le code auto-documenté).
Voilà le code proposé avec son exemple d'application. Vous pouvez l'essayer avec un simple copier-coller dans idle, mais il vous faut bien sûr le module PyQt4 installé avant. Et c'est écrit en Python 2.7.
#!/usr/bin/python # -*- coding: utf-8 -*- from __future__ import division #Python v2.7 import os, sys from PyQt4 import QtCore, QtGui Apppdf = QtGui.QApplication(sys.argv) ############################################################################# class Lettrepdf(object): """Imprime dans un fichier .pdf et affiche la lettre sous forme html""" # ======================================================================= def __init__(self, lettrehtml): """Initialise les variables nécessaires """ # chaine multiligne à imprimer sur pdf (html présenté en unicode) self.lettrehtml = lettrehtml # Les var. suivantes (modifiables) ont une valeur par défaut # nom du fichier pdf à créer par impression self.nomfichierpdf = u"lettrehtml.pdf" # marges gauche, haute, droite et basse self.margegauche = 20 # mm self.margehaute = 20 # mm self.margedroite = 20 # mm self.margebasse = 20 # mm # nom de l'application qui crée le fichier pdf self.nomapplication = u"" # nom du document pdf créé self.nomdocument = u"" # orientation de la page à imprimer self.orientation = QtGui.QPrinter.Portrait # format de la page à imprimer self.formatpage = QtGui.QPrinter.A4 # mettre le mode de couleur (Color ou GrayScale) self.modecouleur = QtGui.QPrinter.Color # ======================================================================= def imprimepdf(self): """Lance l'impression de la lettre sur fichier pdf """ # création de l'instance printer => fichier etiquettes.pdf printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution) printer.setOutputFileName(self.nomfichierpdf) printer.setCreator(self.nomapplication) printer.setDocName(self.nomdocument) resolution = printer.resolution() # 1200dpi avec 'HighResolution' printer.setPageSize(self.formatpage) printer.setColorMode(self.modecouleur) printer.setOrientation(self.orientation) printer.setFontEmbeddingEnabled(True) printer.setFullPage(False) # nécessaire pour mettre des marges mm2px = lambda mm: int(mm/25.4*resolution) margegauche = mm2px(self.margegauche) margehaute = mm2px(self.margehaute) margedroite = mm2px(self.margedroite) margebasse = mm2px(self.margebasse) printer.setPageMargins(margegauche, margehaute, margedroite, margebasse, QtGui.QPrinter.DevicePixel) doc = QtGui.QTextDocument() doc.setHtml(self.lettrehtml) doc.print_(printer); # ======================================================================= def affichepdf(self): """affiche le pdf créé, dans le visualiseur pdf par défaut de l'OS""" try: # solution pour Windows os.startfile(self.nomfichierpdf) except: try: # solution pour autre (Linux) os.system('xdg-open ' + self.nomfichierpdf) # solution pour autre (Linux) except: # pas de solution: faire à la main! QtGui.QMessageBox.warning(None, u"Affichage du fichier pdf" + self.nomfichierpdf, u"""Désolé, l'afficheur du fichier pdf n'est pas trouvé""")