Outils pour utilisateurs

Outils du site


etiquettes_pdf

Ceci est une ancienne révision du document !


Imprimer des étiquettes autocollantes en passant par un fichier pdf

Objectif

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)

Code proposé

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:

  • etiq: liste des chaines, éventuellement multilignes (avec os.linesep)

par exemple: [u“nom prénom” + os.linesep + u“rue” + os.linesep + u“ville”, …]

  • deph: point de départ en mm à partir du bord gauche de la feuille
  • pash: pas horizontal en mm entre 2 étiquettes
  • nbeh: nombre d'étiquettes en horizontal
  • depv: point de départ en mm à partir du bord supérieur de la feuille
  • pasv: pas vertical en mm entre 2 étiquettes
  • nbev: nombre d'étiquettes en vertical
  • font: police de caractères à utiliser (de type QFont)

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!

etiquettes_pdf.1286880775.txt.gz · Dernière modification: 2010/10/12 12:52 de tyrtamos

Outils de la page