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

C# Discussion :

PDF téléchargé vide


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 11
    Par défaut PDF téléchargé vide
    Bonjour,

    Je cherche à afficher (et télécharger) au client des PDFs hébergés sur un autre site et auquel j'ai accès par protocole HTML! J'arrive à télécharger le fichier mais à l'ouverture celui-ci est complètement vide (toutes les pages sont blanches)! Quelqu'un aurait-il une solution? Voici mon code

    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
    string pathPDF = "http://une_uri.pdf";
    WebRequest request = WebRequest.Create(pathPDF);
    WebResponse myResponse = request.GetResponse();
    Stream myStream = myResponse.GetResponseStream();
    StreamReader myStreamReader = new StreamReader(myStream);
    String strPDF = myStreamReader.ReadToEnd();
    myResponse.Close();
    myStream.Close();
    myStreamReader.Close();
     
    Response.Clear();
    Response.ContentType = "application/.pdf";
    Response.AddHeader("Content-Length", textResult.Length.ToString());
    Response.AddHeader("Content-Disposition", "attachment; filename=" + "nom_du_fichier" + ".pdf");
    Response.AddHeader("Extension", Path.GetExtension(pathPDF));
    Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1254");
    Response.Write(textResult);
    Response.Flush();
    Response.End();

    Merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Le fichier téléchargé a quelle taille?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Le format PDF n'est pas du texte, c'est un format binaire... Quand tu essaies de le lire avec un StreamReader, ça utilise (par défaut) l'encodage UTF-8. Ensuite tu l'écris dans la réponse avec l'encodage Windows-1254 (*). Bref, au final tu modifies complètement les données binaires d'origine, ça revient à passer ton PDF au mixer

    Donc, il ne faut absolument pas utiliser un StreamReader, il faut manipuler directement les données binaires et les écrire sur le flux de la réponse. Pour te simplifier un peu la vie, je te conseille d'utiliser WebClient plutôt que WebRequest :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    string pathPDF = "http://une_uri.pdf";
    WebClient wc = new WebClient();
    byte[] data = wc.DownloadData(pathPDF);
     
    Response.Clear();
    Response.ContentType = "application/.pdf";
    Response.AddHeader("Content-Length", data.Length.ToString());
    Response.AddHeader("Content-Disposition", "attachment; filename=" + "nom_du_fichier" + ".pdf");
    Response.AddHeader("Extension", Path.GetExtension(pathPDF));
    Response.OutputStream.Write(data, 0, data.Length);
    (Note que j'ai enlevé l'encodage de la réponse, qui ne sert à rien vu que le contenu est binaire)

    Autre chose : si le PDF est un peu gros et que ton serveur subit une charge importante, il vaut mieux éviter de charger le fichier complet en mémoire. A la place, tu peux copier le PDF dans la réponse au fur et à mesure que tu le reçois :

    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
    string pathPDF = "http://une_uri.pdf";
    WebClient wc = new WebClient();
    using (Stream pdfStream = wc.OpenRead(pathPDF))
    {
        Response.Clear();
        Response.ContentType = "application/.pdf";
        Response.AddHeader("Content-Length", data.Length.ToString());
        Response.AddHeader("Content-Disposition", "attachment; filename=" + "nom_du_fichier" + ".pdf");
        Response.AddHeader("Extension", Path.GetExtension(pathPDF));
     
        byte[] buffer = new byte[4096];
        int bytesRead;
        while((bytesRead = pdfStream.Read(buffer, 0, buffer.Length) != 0)
        {
            Response.OutputStream.Write(buffer, 0, bytesRead);
        }
    }
    (*) c'est fait exprès d'ailleurs ? En général on utilise 1252. 1254 c'est pour le Turc, mais c'est peut-être ce que tu veux...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 11
    Par défaut
    Merci beaucoup, ta première solution fonctionne parfaitement! Pour la seconde, Visual indique un problème de conversion 'bool' vers 'int' pour la condition du While! Je vais m'y pencher.

    (*) non je débute en c# et j'ai chopé un script sur le net qui semblait répondre à mon problème -je n'ai pas fait attention.

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par BillyKane59 Voir le message
    Merci beaucoup, ta première solution fonctionne parfaitement! Pour la seconde, Visual indique un problème de conversion 'bool' vers 'int' pour la condition du While! Je vais m'y pencher.

    (*) non je débute en c# et j'ai chopé un script sur le net qui semblait répondre à mon problème -je n'ai pas fait attention.
    Il ne faut pas oublier le != 0

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par BillyKane59 Voir le message
    Pour la seconde, Visual indique un problème de conversion 'bool' vers 'int' pour la condition du While!
    Tu n'aurais pas remplacé '=' par '==' ? Je sais que ça pouvait ressembler à une erreur dans mon code, mais ce n'en est pas une. Ca affecte le résultat de Read à la variable bytesRead, et ça vérifie si le résultat est différent de 0

    Tu peux aussi l'écrire comme ça si ça te semble plus clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        int bytesRead = pdfStream.Read(buffer, 0, buffer.Length);
        while(bytesRead  != 0)
        {
            Response.OutputStream.Write(buffer, 0, bytesRead);
            bytesRead = pdfStream.Read(buffer, 0, buffer.Length);
        }
    Perso j'aime pas trop parce que ça fait répéter le pdfStream.Read...


    EDIT: en fait je réalise qu'il y avait quand même une erreur dans mon code d'origine : il manquait une parenthèse fermante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        while((bytesRead = pdfStream.Read(buffer, 0, buffer.Length)) != 0)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 11
    Par défaut
    C'est vrai que le PDF s'ouvre plus vite avec cette méthode. Encore merci de ton aide.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/04/2011, 21h21
  2. flux pdf (JasperReport) vide
    Par pcouas dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 22/08/2008, 14h53
  3. [FPDF] mon pdf est vide 1 fois sur 10
    Par renaudjuif dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 20/05/2008, 11h26
  4. Gestion des PDF vide
    Par lucyole dans le forum iReport
    Réponses: 1
    Dernier message: 26/03/2008, 11h50
  5. [IReport] PDF vide
    Par Devilpika dans le forum iReport
    Réponses: 6
    Dernier message: 31/01/2007, 15h46

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