pythonlabelreportlab

In reportlab how calculate the font size for a cell based on the amount of text when the height and width of the cell cannot be changed?


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" Text

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)

Solution

  • 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