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

Servlets/JSP Java Discussion :

Afficher le flux d'un PDF


Sujet :

Servlets/JSP Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 16
    Points
    16
    Par défaut Afficher le flux d'un PDF
    Je souhaite afficher le flux d'un pdf généré via iText, depuis le serveur.
    Si j'ai bien des données dans ce flux, j'affiche le pdf dans une nouvelle popup, si je n'ai pas de données correcte ou une erreur, j'affiche un message sur la page en cours (Edition.jsp)

    Fichier Edition.jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <s:form id="pdf" action="ExportPdf" theme="simple" >  
       ...
        <sj:menu name="typeEdition" cssClass="edition" list="listeEditions" />
    </s:form>
    struts.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <action name="ExportPdf" class="ExportPdfAction">
       <result name="success" type="stream">
           <param name="inputName">inputStreamPdf</param> 
           <param name="contentType">application/pdf</param> 
           <param name="contentDisposition">filename="myFile.pdf"</param> 
           <param name="bufferSize">2048</param>
        </result>
        <result name="error">/WEB-INF/web/Edition.jsp</result>          
    </action>
    javascript, lors du click sur l'item menu
    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
     
    //  click sur l'item du menu 
    $('.edition').bind('click', function(event, data) {
        $('#pdf').submit();       
    }); 
     
    $('#pdf').submit(function(event) {
        // stop le submit normal
        event.preventDefault();
     
        // post avec les paramètres
        var posting = $.post( $( this ).attr( 'action' ), $('#pdf').serialize());
     
        // attend le résultat
        posting.done(function( data, event ) {
        if (data.substring(0,4) != '%PDF') {
           alert ("error");         
        } else {
           // le format pdf est reconnu mais pas affiché (le stream est dans l'url, mais pas dans le contenu)
           window.open('data:application/pdf,'+ data, 'pageEdition', 'menubar=no, height=600, width=900' );
        }   
    });
    Donc, je reçoi des données dans data (%PDF-1.4..) mais impossible d'afficher le pdf correctement.
    Une solution ?
    Merci

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    up

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Je ne sais pas trop ce que fait ton code, mais
    le principe habituel est que ta servlet écrive le flux pdf dans la réponse.

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    En fait, je reçois bien le flux du PDF du côté client mais je n'arrive pas à l'afficher !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // attend le résultat
        posting.done(function( data, event ) {
        if (data.substring(0,4) != '%PDF') {
           alert ("error");         
        } else {
           // le format pdf est reconnu mais pas affiché (le stream est dans l'url, mais pas dans le contenu)
           window.open('data:application/pdf,'+ data, 'pageEdition', 'menubar=no, height=600, width=900' );
        }
    data contient le flux, mais lors du window.open(..., le flux est affiché dans la barre d'adresse mais pas dans le document !

    Merci

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    C'est un peu normal, ce que tu as récupéré, c'est le document pdf (sous forme d'une suite d'octets)... c'est le "contentType" qui fait que le navigateur peut faire le lien avec un plugin pour afficher correctement ton document.

    Ce que tu pourrais faire :

    - tu appelles ton serveur (ajax) pour lui demander de générer le document pdf que tu placeras dans un endroit accessible pour le client
    - tu renvois un statut et/ou un message au client
    - le client interprète le statut pour savoir si ça c'est bien passé :

    1. si ça c'est bien passé, tu fais ton window.open avec l'url du document pdf généré en 1
    2. sinon, tu affiches un message d'erreur
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    C'est un peu normal, ce que tu as récupéré, c'est le document pdf (sous forme d'une suite d'octets)... c'est le "contentType" qui fait que le navigateur peut faire le lien avec un plugin pour afficher correctement ton document.
    Le "ContentType" est spécifié sur l'ouverture de la feuille data:application/pdf suivi des bytes...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    window.open('data:application/pdf,'+ data, 'pageEdition', 'menubar=no, height=600, width=900' );

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu ne peux pas mettre du binaire comme ça derrière ton data (non didjou).



    Le contenu binaire doit être protégé. Soit les données non compatibles doivent êtres transformées sous la forme %XX, soit tu doit utiliser du base64:


    Ensuite, je viens de vérifier. Sous firefox ici, autant ça marche avec des images, autant dès que ça implique un plugin, ça foire. Par contre sous Opera, ça marche.

    Tu peux tester cela ici:
    http://dopiaza.org/tools/datauri/index.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    data:application/pdf;base64,JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFuZyhubC1CRSkgL1N0cnVjdFRyZWVSb290IDggMCBSL01hcmtJbmZvPDwvTWFya2VkIHRydWU+Pj4+DQplbmRvYmoNCjIgMCBvYmoNCjw8L1R5cGUvUGFnZXMvQ291bnQgMS9LaWRzWyA0IDAgUl0gPj4NCmVuZG9iag0KMyAwIG9iag0KPDwvQXV0aG9yKEhhbnMpIC9DcmVhdGlvbkRhdGUoRDoyMDExMTIwNjEzMTcxMyswMScwMCcpIC9Nb2REYXRlKEQ6MjAxMTEyMDYxMzE3MTMrMDEnMDAnKSAvUHJvZHVjZXIo
    ETC ETC (trop long pour le forum)

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 24
    Points : 16
    Points
    16
    Par défaut [Résolu]
    J'avais laissé ce code un peu de coté, mais j'ai re-essayé avec la conversion en Base64 coté serveur, et çà fonctionne !! L'erreur est de convertir coté client (les données reçues en String posent problème pour la conversion, plutôt que des octets)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    byte[] buff = buffer.toByteArray();
    ByteArrayOutputStream os = new ByteArrayOutputStream();
     
    sun.misc.BASE64Encoder encod = new sun.misc.BASE64Encoder();    	
     
    try {
      encod.encode(buff, os);
    } catch (IOException e) {
      logger.error(e.getMessage(), e);
    }
     
    InputStream is = new ByteArrayInputStream(os.toByteArray());

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

Discussions similaires

  1. Afficher un flux pdf dans une nouvelle fenetre
    Par snopims dans le forum ASP.NET
    Réponses: 3
    Dernier message: 03/09/2009, 19h29
  2. Afficher un flux PDF dans une page HTML
    Par dachu dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 21/04/2008, 11h55
  3. Afficher un flux
    Par bolo dans le forum ASP
    Réponses: 1
    Dernier message: 13/11/2005, 18h30
  4. Pb, Transformation d'un flux HTML en PDF
    Par elitost dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 05/09/2005, 17h28
  5. [XSL] Afficher un flux XML
    Par minimoi1234 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 18/02/2005, 09h35

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