I use reportlab to type PDF documents in order to print on label sheets so the height and width of my columns are fixed. I used this line of code to fixe the height and the wild of my labels
Table(data, colWidths=(6.3 * cm, 0.3 * cm, 6.3 * cm, 0.3 * cm, 6.3 * cm),rowHeights=[3.8 * cm] * (len(data)))
I can generate what I want but sometime the text is taller than the height of my labels. For exemple , on the first label, you can see there is a text above "Acide Gadoterique Ser pre 10ml"
My question
I already searched on the stackoverflow questions like mine , but all questions can be answered by modification of the height and width of the table where ,in this case, it's not possible because this two values need to be constant.
I know I will use the fontsize property but I don't know how to make a condition, and on what value , to change the fontsize.
U can see all the line code I use to generate the 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)
]
)
styleTitre = ParagraphStyle('styleTitre',
alignment=enums.TA_CENTER,
)
#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 + "<font color='#ff0000'> MEDICAMENT A RISQUE </font> <br/>"
contenu_cellule = contenu_cellule + "<b>" + self.liste_etiquette_imprimer[i][1] + "</b> <br/>"
contenu_cellule = contenu_cellule + "CP : " + str(self.liste_etiquette_imprimer[i][2]) + "<br/>"
if self.liste_etiquette_imprimer[i][5] != "":
contenu_cellule = contenu_cellule + "Référence : " + str(self.liste_etiquette_imprimer[i][5]) + "<br/>"
# 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) + "<br/><br/>"
else:
contenu_cellule = contenu_cellule + "Dotation : " + str(quantite_dotation) + "<br/><br/>"
# on va ajouter le service si besoins
if apparaitre_nom_service == 1:
contenu_cellule = contenu_cellule + nom_service.upper() + "<br/><br/>"
# 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 + "<font color='#ff0000'>LISTE 1 - RESPECTER LES DOSES PRESCRITES</font>"
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 + "<font color='#00ff40'>LISTE 2 - RESPECTER LES DOSES PRESCRITES</font>"
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)
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)
else:
if len(data) == 1 and len(data[longeur_data - 1]) == 1:
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
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]) == 2:
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
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]) == 3:
data[longeur_data - 1].append('')
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('')
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
elif len(data) == 1 and len(data[longeur_data - 1]) == 5:
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
elif len(data) == 1 and len(data[longeur_data - 1]) == 6:
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
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)
I found a solution. I made 2 functions :
When I finish generate the text of the cell, I use the function adjust_font_size_to_fit wich give the perfect font size. When I have the perfect font size, I use the <font size='x'></font>
to change the font size of the text cell.
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)
]
)
styleTitre = ParagraphStyle('styleTitre',
alignment=enums.TA_CENTER,
)
#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 + "<font color='#ff0000'> MEDICAMENT A RISQUE </font> <br/>"
contenu_cellule = contenu_cellule + "<b>" + self.liste_etiquette_imprimer[i][1] + "</b> <br/>"
contenu_cellule = contenu_cellule + "CP : " + str(self.liste_etiquette_imprimer[i][2]) + "<br/>"
if self.liste_etiquette_imprimer[i][5] != "":
contenu_cellule = contenu_cellule + "Référence : " + str(self.liste_etiquette_imprimer[i][5]) + "<br/>"
# 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) + "<br/><br/>"
else:
contenu_cellule = contenu_cellule + "Dotation : " + str(quantite_dotation) + "<br/><br/>"
# on va ajouter le service si besoins
if apparaitre_nom_service == 1:
contenu_cellule = contenu_cellule + nom_service.upper() + "<br/>"
# 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 + "<font color='#ff0000'>LISTE 1 - RESPECTER LES DOSES PRESCRITES</font>"
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 + "<font color='#00ff40'>LISTE 2 - RESPECTER LES DOSES PRESCRITES</font>"
style_tableau_etiquette.add('BOX', (colonne, ligne), (colonne, ligne), 6, colors.green)
style_tableau_etiquette.add('BOX', (colonne, ligne), (colonne, ligne), 2, colors.white)
# on va dapter la taille du texte à l'etiquette
if sens_impression==1:
#on va calculer la taille de police
taille_police = int(self.adjust_font_size_to_fit(contenu_cellule, 6.3 * cm, 3.8 * cm))
contenu_cellule_finale = "<font size='" + str(taille_police) + "'>" + contenu_cellule + "</font>"
# 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_finale, styleTitre), ""])
else:
if longeur_table_data < 4:
data[longeur_data - 1].append(Paragraph(contenu_cellule_finale, styleTitre))
data[longeur_data - 1].append("")
elif longeur_table_data == 4:
data[longeur_data - 1].append(Paragraph(contenu_cellule_finale, styleTitre))
else:
data.append([Paragraph(contenu_cellule_finale, styleTitre), ""])
else:
# on va calculer la taille de police
taille_police = int(self.adjust_font_size_to_fit(contenu_cellule, 3.8 * cm, 6.3 * cm))
contenu_cellule_finale = "<font size='" + str(taille_police) + "'>" + contenu_cellule + "</font>"
# 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,
)
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_finale, styleTitre)])
colonne = colonne + 1
elif ((longeur_table_data+1)>7 and compteur_ligne_vide!=3) :
data.append(["", "", "", "", "", "", ""])
data.append([Paragraph(contenu_cellule_finale, 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_finale, 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_finale, 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)
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)
else:
if len(data) == 1 and len(data[longeur_data - 1]) == 1:
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
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]) == 2:
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
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]) == 3:
data[longeur_data - 1].append('')
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('')
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
elif len(data) == 1 and len(data[longeur_data - 1]) == 5:
data[longeur_data - 1].append('')
data[longeur_data - 1].append('')
elif len(data) == 1 and len(data[longeur_data - 1]) == 6:
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
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)
def adjust_font_size_to_fit(self,text, column_width, cell_height, max_font_size=9, min_font_size=6):
# Commence avec la taille maximale de police
font_size = max_font_size
while font_size >= min_font_size:
# Calculer la hauteur du texte pour la taille actuelle de la police
text_height = self.get_text_height(text, column_width, font_size)
# Si la hauteur du texte tient dans la hauteur de la cellule, on garde cette taille
if text_height <= cell_height:
return font_size
# Réduire la taille de la police et réessayer
font_size -= 1
def get_text_height(self,text, column_width, font_size):
style = getSampleStyleSheet()['Normal']
style.fontSize = font_size
p = Paragraph(text, style)
# Mesurer la largeur et la hauteur du texte
_, height = p.wrap(column_width, 0) # On fixe la largeur et calcule la hauteur
return height