IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Pdf python erreur


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 18
    Par défaut Pdf python erreur
    Bonjour à tous,

    J'essaye de générer des fichiers pdf sur la version 2.7 de python. Pour l'instant, je n'ai pas le choix je ne peux utiliser que cette version.
    Et j'essaye d'introduire une image dans mon fichier pdf mais mais malgré tous les essais, j'ai cette erreur qui revient souvent :
    image.drawOn(doc, doc.leftMargin, doc.height - image.drawHeight - doc.topMargin)
    File "C:\Python27\lib\site-packages\reportlab\platypus\flowables.py", line 112, in drawOn
    canvas.saveState()
    AttributeError: SimpleDocTemplate instance has no attribute 'saveState'
    Ou sinon :

    AttributeError: SimpleDocTemplate instance has no attribute 'canvas'

    Pourriez-vous m'aider ?

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par débutant09
    Pour l'instant, je n'ai pas le choix je ne peux utiliser que cette version.
    Un enseignant récalcitrant ?

    Citation Envoyé par débutant09
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: SimpleDocTemplate instance has no attribute 'saveState'
    Regarder la documentation sur l'objet SimpleDocTemplate, et chercher à savoir s'il existe une méthode saveState.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 18
    Par défaut
    Je suis stagiaire dans une entreprise
    Ça ne vient pas d'un enseignant
    Oui la méthode y est sur la documentation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    if __name__ == '__main__':
        from reportlab.lib.styles import _baseFontName, _baseFontNameB
        def myFirstPage(canvas, doc):
            from reportlab.lib.colors import red
            PAGE_HEIGHT = canvas._pagesize[1]
            canvas.saveState()
            canvas.setStrokeColor(red)
            canvas.setLineWidth(5)
            canvas.line(66,72,66,PAGE_HEIGHT-72)
            canvas.setFont(_baseFontNameB,24)
            canvas.drawString(108, PAGE_HEIGHT-108, "TABLE OF CONTENTS DEMO")
            canvas.setFont(_baseFontName,12)
            canvas.drawString(4 * inch, 0.75 * inch, "First Page")
            canvas.restoreState()
     
        def myLaterPages(canvas, doc):
            from reportlab.lib.colors import red
            PAGE_HEIGHT = canvas._pagesize[1]
            canvas.saveState()
            canvas.setStrokeColor(red)
            canvas.setLineWidth(5)
            canvas.line(66,72,66,PAGE_HEIGHT-72)
            canvas.setFont(_baseFontName,12)
            canvas.drawString(4 * inch, 0.75 * inch, "Page %d" % doc.page)
            canvas.restoreState()

  4. #4
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 228
    Par défaut
    Hello,
    il faudrait que tu nous montres comment sont appelées tes fonctions et surtout comment est défini le paramètre canvas que tu passes.
    Ami calmant, J.P

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 18
    Par défaut
    Voici mon code, ça va peut être vous aider à comprendre mon erreur :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    from reportlab.lib.pagesizes import landscape, A3
    from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Image
    from reportlab.lib.styles import getSampleStyleSheet
    import pandas as pd
     
     
    def create_pdf_with_dataframe(file_path, dataframe, image_path):
        # Spécifier la taille de la page en mode paysage et A3 (plus grande)
        doc = SimpleDocTemplate(file_path, pagesize=landscape(A3), topMargin=30)
     
        styles = getSampleStyleSheet()
        style_heading = styles["Heading1"]
     
        # Créer un tableau pour le DataFrame
        table_data = [dataframe.columns.values.tolist()] + dataframe.values.tolist()
        table = Table(table_data)
     
        # Appliquer des styles au tableau
        table.setStyle(TableStyle([('ALIGN', (0, 0), (-1, -1), 'CENTER'),
                                   ('FONT', (0, 0), (-1, 0), 'Helvetica-Bold'),
                                   ('BACKGROUND', (0, 0), (-1, 0), 'grey'),
                                   ('TEXTCOLOR', (0, 0), (-1, 0), 'white'),
                                   ('GRID', (0, 0), (-1, -1), 1, 'black')]))
     
        # Ajouter le titre
        title = Paragraph("ROP", style_heading)
     
        # Construction des éléments
        elements = []
     
        # Ajouter l'image en haut à gauche
        image = Image(image_path, width=120, height=85)
        image.wrapOn(doc, doc.width, doc.topMargin)  # Pour ajuster la taille de l'image selon la marge supérieure
        image.drawOn(doc, 30, doc.height - 120)  # Positionner l'image aux coordonnées (30, hauteur du document - 120)
     
        # Ajouter le titre
        elements.append(title)
     
        # Ajouter le tableau
        elements.append(table)
     
        # Générer le PDF
        doc.build(elements)
     
    # Exemple d'utilisation :
    site_id = "XXXX"
    account_code = "XXXX"
    df = data(site_id, account_code)  # Assurez-vous que cette fonction retourne un DataFrame
    image_path = "c:\\Users\\xxxx\\Desktop\\Factures detail\\img\\xxx.png"  # Remplacez par le chemin de votre image
    create_pdf_with_dataframe("c:\\Users\\xxx\\Desktop\\Factures detail\\example.pdf", df, image_path)

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 746
    Par défaut
    Citation Envoyé par débutant09 Voir le message
    Voici mon code, ça va peut être vous aider à comprendre mon erreur
    Comme vous n'avez viré la fonction du début, il n'y a plus d'erreur à chercher.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Attention un Canvas n'est pas un SimpleDocTemplate.

    Là à l'occurrence, python vous dit que votre objet canvas n'est pas un Canvas (qui a effectivement cette méthode saveState) mais un objet SimpleDocTemplate.

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par débutant09
    auriez-vous une idée comment déplacer mon image en haut à gauche dans mon pdf s'il vous plaît ?
    Dans la construction de SimpleDocTemplate il est possible d'ajouter le paramètre onFirstPage (première page), onLaterPages (toutes les pages sauf la 1ère page) qui aura comme valeur un callback (qui appelé peut ajouter une image) et donc d'utiliser l'objet Canvas tout en gérant les pages de son document (doc.page).

    Par ex.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def on_first_page(canvas, doc):
        # Dessiner des éléments spécifiques à la première page ici, si nécessaire
     
    # ...
     
    doc = SimpleDocTemplate("mon.pdf", onFirstPage=on_first_page)

  9. #9
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 18
    Par défaut
    Merci Fred pour ta réponse, j'ai essayé de faire le code ci-dessous, je n'ai aucune erreur mais mon image n'est pas présente dans mon pdf :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    def header(canvas, doc):
     
        canvas.saveState()
     
        image_path = "c:\\Users\\XXXX\\Desktop\\Factures detail\\img\\XXXX_logo.png"  # Remplacez par le chemin de votre image
        # Ajouter l'image en haut à gauche
        image = Image(image_path, width=120, height=75) 
     
        h_logo = image.wrap(doc.width, doc.topMargin)
     
        # Height start
        h_logo = h_logo/10
     
        # Placer l'image en haut à gauche avec une marge
        image.drawOn(canvas, doc.leftMargin, doc.height + doc.topMargin - h_logo)
     
        canvas.restoreState()
     
     
    def create_pdf_with_dataframe(file_path, dataframe):
     
        # Définir la taille de la page en mode paysage et A3 (plus grande)
        doc = SimpleDocTemplate(file_path, pagesize=landscape(A3), topMargin=30, onFirst_page=header)
     
        styles = getSampleStyleSheet()
        style_heading = styles["Heading1"]
     
        # Créer un tableau pour le DataFrame
        table_data = [dataframe.columns.values.tolist()] + dataframe.values.tolist()
        table = Table(table_data)
     
        # Appliquer des styles au tableau
        table.setStyle(TableStyle([('ALIGN', (0, 0), (-1, -1), 'CENTER'),
                                   ('FONT', (0, 0), (-1, 0), 'Helvetica-Bold'),
                                   ('BACKGROUND', (0, 0), (-1, 0), 'grey'),
                                   ('TEXTCOLOR', (0, 0), (-1, 0), 'white'),
                                   ('GRID', (0, 0), (-1, -1), 1, 'black')]))
     
        # Ajouter le titre
        title = Paragraph("Facture détaillée", style_heading)
     
        # Construction des éléments
        elements = []
     
        # Ajouter le titre
        elements.append(title)
     
        # Ajouter le tableau
        elements.append(table)
     
        # Générer le PDF
        doc.build(elements)
     
     
    # Exemple d'utilisation :
    site_id = "XXX"
    account_code = "XXX"
    df = data(site_id, account_code)  # Assurez-vous que cette fonction retourne un DataFrame
    create_pdf_with_dataframe("c:\\Users\\XXX\\Desktop\\Factures detail\\example.pdf", df)

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    On pourrait pas simplement utiliser la méthode drawImage de l'objet Canvas ?

    https://docs.reportlab.com/reportlab.../ch2_graphics/

    EDIT: Pour l'image, je mettrai directement son chemin

    Citation Envoyé par doc
    The image parameter may be either a PIL Image object or an image filename.

Discussions similaires

  1. Liens pour apprendre à créer des PDF
    Par pmboutteau dans le forum Autres langages
    Réponses: 6
    Dernier message: 20/09/2005, 18h16
  2. Configurer la langue des messages d'erreur
    Par Invité dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 08/09/2005, 11h11
  3. [servlet] gestion des listes d'erreurs ?
    Par MatMeuh dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 27/10/2004, 10h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo