Я использую reportlab для набора PDF-документов и печати на листах с этикетками, чтобы высота и ширина моих столбцов были фиксированными.Я использовал эту строку кода, чтобы исправить высоту и ширину моих ярлыков р>
Table(data, colWidths=(6.3 * cm, 0.3 * cm, 6.3 * cm, 0.3 * cm, 6.3 * cm),rowHeights=[3.8 * cm] * (len(data)))
Я могу сгенерировать то, что хочу, но иногда текст оказывается выше высоты моих ярлыков. Например, на первой этикетке выше находится текст «Acide Gadoterique Ser pre 10ml»
Мой вопрос
Я уже искал вопросы по stackoverflow, подобные моему, но на все вопросы можно ответить путем модификации высоты и ширины таблицы, где в данном случае это невозможно, поскольку эти два значения должны быть постоянными.
Я знаю, что буду использовать свойство fontsize, но не делаю этого. знать, как создать условие и какое значение для изменения размера шрифта.
Вы можете видеть весь код строки, который я использую для создания PDF-файла.
def impression_etiquette(self):
# permet de generer le nom du document
nom_service = self.frame_impression.encodage_donne()['Service']
# on va recupere le type de dotation
type_dotation = self.frame_impression.encodage_donne()['Type de dotation']
if type_dotation == "Besoins urgents":
table = 'Liens_dotation'
elif type_dotation == "Plein vide":
table = 'Liens_pv'
elif type_dotation == "Dotation medicament":
table = 'Liens_dot_medoc'
else:
return
ligne = 0
colonne = 0
data = []
compteur_ligne_vide =0
hauteur_ligne = [6.3 * cm]
# la variable ligne permet de changer de ligne a chaque fois que 3 etiquettes sont pleines
# la variable colonne permet de sélectionner les etiquettes pleines et non pas les espaces entre
# les datas vont contenir les information à afficher dans les étiquettes
# A c haque boucle on va creer un contenu cellule , on ajoute les informations au fur et à mesure et on fait un retour
# à la ligne
style_tableau_etiquette = TableStyle(
[
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
('GRID', (0, 0), (-1, -1), 0.5, colors.white)
]
)
#on va regarder pour ajouter le nom du service
reponse = messagebox.askyesno(title="Vous êtes surs ?",
message="Souhaitez vous faire apparaitre le nom du service sur l'etiquette ?",
parent=self.top_level)
apparaitre_nom_service = 0
if reponse is True:
apparaitre_nom_service = 1
else:
apparaitre_nom_service = 0
# on va regader pour afficher les quantites X/X
reponse_division = messagebox.askyesno(title="Vous êtes surs ?",
message="Souhaitez vous afficher la dotation sur le mode X/X",
parent=self.top_level)
affichage_fraction = 0
if reponse_division is True:
affichage_fraction = 1
else:
affichage_fraction = 0
# on va regader dans quel sens on va imprimer
reponse_sens = messagebox.askyesno(title="Vous êtes surs ?",
message="Souhaitez vous imprimer en format portrait ?",
parent=self.top_level)
sens_impression = 0
if reponse_sens is True:
sens_impression = 1
else:
sens_impression = 0
###################" on va imprimer les etiquettes
for i in range(len(self.liste_etiquette_imprimer)):
contenu_cellule = ""
if self.liste_etiquette_imprimer[0] == 1:
contenu_cellule = contenu_cellule + " MEDICAMENT A RISQUE
"
contenu_cellule = contenu_cellule + "" + self.liste_etiquette_imprimer[1] + "
"
contenu_cellule = contenu_cellule + "CP : " + str(self.liste_etiquette_imprimer[2]) + "
"
if self.liste_etiquette_imprimer[5] != "":
contenu_cellule = contenu_cellule + "Référence : " + str(self.liste_etiquette_imprimer[5]) + "
"
# on va diviser la quantite par deux si besoins
try:
quantite_dotation=int(self.liste_etiquette_imprimer[3])
except:
quantite_dotation = self.liste_etiquette_imprimer[3]
if affichage_fraction==1 and quantite_dotation !="":
quantite_diviser=int(quantite_dotation/2)
if quantite_diviser==0:
quantite_diviser=1
contenu_cellule = contenu_cellule + "Dotation : " + str(quantite_diviser) + "/" + str(quantite_diviser) + "
# on va ajouter le service si besoins
if apparaitre_nom_service == 1:
contenu_cellule = contenu_cellule + nom_service.upper() + "
"
# on va faire un double contour avec une grosse ligne en couleur et une ligne plus fine en blanc
if self.liste_etiquette_imprimer[4] == "Liste I":
contenu_cellule = contenu_cellule + "LISTE 1 - RESPECTER LES DOSES PRESCRITES"
style_tableau_etiquette.add('BOX', (colonne, ligne), (colonne, ligne), 6, colors.red)
style_tableau_etiquette.add('BOX', (colonne, ligne), (colonne, ligne), 2, colors.white)
elif self.liste_etiquette_imprimer[4] == "Liste II":
contenu_cellule = contenu_cellule + "LISTE 2 - RESPECTER LES DOSES PRESCRITES"
style_tableau_etiquette.add('BOX', (colonne, ligne), (colonne, ligne), 6, colors.green)
style_tableau_etiquette.add('BOX', (colonne, ligne), (colonne, ligne), 2, colors.white)
if sens_impression==1:
# on va regarder comment on ajoute les contenu de cellules , on doit avoir un format data suivant
# [["1", "", "2", "", "3"], ["4", "", "5", "", "6"]] , on doit donc savoir si data est plein ou pas
# on commence par regarder combien de liste il y a dans le data avec la longeur du data
# puis on regarde si il y a une liste, a quel point est elle remplie
styleTitre = ParagraphStyle('styleTitre',
alignment=enums.TA_CENTER,
)
longeur_data = len(data)
longeur_table_data = 0
if longeur_data == 0:
pass
else:
longeur_table_data = len(data[longeur_data - 1])
# on regarde si qu'on on ajoute on depasse les 5 elements par sous array
if colonne + 2 > 5:
ligne = ligne + 1
colonne = 0
else:
colonne = colonne + 2
if longeur_data == 0:
data.append([Paragraph(contenu_cellule, styleTitre), ""])
else:
if longeur_table_data < 4:
data[longeur_data - 1].append(Paragraph(contenu_cellule, styleTitre))
data[longeur_data - 1].append("")
elif longeur_table_data == 4:
data[longeur_data - 1].append(Paragraph(contenu_cellule, styleTitre))
else:
data.append([Paragraph(contenu_cellule, styleTitre), ""])
else:
# on va regarder comment on ajoute les contenu de cellules , on doit avoir un format data suivant
# [["1", "2", "3","4","5","6","7"], ["", "", "", "", "","","",]] , on doit donc savoir si data est plein ou pas
# on commence par regarder combien de iste il y a dans le data avec la longeur du data
# puis on regarde si il y a une liste, a quel point est elle remplie. Longeur_table_data est la longeur de
# l'array en cours de remplisage
styleTitre = ParagraphStyle('styleTitre',
alignment=enums.TA_CENTER,
fontSize=9)
longeur_data = len(data)
longeur_table_data = 0
if longeur_data == 0:
pass
else:
longeur_table_data = len(data[longeur_data - 1])
# on regarde su quel colonne nous sommes, on ne doit pas dépasser 7, on va utiliser la longeur du dernier
# array remplie pour savoir ce qu'on fait soit il est vide et on ajoute le contenue de la cellule
# soit on depasse les 7 etiquettes sans depasser les 5 lignes par feuille et on ajoute un ligne vide
# mais aussi le contennue de la premiere cellule de la nouvelle ligne de la meme feuille et la hauteur des deux lignes ,
# soit on a depasser les 5 ligne par feuille et les 7 elements par lignesdonc on ajoute uniquement
# le contenue de la nouvelle cellule sans ajouter de ligne vide et une seule hauteur
# soit aucun des cas et on ajoute le contenue de la cellule à la suite de la precedente
if longeur_table_data==0:
data.append([Paragraph(contenu_cellule, styleTitre)])
colonne = colonne + 1
elif ((longeur_table_data+1)>7 and compteur_ligne_vide!=3) :
data.append(["", "", "", "", "", "", ""])
data.append([Paragraph(contenu_cellule, styleTitre)])
ligne = ligne + 2
colonne =1
compteur_ligne_vide=compteur_ligne_vide+1
hauteur_ligne = hauteur_ligne + [0.3* cm,6.3*cm]
elif ((longeur_table_data+1)>7 and compteur_ligne_vide==3) :
data.append([Paragraph(contenu_cellule, styleTitre)])
ligne = ligne + 1
compteur_ligne_vide=0
colonne =1
hauteur_ligne= hauteur_ligne + [6.3* cm]
else:
data[longeur_data - 1].append(Paragraph(contenu_cellule, styleTitre))
colonne = colonne + 1
# on va regarder combien il y a d'etiquette si pas assez oon rajoute des donnes vide pour avoir au moins
# une ligne complete
if sens_impression==1:
# on va regarder combien il y a d'etiquette si pas assez oon rajoute des donnes vide pour avoir au moins
# une ligne complete
if len(data) == 1 and len(data[longeur_data - 1]) == 2:
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
elif len(data) == 1 and len(data[longeur_data - 1]) == 4:
data[longeur_data - 1].append('')
# on va creer le tableau, attention car si on met plus de ligne en taille que ce qu'il y en vrai ça plante , donc
# on va multiplier la hauteur des ligne par le nombre de ligne
try:
tableau_frequence = Table(data, colWidths=(6.3 * cm, 0.3 * cm, 6.3 * cm, 0.3 * cm, 6.3 * cm),
rowHeights=[3.8 * cm] * (len(data)))
except:
tableau_frequence = Table(data, colWidths=(6.3 * cm, 0.3 * cm, 6.3 * cm, 0.3 * cm, 6.3 * cm),
rowHeights=[3.8 * cm] * (ligne + 1))
tableau_frequence.setStyle(style_tableau_etiquette)
parts = []
parts.append(tableau_frequence)
nom_fichier = "Etiquette_test_" + table + "_" + str(nom_service) + ".pdf"
pdf = SimpleDocTemplate(nom_fichier, pagesize=A4,
topMargin=1.36 * cm,
leftMargin=0.54 * cm,
rightMargin=0.7 * cm,
bottomMargin=0.5 * cm)
# on va creer le tableau, attention car si on met plus de ligne en taille que ce qu'il y en vrai ça plante , donc
# on va multiplier la hauteur des ligne par le nombre de ligne
tableau_frequence = Table(data, colWidths=(3.8 * cm, 3.8 * cm, 3.8 * cm, 3.8 * cm, 3.8 * cm,3.8 * cm,3.8 * cm),
rowHeights=hauteur_ligne)
tableau_frequence.setStyle(style_tableau_etiquette)
parts = []
parts.append(tableau_frequence)
nom_fichier = "Etiquette_test_" + table + "_" + str(nom_service) + ".pdf"
pdf = SimpleDocTemplate(nom_fichier, pagesize=(A4[1],A4[0]),
topMargin=0.4 * cm,
leftMargin=0.36 * cm,
rightMargin=0.5 * cm,
bottomMargin=0.54 * cm)
pdf.build(parts)
messagebox.showinfo(title="Felicitation", message="L'impression des étiquettes c'est bien déroulée")
id_service = Service.recherche_id(nom_service)
Historique.impression_etiquette(objet_utilisateur.utilisateur_en_cours.id,table,id_service)
Я использую reportlab для набора PDF-документов и печати на листах с этикетками, чтобы высота и ширина моих столбцов были фиксированными.[b]Я использовал эту строку кода, чтобы исправить высоту и ширину моих ярлыков р> Table(data, colWidths=(6.3 * cm, 0.3 * cm, 6.3 * cm, 0.3 * cm, 6.3 * cm),rowHeights=[3.8 * cm] * (len(data))) Я могу сгенерировать то, что хочу, но иногда текст оказывается выше высоты моих ярлыков. Например, на первой этикетке выше находится текст «Acide Gadoterique Ser pre 10ml» [img]https://charlesm.fr/soucis.jpg[/img]
[b]Мой вопрос[/b] Я уже искал вопросы по stackoverflow, подобные моему, но на все вопросы можно ответить путем модификации высоты и ширины таблицы, где в данном случае это невозможно, поскольку эти два значения должны быть постоянными. Я знаю, что буду использовать свойство fontsize, но не делаю этого. знать, как создать условие и какое значение для изменения размера шрифта. Вы можете видеть весь код строки, который я использую для создания PDF-файла. def impression_etiquette(self): # permet de generer le nom du document nom_service = self.frame_impression.encodage_donne()['Service'] # on va recupere le type de dotation type_dotation = self.frame_impression.encodage_donne()['Type de dotation'] if type_dotation == "Besoins urgents": table = 'Liens_dotation' elif type_dotation == "Plein vide": table = 'Liens_pv' elif type_dotation == "Dotation medicament": table = 'Liens_dot_medoc' else: return
ligne = 0 colonne = 0 data = [] compteur_ligne_vide =0 hauteur_ligne = [6.3 * cm] # la variable ligne permet de changer de ligne a chaque fois que 3 etiquettes sont pleines # la variable colonne permet de sélectionner les etiquettes pleines et non pas les espaces entre # les datas vont contenir les information à afficher dans les étiquettes
# A c haque boucle on va creer un contenu cellule , on ajoute les informations au fur et à mesure et on fait un retour # à la ligne style_tableau_etiquette = TableStyle( [ ('ALIGN', (0, 0), (-1, -1), 'CENTER'), ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), ('GRID', (0, 0), (-1, -1), 0.5, colors.white) ] )
#on va regarder pour ajouter le nom du service reponse = messagebox.askyesno(title="Vous êtes surs ?", message="Souhaitez vous faire apparaitre le nom du service sur l'etiquette ?", parent=self.top_level) apparaitre_nom_service = 0 if reponse is True: apparaitre_nom_service = 1 else: apparaitre_nom_service = 0 # on va regader pour afficher les quantites X/X reponse_division = messagebox.askyesno(title="Vous êtes surs ?", message="Souhaitez vous afficher la dotation sur le mode X/X", parent=self.top_level) affichage_fraction = 0 if reponse_division is True: affichage_fraction = 1 else: affichage_fraction = 0
# on va regader dans quel sens on va imprimer reponse_sens = messagebox.askyesno(title="Vous êtes surs ?", message="Souhaitez vous imprimer en format portrait ?", parent=self.top_level) sens_impression = 0 if reponse_sens is True: sens_impression = 1 else: sens_impression = 0
###################" on va imprimer les etiquettes for i in range(len(self.liste_etiquette_imprimer)): contenu_cellule = "" if self.liste_etiquette_imprimer[i][0] == 1: contenu_cellule = contenu_cellule + " MEDICAMENT A RISQUE " contenu_cellule = contenu_cellule + "" + self.liste_etiquette_imprimer[i][1] + "[/b] " contenu_cellule = contenu_cellule + "CP : " + str(self.liste_etiquette_imprimer[i][2]) + " " if self.liste_etiquette_imprimer[i][5] != "": contenu_cellule = contenu_cellule + "Référence : " + str(self.liste_etiquette_imprimer[i][5]) + " " # on va diviser la quantite par deux si besoins try: quantite_dotation=int(self.liste_etiquette_imprimer[i][3]) except: quantite_dotation = self.liste_etiquette_imprimer[i][3]
if affichage_fraction==1 and quantite_dotation !="": quantite_diviser=int(quantite_dotation/2) if quantite_diviser==0: quantite_diviser=1 contenu_cellule = contenu_cellule + "Dotation : " + str(quantite_diviser) + "/" + str(quantite_diviser) + "
# on va ajouter le service si besoins if apparaitre_nom_service == 1: contenu_cellule = contenu_cellule + nom_service.upper() + "
" # on va faire un double contour avec une grosse ligne en couleur et une ligne plus fine en blanc if self.liste_etiquette_imprimer[i][4] == "Liste I": contenu_cellule = contenu_cellule + "LISTE 1 - RESPECTER LES DOSES PRESCRITES" style_tableau_etiquette.add('BOX', (colonne, ligne), (colonne, ligne), 6, colors.red) style_tableau_etiquette.add('BOX', (colonne, ligne), (colonne, ligne), 2, colors.white) elif self.liste_etiquette_imprimer[i][4] == "Liste II": contenu_cellule = contenu_cellule + "LISTE 2 - RESPECTER LES DOSES PRESCRITES" style_tableau_etiquette.add('BOX', (colonne, ligne), (colonne, ligne), 6, colors.green) style_tableau_etiquette.add('BOX', (colonne, ligne), (colonne, ligne), 2, colors.white)
if sens_impression==1: # on va regarder comment on ajoute les contenu de cellules , on doit avoir un format data suivant # [["1", "", "2", "", "3"], ["4", "", "5", "", "6"]] , on doit donc savoir si data est plein ou pas # on commence par regarder combien de liste il y a dans le data avec la longeur du data # puis on regarde si il y a une liste, a quel point est elle remplie styleTitre = ParagraphStyle('styleTitre', alignment=enums.TA_CENTER, ) longeur_data = len(data) longeur_table_data = 0 if longeur_data == 0: pass else: longeur_table_data = len(data[longeur_data - 1])
# on regarde si qu'on on ajoute on depasse les 5 elements par sous array if colonne + 2 > 5: ligne = ligne + 1 colonne = 0 else: colonne = colonne + 2
if longeur_data == 0: data.append([Paragraph(contenu_cellule, styleTitre), ""]) else: if longeur_table_data < 4: data[longeur_data - 1].append(Paragraph(contenu_cellule, styleTitre)) data[longeur_data - 1].append("") elif longeur_table_data == 4: data[longeur_data - 1].append(Paragraph(contenu_cellule, styleTitre)) else: data.append([Paragraph(contenu_cellule, styleTitre), ""]) else: # on va regarder comment on ajoute les contenu de cellules , on doit avoir un format data suivant # [["1", "2", "3","4","5","6","7"], ["", "", "", "", "","","",]] , on doit donc savoir si data est plein ou pas # on commence par regarder combien de iste il y a dans le data avec la longeur du data # puis on regarde si il y a une liste, a quel point est elle remplie. Longeur_table_data est la longeur de # l'array en cours de remplisage styleTitre = ParagraphStyle('styleTitre', alignment=enums.TA_CENTER, fontSize=9) longeur_data = len(data) longeur_table_data = 0 if longeur_data == 0: pass else: longeur_table_data = len(data[longeur_data - 1])
# on regarde su quel colonne nous sommes, on ne doit pas dépasser 7, on va utiliser la longeur du dernier # array remplie pour savoir ce qu'on fait soit il est vide et on ajoute le contenue de la cellule # soit on depasse les 7 etiquettes sans depasser les 5 lignes par feuille et on ajoute un ligne vide # mais aussi le contennue de la premiere cellule de la nouvelle ligne de la meme feuille et la hauteur des deux lignes , # soit on a depasser les 5 ligne par feuille et les 7 elements par lignesdonc on ajoute uniquement # le contenue de la nouvelle cellule sans ajouter de ligne vide et une seule hauteur # soit aucun des cas et on ajoute le contenue de la cellule à la suite de la precedente
if longeur_table_data==0: data.append([Paragraph(contenu_cellule, styleTitre)]) colonne = colonne + 1 elif ((longeur_table_data+1)>7 and compteur_ligne_vide!=3) : data.append(["", "", "", "", "", "", ""]) data.append([Paragraph(contenu_cellule, styleTitre)]) ligne = ligne + 2 colonne =1 compteur_ligne_vide=compteur_ligne_vide+1 hauteur_ligne = hauteur_ligne + [0.3* cm,6.3*cm] elif ((longeur_table_data+1)>7 and compteur_ligne_vide==3) : data.append([Paragraph(contenu_cellule, styleTitre)]) ligne = ligne + 1 compteur_ligne_vide=0 colonne =1 hauteur_ligne= hauteur_ligne + [6.3* cm] else: data[longeur_data - 1].append(Paragraph(contenu_cellule, styleTitre)) colonne = colonne + 1
# on va regarder combien il y a d'etiquette si pas assez oon rajoute des donnes vide pour avoir au moins # une ligne complete if sens_impression==1: # on va regarder combien il y a d'etiquette si pas assez oon rajoute des donnes vide pour avoir au moins # une ligne complete if len(data) == 1 and len(data[longeur_data - 1]) == 2: data[longeur_data - 1].append('') data[longeur_data - 1].append('') data[longeur_data - 1].append('') elif len(data) == 1 and len(data[longeur_data - 1]) == 4: data[longeur_data - 1].append('')
# on va creer le tableau, attention car si on met plus de ligne en taille que ce qu'il y en vrai ça plante , donc # on va multiplier la hauteur des ligne par le nombre de ligne try: tableau_frequence = Table(data, colWidths=(6.3 * cm, 0.3 * cm, 6.3 * cm, 0.3 * cm, 6.3 * cm), rowHeights=[3.8 * cm] * (len(data))) except: tableau_frequence = Table(data, colWidths=(6.3 * cm, 0.3 * cm, 6.3 * cm, 0.3 * cm, 6.3 * cm), rowHeights=[3.8 * cm] * (ligne + 1)) tableau_frequence.setStyle(style_tableau_etiquette) parts = [] parts.append(tableau_frequence) nom_fichier = "Etiquette_test_" + table + "_" + str(nom_service) + ".pdf" pdf = SimpleDocTemplate(nom_fichier, pagesize=A4, topMargin=1.36 * cm, leftMargin=0.54 * cm, rightMargin=0.7 * cm, bottomMargin=0.5 * cm)
# on va creer le tableau, attention car si on met plus de ligne en taille que ce qu'il y en vrai ça plante , donc # on va multiplier la hauteur des ligne par le nombre de ligne tableau_frequence = Table(data, colWidths=(3.8 * cm, 3.8 * cm, 3.8 * cm, 3.8 * cm, 3.8 * cm,3.8 * cm,3.8 * cm), rowHeights=hauteur_ligne)
tableau_frequence.setStyle(style_tableau_etiquette) parts = [] parts.append(tableau_frequence) nom_fichier = "Etiquette_test_" + table + "_" + str(nom_service) + ".pdf" pdf = SimpleDocTemplate(nom_fichier, pagesize=(A4[1],A4[0]), topMargin=0.4 * cm, leftMargin=0.36 * cm, rightMargin=0.5 * cm, bottomMargin=0.54 * cm)
pdf.build(parts) messagebox.showinfo(title="Felicitation", message="L'impression des étiquettes c'est bien déroulée") id_service = Service.recherche_id(nom_service) Historique.impression_etiquette(objet_utilisateur.utilisateur_en_cours.id,table,id_service)