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 :

Buffer et affichage sans fichiers


Sujet :

Python

  1. #1
    Membre régulier
    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 : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Points : 72
    Points
    72
    Par défaut Buffer et affichage sans fichiers
    Bonjour,

    je cherche à générer un pdf via python (jusque là tout va bien) et j'aimerais deux choses:
    1 - Que le pdf en question n'ait pas besoin de s'enregistrer sur le disque pour s'ouvrir (en gros je veux qu'il s'ouvre à la suite du code).
    2 - Qu'un objet image (un code barre en fait, généré dans le code lui même) puisse s'intégrer au pdf sans (lui non plus) avoir à s'enregistrer sur le disque).

    je suis parti sur l'utilisation de buffers pour ce qui est d'arriver à créer des objets "virtuels"... (1 pour le pdf et 1 pour le code barres)

    Par contre je commence à tourner en rond entre les tutos et la doc... et de l'aide serait bienvenue!
    ci dessous un bout de code qui tourne (ça fait correctement un pdf mais il s'enregistre sur le disque) et le code barre est bien généré mais je n'arrive pas à le faire avaler au pdf... là encore j'arrive à faire un code barres sous forme d'image que j'enregistre sur disque mais pas à transférer l'info/format du code barre directement dans le pdf.

    bon la chose est pas des plus propre mais c'est le bout de code qui tourne le mieux après moults tentatives/tâtonnages...

    ah et puis dernière question: si vous savez comment centrer le long texte "multilignes" dans la cellule du pdf je suis preneur! dans l'exemple ci-dessus, le centrage ne marche pas.

    Merci à vous :-)

    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
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    from io import BytesIO
    from reportlab.pdfgen import canvas
    from reportlab.lib import colors
    from reportlab.lib.pagesizes import letter, A4
    from reportlab.lib.units import mm
    from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Image
    from reportlab.lib.styles import getSampleStyleSheet
    from barcode.writer import ImageWriter
    import barcode
     
    # Créer un objet BytesIO pour stocker le PDF en mémoire
    buffer = BytesIO()
    styleSheet = getSampleStyleSheet()
     
    I = Image("forward.gif")
    I.drawHeight = 20*mm
    I.drawWidth = 20*mm
    print(I)
     
    number = '230000123456'
    buffer0 = BytesIO()
    barcode_image = barcode.get("Code128", number, writer=ImageWriter())
    barcode_image.write(buffer0)
    J = Image(buffer0.getvalue())
    J.drawHeight = 10*mm
    J.drawWidth = 30*mm
    print(J)
     
    pdf_canvas2 = canvas.Canvas("test.pdf", pagesize=letter)
    width, height = A4
     
    # un texte long...
    multilignes = """<p style="text-align:center">
                     Cette ligne sera centrée.<br />
                     Ainsi que cette ligne.<br />
                     Cette ligne sera centrée.<br />
                     Ainsi que cette ligne.<br />
                     Cette ligne sera centrée.<br />
                     Ainsi que cette ligne.<br />
                     Cette ligne sera centrée.<br />
                     Ainsi que cette ligne.<br />
                     Et puis celle là aussi...</p>"""
     
    #essai d'instance d'un texte pour simplifier le chargement de la data
    P0 = Paragraph(multilignes, styleSheet["BodyText"])
     
    # Création de la data qui s'intégrera à la table
    data = [["W", "X", "Y", "Z", "Z", "Z", I, "Z"],
            ["", "", "", "", "", "", "", ""],
            ['A', "", P0, "", "", "", "", ""],
            ['B', "", "", "", "", "", "", ""],
            ['C', "", "", "", "", "", "", ""],
            ['D', "", "", "", "", "", "", ""],
            ['E', "", "", "", "", "", "", ""],
            ['F', "", "", "", "", "", "", ""],
            ['G', "", "", "", "", "", "", ""],
            ["H", "", ""]]
     
    # Création de la table
    table = Table(data)#, colWidths=[45*mm, 100*mm,45*mm], rowHeights=[10*mm, 10*mm, 10*mm, 10*mm])
     
    # Définition d'un style à la table
    style = TableStyle([('BACKGROUND', (0, 0), (-1, 0), '#77ccef'),
                        ('TEXTCOLOR', (0, 0), (-1, 0), colors.pink),
     
                        ('SPAN', (0, 1), (1, 1)),
                        ('SPAN', (2, 1), (3, 1)),
                        ('SPAN', (4, 1), (5, 1)),
                        ('SPAN', (6, 1), (7, 1)),
     
                        ('SPAN', (0, 2), (1, 2)),
                        ('SPAN', (2, 2), (5, 2)),
                        ('SPAN', (6, 2), (7, 2)),
     
                        ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                        ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
                        ('ALIGN', (1, 1), (1, 1), 'RIGHT'),
                        ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
                        ('BOTTOMPADDING', (0, 0), (-1, 0), 12),
                        ('LINEBELOW', (0,-1), (-1,-1), 1, colors.lightgreen),
                        ('INNERGRID', (0, 0), (-1, -1), 1, colors.green),
                        ('BOX', (0, 0), (-1, -1), 3, colors.black)])
    # affectation du style à la table
    table.setStyle(style)
    # positionne et dessine le tableau sur le Canvas
    table.wrapOn(pdf_canvas2, width-20*mm, height-150*mm)
    table.drawOn(pdf_canvas2, 12*mm, 150)
    # Sauvegarde du PDF dans l'objet BytesIO
    pdf_canvas2.save()
    # Affichage  du pdf à partir du buffer...
    pdf_canvas2.showPage()

  2. #2
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Bonjour,
    Citation Envoyé par clement_74 Voir le message
    Par contre je commence à tourner en rond entre les tutos et la doc... et de l'aide serait bienvenue!
    Si ta demande reste sans réponse, c'est probablement parce que tu ne demandes pas une aide sur la programmation Python. Ta demande vise plutôt a t'affranchir du travail de recherche qui t'incombe.
    C'est à toi de t'approprier les outils que tu utilises. La doc et les tutoriels ont été écrits pour cela. S'y confronter est le lot de tous. C'est parfois fastidieux, laborieux et ça peut prendre du temps, mais c'est ainsi.
    Donc, comme on dit dans le jargon : RTFM .

    édit: reformulation
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  3. #3
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    ... J'aurais probablement pas dû te répondre. Ma réponse est plutôt maladroite et ne fera pas avancer le schmilblick .
    Ce qui est dit est dit (et ça reste ce que je pense) . Donc je laisse.
    Mais bon, je suis peut-être victime de la lumière bleue et je pense qu'il n'y a rien de constructif dans ma réponse.
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  4. #4
    Membre régulier
    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 : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2019
    Messages : 113
    Points : 72
    Points
    72
    Par défaut
    Bonjour,
    en effet, pas certains que ce type de réponse soit "utile".

    Je peux toutefois comprendre que ma demande puisse être perçue comme une approche visant à "faire faire" quelque chose que je pourrais faire tout seul...
    Mais n'est-ce pas le rôle d'un forum que de se donner des réponses voire parfois carrément des solutions? (il y en a plein des solutions (à adapter) ici et c'est je trouve motivant, et constructif).
    La programmation n'est pas mon domaine et jusqu'ici j'ai toujours eu des réponses qui étaient source d'apprentissage.

    Certes mon bout de code n'avait rien de bien élégant.... il était même un peu maladroit parce qu'au milieu de mes bricoles il y avait des choses qui devenaient "absurdes".
    mais je pense que ce que je cherchais à faire était compréhensible pour pas mal de monde.

    Peut être que la direction que je prenais n'était juste pas la bonne ou pas bien gérée... Qu'une bibliothèque "autre" gérait ça très bien...

    bref, j'ai finalement un peu avancé depuis mon premier message.
    actuellement j'arrive à afficher mon pdf depuis un buffer.
    et à y inclure des images qui elles aussi proviennent d'un buffer.

    loin d'être convaincu que mon objectif est atteint, finalement ce que je voulais faire finalement "tourne" (c'est déjà une étape).
    il reste (au moins) à voir/revoir les clotures et éventuellement le vidage des buffers + autres tournures

    mais bon, je clos le sujet :-)

    au cas ou je pose le bout de code tel qu'il est actuellement:

    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
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    import qrcode
    from barcode import EAN13
    import io
    from io import BytesIO
    import PIL.Image as ImagePil
    from reportlab.pdfgen import canvas
    from reportlab.lib import colors
    from reportlab.lib.pagesizes import letter, A4
    from reportlab.lib.units import mm
    from reportlab.platypus import Table, TableStyle, Paragraph, Image
    from reportlab.lib.styles import getSampleStyleSheet
    from barcode.writer import ImageWriter
    import fitz
     
    data = ["202300001234"]
    qr = qrcode.QRCode(version = 1,
                       error_correction=qrcode.constants.ERROR_CORRECT_L,
                       box_size=10,
                       border=4)
    qr.add_data(data)
    qr.make(fit=True)
     
    qr_img = qr.make_image(fill_colo="black", back_color="white")
    #r_img.show()
     
    buffer_cb = BytesIO()
    my_code = EAN13(str(202300001234), writer=ImageWriter()).write(buffer_cb)
    img = ImagePil.open(io.BytesIO(buffer_cb.getvalue()))
    #img.show()
     
    # Créer un objet BytesIO pour stocker le PDF en mémoire
    buffer = BytesIO()
    styleSheet = getSampleStyleSheet()
     
    I = Image("forward.gif")
    I.drawHeight = 20 * mm
    I.drawWidth = 20 * mm
    #print(I)
     
    number = '230000123456'
    J = Image(io.BytesIO(buffer_cb.getvalue()))
    J.drawHeight = 10 * mm
    J.drawWidth = 30 * mm
    #print(J)
     
    buffer_pdf = BytesIO()
    width, height = A4
    pdf_canvas2 = canvas.Canvas(buffer_pdf, pagesize=letter)
     
     
    multilignes = """<p style="text-align:center">
                     Cette ligne sera centrée.<br />
                     Ainsi que cette ligne.<br />
                     Cette ligne sera centrée.<br />
                     Ainsi que cette ligne.<br />
                     Cette ligne sera centrée.<br />
                     Ainsi que cette ligne.<br />
                     Cette ligne sera centrée.<br />
                     Ainsi que cette ligne.<br />
                     Et puis celle là aussi...</p>"""
     
    # essai d'instance d'un texte pour simplifier le chargement de la data
    P0 = Paragraph(multilignes, styleSheet["BodyText"])
     
    # Création de la data qui s'intégrera à la table
    data = [["W", "X", "Y", "Z", "Z", "Z", J, "Z"],
            ["", "", "", "", "", "", "", ""],
            ['A', "", P0, "", "", "", "", ""],
            ['B', "", "", "", "", "", "", ""],
            ['C', "", "", "", "", "", "", ""],
            ['D', "", "", "", "", "", "", ""],
            ['E', "", "", "", "", "", "", ""],
            ['F', "", "", "", "", "", "", ""],
            ['G', "", "", "", "", "", "", ""],
            ["H", "", ""]]
     
    # Création de la table
    table = Table(data)  # , colWidths=[45*mm, 100*mm,45*mm], rowHeights=[10*mm, 10*mm, 10*mm, 10*mm])
     
    # Définition d'un style à la table
    style = TableStyle([('BACKGROUND', (0, 0), (-1, 0), '#77ccef'),
                        ('TEXTCOLOR', (0, 0), (-1, 0), colors.pink),
     
                        ('SPAN', (0, 1), (1, 1)),
                        ('SPAN', (2, 1), (3, 1)),
                        ('SPAN', (4, 1), (5, 1)),
                        ('SPAN', (6, 1), (7, 1)),
     
                        ('SPAN', (0, 2), (1, 2)),
                        ('SPAN', (2, 2), (5, 2)),
                        ('SPAN', (6, 2), (7, 2)),
     
                        ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                        ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
                        ('ALIGN', (1, 1), (1, 1), 'RIGHT'),
                        ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
                        ('BOTTOMPADDING', (0, 0), (-1, 0), 12),
                        ('LINEBELOW', (0, -1), (-1, -1), 1, colors.lightgreen),
                        ('INNERGRID', (0, 0), (-1, -1), 1, colors.green),
                        ('BOX', (0, 0), (-1, -1), 3, colors.black)])
    table.setStyle(style)
    table.wrapOn(pdf_canvas2, width - 20 * mm, height - 150 * mm)
    table.drawOn(pdf_canvas2, 12 * mm, 150)
    pdf_canvas2.save()
    pdf = fitz.open(stream=buffer_pdf.getvalue(), filetype="pdf")
    page = pdf[0]
    pix = page.get_pixmap()
    image_pdf = ImagePil.frombytes("RGB", (pix.width, pix.height), pix.samples)
    image_pdf.show()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage de fichier.txt et modification des couleurs
    Par Furius dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/12/2005, 17h33
  2. affichage sans répétitions
    Par devdébuto dans le forum C
    Réponses: 24
    Dernier message: 19/11/2005, 15h28
  3. affichage sans répétitions
    Par devdébuto dans le forum C
    Réponses: 10
    Dernier message: 16/11/2005, 22h10
  4. Problème affichage de fichiers d'un dossier
    Par TommyWeb dans le forum Langage
    Réponses: 4
    Dernier message: 08/10/2005, 15h15
  5. Réponses: 2
    Dernier message: 06/10/2005, 10h35

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