Bonjour à tous, voici un petit moment que je suis sur un programme qui complète mon cahier de recettes, imprimer des étiquettes avec les ingrédients de la recette, pourcentage, etc.
Je me suis beaucoup inspiré du code de Tyrtamos, code que tu avais posté il y a quelques temps sur l'impression d'étiquette.
Mais je suis confronté à 2 problèmes :
- Je voudrais imprimer du texte enrichie format html, il me restitue le texte avec les balises.
- je préfères un boite de dialogue "QPrintPreviewDialog()" pour visualiser l'impression et choisir l'imprimante.
Merci d'avance pour ceux qui prendront le temps de me lire.
Voici une partie du code que j'ai adapté pour que vous puissiez comprendre ma demande.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Python 3.4
 
from __future__ import division
import os,sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *
from PyQt5.QtGui import *
 
#############################################################################
class Etiquettespdf(object):
    """Imprime en fichier .pdf et affiche la liste d'etiquettes a imprimer"""
 
    # =======================================================================
    def __init__(self, etiq, deph, pash, nbeh, depv, pasv, nbev):
        """Initialise toutes les variables necessaires
        etiq: liste des chaines, eventuellement multilignes (avec os.linesep)
        deph: point de depart en mm a partir du bord gauche de la feuille
        pash: pas horizontal en mm entre 2 etiquettes
        nbeh: nombre d'etiquettes en horizontal
        depv: point de depart en mm a partir du bord superieur de la feuille
        pasv: pas vertical entre 2 etiquettes (mm)
        nbev: nombre d'etiquettes en vertical
        font: police de caracteres a 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
 
        # Les var. suivantes (modifiables) ont une valeur par defaut
 
        # nom du fichier pdf a creer
        self.nomfichierpdf = "etiquettes.pdf"
        # nom de l'application qui cree le fichier pdf
        self.nomapplication = ""
        # nom du document pdf cree
        self.nomdocument = ""
        # orientation de la page a imprimer
        self.orientation = QPrinter.Portrait
        # format de la page a imprimer
 
        self.formatpage = QPrinter.A4 #QPrinter.Custom
        self.formatpapier = QSizeF(90.00,30.00)
        # alignement de l'impression sur les etiquettes
        self.alignement = Qt.AlignLeft
 
    # =======================================================================
    def imprime(self):
        """Lance l'impression des etiquettes dans le fichier pdf donne"""
 
        # creation de l'instance printer => fichier etiquettes.pdf
        printer = QPrinter(QPrinter.HighResolution)
        printer.setOutputFileName(self.nomfichierpdf)
        printer.setCreator(self.nomapplication)
        printer.setDocName(self.nomdocument)
        printer.setPageSize(self.formatpage)
        if self.formatpage == QPrinter.Custom :
            printer.setPaperSize(self.formatpapier,printer.Millimeter)
 
        printer.setOrientation(self.orientation)
        printer.setFullPage(True)
        resolution = printer.resolution() # en principe, c'est 1200dpi
 
        # conversion en pixels des distances donnees en mm
        mm2px = lambda mm: int(mm / 25.4 * resolution)
        deph = mm2px(self.deph)
        pash = mm2px(self.pash)
        depv = mm2px(self.depv)
        pasv = mm2px(self.pasv)
 
        # 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 derniere page incomplete
            pages += 1
 
        # page a creer
        painter = QPainter()
 
        # impression sur le fichier pdf
        painter.begin(printer)
        k = 0 # compteur du nombre d'etiquettes imprimees
        for page in range(1, pages+1):
            v = depv # initialisation de la coordonnee verticale de chaque etiquette
            for i in range(self.nbev):
                # traiter chaque ligne d'etiquette de la page
                h = deph# initialisation de la coordonnee horizontale de chaque etiquette
                for j in range(self.nbeh):
                    # traiter chaque etiquette de la ligne
                    if k < len(self.etiq):
                        # ecrire l'etiquette k de coordonnees [h, v] en pixels
                        painter.drawText(h, v, pash-1, pasv-1, self.alignement, self.etiq[k])
                        k += 1
                    h += pash
                v += pasv
            if page < pages:
                # faire un 'newPage' a la fin de chaque page, sauf pour la derniere
                printer.newPage()
        painter.end()
 
    # =======================================================================
    def affiche(self):
        """affiche le pdf cree, dans le visualiseur pdf par defaut de l'OS"""
        if os.path.exists(self.nomfichierpdf):
            try:
                # solution pour Windows
                os.startfile(self.nomfichierpdf)
            except:
                # solution pour les Linux recents
                os.system('xdg-open ' + self.nomfichierpdf)
 
###################################################################################################
class Feuille( QWidget) :
    def __init__(self, parent = None) :
        super(Feuille, self).__init__( parent)
        self.setObjectName("Feuille")
        self.parent = parent
        self.texte = QTextEdit("Bonjour\ntout va bien")
        self.btn = QPushButton("lancer l'impression")
        self.btn.clicked.connect(self.action_btn)
        layout = QVBoxLayout()
        layout.addWidget(self.texte)
        layout.addWidget(self.btn)
        self.setLayout(layout)
 
    def action_btn(self):
        etiq = []
        nbr_eti = 1
        prm_eti = 0 #pour la page d'etiquette entammee
        for i in range(nbr_eti + prm_eti):
            if i < prm_eti :
                etiq.append("")
            else :
                etiq.append(self.texte.toHtml())
 
        deph = 1.0 # mm
        pash = 200.0 # mm
        nbeh = 1
 
        depv = 14 # mm
        pasv = 25.0 # mm
        nbev = 10
 
        etiquettes = Etiquettespdf(etiq, deph, pash, nbeh, depv, pasv, nbev)#, font)
        etiquettes.imprime()
        etiquettes.affiche()
 
#############################################################################
if __name__ == "__main__":
    app =  QApplication (sys.argv)
    fp = Feuille()
    fp.show()
    sys.exit(app.exec_())
    app.MainLoop()