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 :

fpdf output buffer


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Décembre 2019
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement de composants

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Par défaut fpdf output buffer
    Bonjour,
    j'utilise fpdf pour créer des fichiers pdf via python.
    ça marche plutôt bien, j'arrive à faire ce sont j'ai besoin.
    ci dessous un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from fpdf import FPDF
    import os
     
    pdf = FPDF()
    pdf.add_page()
    pdf.set_font('helvetica', 'B', 16)
    pdf.cell(40, 10, 'Essai')
    pdf.output("test.pdf")
    os.system("test.pdf")
    Trois interrogations par rapport à fpdf:
    1 - le pdf.output(path) nécessite la création d'un fichier sur le disque... pas de possibilité de créer le fichier dans un buffer? j'ai essayé de binariser le output, j'ai tounrer autour de stringio (sans succès).
    2 - je n'ai pas trouvé d'autre moyen que fpdf pour faire des pdf via python pas d'autre moyen?
    3 - c'est moi ou la doc de fpdf n'est pas à jour? (lorsque j'applique les infos de la doc, ça marche mais Spyder m'indique que les paramètres utilisés sont obsolettes...)

    merci :-)

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par clement_74 Voir le message
    1 - le pdf.output(path) nécessite la création d'un fichier sur le disque... pas de possibilité de créer le fichier dans un buffer? j'ai essayé de binariser le output, j'ai tounrer autour de stringio (sans succès).
    Ben si la fonction pdf.output() est prévue pour écrire dans un fichier, je vois mal comment tu pourrais lui dire d'écrire ailleurs. Maintenant peut-être en existe-t-il une autre?
    Toutefois je vois mal ce que tu ferais d'une string contenant ton PDF. ll te faudrait l'écrire dans un fichier à un moment ou à un autre pour pouvoir l'afficher...

    Citation Envoyé par clement_74 Voir le message
    2 - je n'ai pas trouvé d'autre moyen que fpdf pour faire des pdf via python pas d'autre moyen?
    Moi j'utilise PyPDF2. Et à mon avis il doit y en avoir beaucoup d'autres...

    Citation Envoyé par clement_74 Voir le message
    3 - c'est moi ou la doc de fpdf n'est pas à jour? (lorsque j'applique les infos de la doc, ça marche mais Spyder m'indique que les paramètres utilisés sont obsolettes...)
    Ben... ce serait pas le seul truc avec la doc pas à jour. Par exemple je me souviens que la doc de Postgres a mentionné pendant longtemps le champ "max_value" dans les séquences alors qu'il avait été placé dans la table "pg_sequences" depuis la version 10...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 217
    Par défaut
    Citation Envoyé par clement_74 Voir le message
    1 - le pdf.output(path) nécessite la création d'un fichier sur le disque... pas de possibilité de créer le fichier dans un buffer? j'ai essayé de binariser le output, j'ai tounrer autour de stringio (sans succès).
    2 - je n'ai pas trouvé d'autre moyen que fpdf pour faire des pdf via python pas d'autre moyen?
    3 - c'est moi ou la doc de fpdf n'est pas à jour? (lorsque j'applique les infos de la doc, ça marche mais Spyder m'indique que les paramètres utilisés sont obsolettes...)
    1 - Dans la doc ici c'est indiqué comment faire :
    output
    fpdf.output(name = '', dest = '')
    Description
    Send the document to some destination: standard output, a file or a byte string.
    The method first calls close if necessary to terminate the document.
    NOTICE: In Python 2 strings were raw data but in Python 3 strings are now unicode by default. If you are using Python 3.x you have to use pdf.output(dest='S').encode('latin-1') in order to get the output, if you don't do so the generated PDF will be invalid and depending on the viewer either not open at all or show up as some blank pages.

    Parameters name: The name of the file. Only used when writing to a file.

    dest: Destination to send the document. It can take one of the following values:

    I or D: write the document to sys.stdout. This is the default if no file name is given.
    F: save to a local file with the given name (may include a path). This is the default if a file name is given.
    S: return the document as a byte string.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def make_pdf():
      pdf = FPDF()
      pdf.add_page()
      pdf.set_font('Arial', 'B', 16)
      pdf.cell(40, 10, 'Hello World!')
      byte_string = pdf.output(dest='S').encode('latin-1')
    2 - comme l'indiquait Sve@r il y a pyPDF2.

    3 - fpdf n'a pas été mis à jour depuis il y a 5 ans, c'est donc peut-être logique qu'il y ait des choses qui soient obsolètes par rapport aux versions récentes de python. PyPDF2 lui est actuellement toujours mis à jour régulièrement ( dans le github dernière modification aujourd'hui).

    Ami calmant, J.P

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Citation Envoyé par clement_74 Voir le message
    je n'ai pas trouvé d'autre moyen que fpdf pour faire des pdf via python pas d'autre moyen?
    Autre solution , que je trouve beaucoup plus souple (pour le dev) : générer un fichier html
    Ensuite,
    - existe des bibliothèques html->pdf,
    - ou on peut "piloter" notre imprimante en demandant une sortie pdf de notre document html,
    - ou on peut afficher le document html directement dans notre navigateur (à 'utilisateur d'imprimer manuellement)

  5. #5
    Membre éprouvé
    Homme Profil pro
    Vagabong étudiant en annalyse du signal.
    Inscrit en
    Avril 2019
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vagabong étudiant en annalyse du signal.
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 130
    Par défaut dest="S" désué, utiliser BytesIO
    j'ai tounrer autour de stringio (sans succès).
    Un pdf est un fichier binaire, pas un fichier texte. Il faut donc chercher autour de BytesIO.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import io
    from fpdf import FPDF # pip install fpdf2
     
    def create_pdf():
        pdf = FPDF()
        file = io.BytesIO()
        pdf.output(file)
        return file.getvalue()
    Le problème de cette méthode est la consommation de RAM risqué. Si tu es certain de controler la taille maximum du pdf c'est bon. Sinon il vaut mieu voir du coté de tempfile.SpooledTemporaryFile qui permet de majorer la consommation de RAM.

Discussions similaires

  1. expliquer l'output buffering
    Par laurentSc dans le forum Langage
    Réponses: 3
    Dernier message: 07/12/2019, 12h04
  2. [SSIS] [2K8] Failed to add row to output buffer.
    Par clementratel dans le forum SSIS
    Réponses: 1
    Dernier message: 11/02/2011, 12h02
  3. Output buffering et entêtes
    Par frankiboy dans le forum Langage
    Réponses: 10
    Dernier message: 24/07/2009, 17h41
  4. [FPDF] capter l'erreur lors de l'output
    Par ozzmax dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 21/06/2007, 21h08
  5. Output buffering en PHP
    Par sylvanillo dans le forum Langage
    Réponses: 2
    Dernier message: 21/03/2007, 09h56

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