Outils pour utilisateurs

Outils du site


lettrehtml_pdf

Ceci est une ancienne révision du document !


Imprimer une lettre html en passant par un fichier pdf

Objectif

Prenons un exemple: dans le cadre d'un concours, il faut pouvoir informer plusieurs centaines de participants de leurs résultats, et ceci:

  • pour un mailing papier: 1 seul fichier à imprimer pour mise sous enveloppe à fenêtre
  • et pour un emailing: chaque participant reçoit son fichier de résultat .pdf par email en pièce jointe.

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)

Code proposé

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:

  • lettrehtml: chaine de caractère codée en html et en unicode, représentant la ou les lettres à imprimer sur fichier .pdf.

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é""")
lettrehtml_pdf.1287037396.txt.gz · Dernière modification: 2010/10/14 08:23 de tyrtamos

Outils de la page