在reportlab中,当单元格的高度和宽度无法更改时,如何根据文本量计算单元格的字体大小?

问题描述 投票:0回答:1

我使用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” Text

我的问题

我已经搜索过像我这样的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)
        ]
    )

    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)
python label reportlab
1个回答
0
投票

我找到了解决办法。我做了 2 个函数:

  • get_text_height 此函数给出文本的高度
  • 调整字体大小到适合此函数使用 get_text_height 来确保选择的字体大小可以适合单元格

当我完成生成单元格文本时,我使用函数 adjustment_font_size_to_fit 给出完美的字体大小。当我有了完美的字体大小时,我使用

<font size='x'></font>
来更改文本单元格的字体大小。

 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
© www.soinside.com 2019 - 2024. All rights reserved.