Forum Programmation.python Automatisation PDF avec ID unique + logs dans fichier xls

Posté par  . Licence CC By‑SA.
Étiquettes :
2
9
juil.
2024

Bonjour,

j'ai créé une base de code pour créer des pdf générés à partir d'un jpg en y ajoutant automatiquement un id unique sur chaque PDF.
De plus, ces ID sont liés à des emails et tout ce beau monde est logué dans un xlsx.
Enfin j'ai généré un exe de ce code pour le rendre plus user-friendly (prompt en front qui demande le mail et le nombre de pdf à générer). Tout ça fonctionne parfaitement.

Mon souci : J'ai souhaité personnaliser le fichier de logs xlsx avec un peu de macro et donc, le fichier de sortie est un xlsm.

J'ai beau revoir le code de A à Z, j'ai mentionné ce format à plusieurs reprises j'ai spécifié l'import de xlwings mais malgré tout, le programme continue de me loguer dans le xlsx.

Voici le code https://bin.readthedocs.fr/antate.py, pourriez-vous me donner des pistes de vérifications ?

Merci d'avance !

  • # Il manque des éléments

    Posté par  (site web personnel) . Évalué à 2.

    Bonjour, j'ignore le but de l'opération mais je serais curieux de savoir à quoi tout ça peut servir. Le code incomplet ne permet pas d'avoir une idée exacte de l’approche utilisée et donc des potentiels soucis. Étant curieux, j'ai complété le script avec quelques fonction minimales

     import sys
     from PIL import Image, ImageDraw, ImageFont
    -from reportlab.lib.pagesizes import letter
    +from reportlab.lib.pagesizes import letter, A4
     from reportlab.pdfgen import canvas
     import uuid
     import xlwings as xw
    @@ -11,6 +11,28 @@ import tempfile
    
     # Les fonctions generate_unique_id, add_id_to_image, et create_pdf_with_image restent inchangées
    
    +def generate_unique_id():
    +    return str(uuid.uuid4())
    +
    +def add_id_to_image(image_path, output_image_path, unique_id, count):
    +    img = Image.open(image_path)
    +    draw = ImageDraw.Draw(img)
    +    # font = ImageFont.truetype(<font-file>, <font-size>)
    +    font = ImageFont.truetype("DejaVuSans.ttf", 16)
    +    # draw.text((x, y),"Sample Text",(r,g,b))
    +    draw.text((0, 0), unique_id,(255,255,255),font=font)
    +    img.save(output_image_path)
    +    print("add id to image...")
    +
    +def create_pdf_with_image(output_image_path, pdf_path):
    +    c = canvas.Canvas(pdf_path, pagesize=letter)
    +    c.drawString(50, 50, "Hello world!")
    +    w, h = A4
    +    c.ellipse(50, h - 50, w + 150, h - 50)
    +    c.drawImage(output_image_path, 50, h - 200)
    +    c.showPage()
    +    c.save()
    +
     def add_to_excel(excel_path, email, unique_id, pdf_path, creation_date, creation_time):
         print(f"Tentative d'ajout au fichier Excel : {excel_path}")

    J'ai créé un fichier basique invitations_info.xlsm dans LibreOffice et utilisé une bête image jpg appelée invitation.jpg. Mais étant sous Linux, le programme crash car xlwings ne fonctionne correctement que sous Windows. Cette bibliothèque sert à piloter Microsoft Excell et elle ne semble fonctionner que sous Windows ou macOS. ne disposant pas de ces systèmes, je ne peux pas aller plus loin.

    Pour info, voilà le résultat quand je lance le script:

    (venv) [arnaud aldebaran test]: python prout.py 
    Entrez l'adresse e-mail du destinataire: plop@example.com
    Entrez le nombre d'invitations à générer: 3
    Chemin du script : /tmp/test
    Chemin du fichier Excel : /tmp/test/invitations_info.xlsm
    add id to image...
    PDF généré: invitations_generees/invitation_35664ee3-77ef-4e3c-8b82-86f98528032f_1.pdf
    Tentative d'ajout au fichier Excel : /tmp/test/invitations_info.xlsm
    Chemin du fichier Excel : /tmp/test/invitations_info.xlsm
    Ouverture du fichier Excel existant : /tmp/test/invitations_info.xlsm
    Erreur lors de l'écriture dans le fichier Excel: The interactive mode of xlwings is only supported on Windows and macOS. On Linux, you can use xlwings Server or xlwings Reader.
    Traceback (most recent call last):
      File "/tmp/test/prout.py", line 46, in add_to_excel
        wb = xw.Book(excel_path)
             ^^^^^^^^^^^^^^^^^^^
      File "/tmp/venv/lib/python3.12/site-packages/xlwings/main.py", line 914, in __init__
        for app in apps:
      File "/tmp/venv/lib/python3.12/site-packages/xlwings/main.py", line 258, in __iter__
        for app in self.impl:
                   ^^^^^^^^^
      File "/tmp/venv/lib/python3.12/site-packages/xlwings/main.py", line 5262, in impl
        raise XlwingsError(
    xlwings.XlwingsError: The interactive mode of xlwings is only supported on Windows and macOS. On Linux, you can use xlwings Server or xlwings Reader.
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/tmp/test/prout.py", line 147, in <module>
        main()
      File "/tmp/test/prout.py", line 112, in main
        temp_file = add_to_excel(excel_path, email, unique_id, pdf_path, creation_date, creation_time)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/tmp/test/prout.py", line 61, in add_to_excel
        wb = xw.Book(excel_path)
             ^^^^^^^^^^^^^^^^^^^
      File "/tmp/venv/lib/python3.12/site-packages/xlwings/main.py", line 914, in __init__
        for app in apps:
      File "/tmp/venv/lib/python3.12/site-packages/xlwings/main.py", line 258, in __iter__
        for app in self.impl:
                   ^^^^^^^^^
      File "/tmp/venv/lib/python3.12/site-packages/xlwings/main.py", line 5262, in impl
        raise XlwingsError(
    xlwings.XlwingsError: The interactive mode of xlwings is only supported on Windows and macOS. On Linux, you can use xlwings Server or xlwings Reader.
    
  • # google is not evil (as they say)

    Posté par  . Évalué à 2.

    …et quand bien meme, il peut toujours etre ton ami

    un petite recherche google m'a donne ce lien
    stackoverflow qui reference lui meme cet autre
    Si j'ai tout bien compris, tu devrais pouvoir contourner ton probleme a coup de saveAs au lieu de save

    ++
    Gi)

  • # loggué dans un excel ? beurk

    Posté par  . Évalué à 3.

    au mieux tu loggues dans une base de données,
    au pire dans CSV, qui sert ensuite de base de depart à un excel/libreoffice/code à ta sauce qui fera un rendu

    mais loggué ta donnée directement dans le excel, beurk

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.