Ceci est une ancienne révision du document !
Dans le cadre d'un projet écrit en PyQt4, j'avais plusieurs impressions d'étiquettes à faire, et j'ai fini par mettre au point le code suivant.
La particularité, 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)
L'impression et l'affichage des étiquettes est présenté sous forme de classe.
Les principales données à passer à l'instanciation de la classe sont:
par exemple: [u“nom prénom” + os.linesep + u“rue” + os.linesep + u“ville”, …]
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 # ecrit en Python 2.7 import os, sys from PyQt4 import QtCore, QtGui App = QtGui.QApplication(sys.argv) ############################################################################# class Etiquettespdf(object): """Imprime en .pdf et affiche la liste d'étiquettes à imprimer """ # ======================================================================= def __init__(self, etiq, deph, pash, nbeh, depv, pasv, nbev, font=None): """Initialise toutes les variables nécessaires etiq: liste des chaines, éventuellement multilignes (avec os.linesep) deph: point de départ à partir du bord gauche de la feuille (mm) pash: pas horizontal entre 2 étiquettes (mm) nbeh: nombre d'étiquettes en horizontal depv: point de départ à partir du bord supérieur de la feuille (mm) pasv: pas vertical entre 2 étiquettes (mm) nbev: nombre d'étiquettes en vertical font: police de caractères à utiliser (de type QFont) """ self.etiq = etiq self.deph = deph self.pash = pash self.nbeh = nbeh self.depv = depv self.pasv = pasv self.nbev = nbev self.font = font # Les variables suivantes (modifiables) ont une valeur par défaut self.resolution = 300 # dpi self.nomfichierpdf = u"etiquettes.pdf" # peut comporter un chemin self.nomapplication = u"etiquettes.py" # application ayant créé le pdf self.nomdocument = u"Impression d'étiquettes" # nom du pdf créé self.orientation = QtGui.QPrinter.Portrait self.formatpage = QtGui.QPrinter.A4 self.alignement = QtCore.Qt.AlignLeft # alignement dans l'étiquette # ======================================================================= def imprimepdf(self): """Lance l'impression des étiquettes dans le fichier pdf donné""" # conversion en pixels des distances données en mm deph = int(self.deph/25.4*self.resolution) pash = int(self.pash/25.4*self.resolution) depv = int(self.depv/25.4*self.resolution) pasv = int(self.pasv/25.4*self.resolution) # Calcul du nombre de pages: pages, sup = divmod(len(self.etiq), self.nbeh*self.nbev) if sup > 0: # dans ce cas, il y a une dernière page incomplète pages += 1 # création de l'instance printer => fichier etiquettes.pdf printer = QtGui.QPrinter() printer.setOutputFileName(self.nomfichierpdf) printer.setCreator(self.nomapplication) printer.setDocName(self.nomdocument) printer.setPageSize(self.formatpage) printer.setOrientation(self.orientation) printer.setResolution(self.resolution) printer.setFullPage(True) painter = QtGui.QPainter() painter.begin(printer) if self.font!=None: painter.setFont(self.font) k = 0 # compteur du nombre d'étiquettes imprimés for page in xrange(1, pages+1): v = depv for i in xrange(self.nbev): # traiter chaque ligne d'étiquette de la page h = deph for j in xrange(self.nbeh): # traiter chaque étiquette de la ligne if k < len(etiq): # écrire l'étiquette k de coordonnées [h, v] en pixels painter.drawText(h, v, pasv-1, pash-1, self.alignement, etiq[k]) k += 1 h += pash v += pasv if page < pages: # faire un 'newPage' à la fin de chaque page, sauf pour la dernière printer.newPage() painter.end() # ======================================================================= def affichepdf(self): """affiche le pdf créé, dans le visualiseur pdf par défaut de l'OS""" if os.path.exists(self.nomfichierpdf): try: # solution pour Windows os.startfile(self.nomfichierpdf) except: # solution pour Linux récents os.system('xdg-open ' + self.nomfichierpdf) ############################################################################# if __name__ == "__main__": # fabrication pour l'exemple d'une liste de chaines à mettre dans les 32 étiquettes etiq = [] for i in xrange(32): etiq.append((u"Etiquette%d" % (i+1)) + os.linesep + u"2ème ligne" + os.linesep + u"3ème ligne" + os.linesep + u"4ème ligne") deph = 26.0 # mm pash = 60.0 # mm nbeh = 3 depv = 32.0 # mm pasv = 30.0 # mm nbev = 8 font = QtGui.QFont() #font.setFamily(u"Courier New") font.setPointSize(8) #font.setItalic(True) #font.setBold(True) #font.setUnderline(True) etiquettes = Etiquettespdf(etiq, deph, pash, nbeh, depv, pasv, nbev, font) etiquettes.imprimepdf() etiquettes.affichepdf()
Après impression d'une des pages, vous avez peut-être un écart de positionnement dû à un manque de précision de l'imprimante. La correction est simple. Par exemple, si vous mesurez un pas horizontal de 58 au lieu des 60 voulus, il vous suffit de multiplier les valeurs initiales par 60/58 = 1.034.
Amusez-vous bien!