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 161 162 163 164 165 166
| #!/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):
qtexte = QStaticText(self.etiq[k])
qtexte.setTextFormat(Qt.RichText) # forcer l'usage du html
qtexte.setTextWidth(pash)# largeur étiquette pour alignement des textes par html/css
x = deph + j*pash
y = depv + i*pasv
painter.drawStaticText(x, y, qtexte)
## 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() |
Partager