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 :

création de fichier en mémoire


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 481
    Par défaut création de fichier en mémoire
    J'ai un programme qui me permet de générer des fichiers pdf sur le disque dur.
    Je souhaite pouvoir générer ces fichiers seulement dans la mémoire, car ils sont à usage unique et n'ont pas vocation à être sauvegardés sur un support physique.

    Comment faire ?

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Tu peux surement passer par un pseudo-fichier StringIO et sa version optimisée cStringIO.

    Regarde ce thread pour un exemple.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Sinon, au lieu de le stocker en mémoire (qui peut sérieusement ralentir le pc si le fichier devient gros) tu peux utiliser un fichier temporaire créé avec tempfile.TemporaryFile

  4. #4
    Membre éclairé
    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2004
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : développeur
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2004
    Messages : 481
    Par défaut
    La taille des fichiers ne dépasse guère 50Ko.
    La méthode cStringIO me semble donc appropriée.

    En fait, je dispose d'un formulaire sur une page web.
    Lorsque l'utilisateur sélectionne certaines options, un fichier pdf doit être créé côté serveur et envoyé sur l'imprimante de l'utilisateur.

    Procédons par étape.

    Pour l'instant, j'ai réussi à créer le fichier pdf sur le disque dur et à générer un lien vers ce fichier. En cliquant sur le lien, une fenêtre adobe reader s'ouvre dans le navigateur pour afficher le fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #fonction qui crée le lien
    id_pdf = str(DateTime().millis())
    Genere_PDF('enveloppe_offre', donnee, id_pdf)
    texte = '<br><a href="Enveloppe/impression_num_' + id_pdf + '.pdf" target="new">Imprimer l\'enveloppe</a>'
    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
     
    #fonction qui crée le contenu du fichier en pdf
    from reportlab.pdfgen import canvas
    from reportlab.lib.units import mm
    from reportlab.pdfbase import pdfutils
     
    def Genere_PDF(quoi, donnee, id_pdf):
    	font = "Times-Roman"
    	font_size = 20
    	if quoi == 'enveloppe_offre' :
    		destination_file = "D:/Enveloppe/offre_num_" + donnee[0] + ".pdf"
    		PAGE_HEIGHT = 114*mm
    		PAGE_WIDTH = 162*mm
    	my_canvas = canvas.Canvas(destination_file, (PAGE_WIDTH, PAGE_HEIGHT))
    	my_canvas.setFont(font, font_size)
    	if quoi == 'enveloppe_offre' :#on convertit en unicode sinon les caracteres accentues ne sont pas pris en compte
    		my_canvas.drawString(33 * mm, 64*mm, unicode(donnee[1], 'cp1252'))
    		my_canvas.drawString(33 * mm, 51*mm, unicode(donnee[2], 'cp1252'))
    		my_canvas.drawString(33 * mm, 38*mm, unicode(donnee[3], 'cp1252'))
    		my_canvas.drawString(33 * mm, 23*mm, unicode(donnee[4], 'cp1252'))
    	my_canvas.save()

    Maintenant, il faudrait que le fichier soit créé en mémoire côté serveur et envoyé au navigateur client qui va ouvrir une fenêtre adobe reader pour afficher le fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #fonction qui ouvre le fichier en mémoire
    import cStringIO
    output = cStringIO.StringIO()
    id_pdf = str(DateTime().millis())
    Genere_PDF('enveloppe_offre', donnee, id_pdf, output)
     
    #c'est là qu'il faut envoyer le output au navigateur pour qu'il l'ouvre dans une fenêtre adobe
     
    output.close()
    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
     
    #fonction qui crée le contenu du fichier en pdf
    from reportlab.pdfgen import canvas
    from reportlab.lib.units import mm
    from reportlab.pdfbase import pdfutils
     
     
    def Genere_PDF(quoi, donnee, id_pdf, output):
    	font = "Times-Roman"
    	font_size = 20
    	if quoi == 'enveloppe_offre' :
    		destination_file = output
    		PAGE_HEIGHT = 114*mm
    		PAGE_WIDTH = 162*mm
    	my_canvas = canvas.Canvas(output, (PAGE_WIDTH, PAGE_HEIGHT))
    	my_canvas.setFont(font, font_size)
    	if quoi == 'enveloppe_offre' :#on convertit en unicode sinon les caracteres accentues ne sont pas pris en compte
    		my_canvas.drawString(33 * mm, 64*mm, unicode(donnee[1], 'cp1252'))
    		my_canvas.drawString(33 * mm, 51*mm, unicode(donnee[2], 'cp1252'))
    		my_canvas.drawString(33 * mm, 38*mm, unicode(donnee[3], 'cp1252'))
    		my_canvas.drawString(33 * mm, 23*mm, unicode(donnee[4], 'cp1252'))
    	my_canvas.save()
    Enfin, au lieu d'ouvrir une fenêtre adobe, il faut envoyer le fichier sur l'imprimante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #fonction qui ouvre le fichier en mémoire
    import cStringIO
    output = cStringIO.StringIO()
    id_pdf = str(DateTime().millis())
    Genere_PDF('enveloppe_offre', donnee, id_pdf, output)
     
    #c'est là qu'il faut envoyer le output à l'imprimante
     
    output.close()

  5. #5
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Ton document étant envoyé, l'impression se passe côté client, python n'est plus concerné.
    Il existe peut-être une astuce pour forcer l'impression à partir du navigateur mais l'utilisateur doit surement avoir son mot à dire...
    Peut être est-ce une possibilité du format PDF.
    Je te conseille de te rapprocher des forums concernés.

    Bonne continuation.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Il faut fournir le mime-type application/pdf au niveau du header http dans la variable Content-type pour que le navigateur client comprenne comment l'ouvrir.

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

Discussions similaires

  1. Création fichier en mémoire
    Par SONY30 dans le forum Langage
    Réponses: 2
    Dernier message: 30/07/2010, 13h13
  2. Création de fichier
    Par gsxr man dans le forum ASP
    Réponses: 2
    Dernier message: 28/06/2004, 22h19
  3. Détourner une fonction pour copier un fichier en mémoire
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/11/2003, 08h29
  4. Réponses: 8
    Dernier message: 03/09/2003, 00h47
  5. création de fichiers .x
    Par Pazz dans le forum DirectX
    Réponses: 1
    Dernier message: 03/12/2002, 00h33

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