2009-01-27 7 views
2

J'ai une URL vers un fichier PDF et je veux diffuser le fichier PDF dans ma visionneuse de pages.Échouer un fichier PDF vers une page Web échouant

Je peux avec succès (je pense) récupérer le fichier PDF. Puis quand je fais le Response.BinaryWrite() j'obtiens un "le fichier est endommagé et n'a pas pu être réparé" erreur du lecteur d'Adobe.

Voici le code que j'ai:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      byte[] output = DoWork("Http://localhost/test.pdf"); 
      Response.Clear(); 
      Response.ContentType = "application/pdf"; 
      Response.AddHeader("content-disposition", "inline; filename=MyPDF.PDF"); 
      Response.AddHeader("content-length", output.Length.ToString()); 
      Response.BinaryWrite(output); 
      Response.End(); 
     } 
    } 

    public byte[] DoWork(string requestUrl) 
    { 
     byte[] responseData; 
     HttpWebRequest req = null; 
     HttpWebResponse resp = null; 
     StreamReader strmReader = null; 

     try 
     { 
      req = (HttpWebRequest)WebRequest.Create(requestUrl); 

      using (resp = (HttpWebResponse)req.GetResponse()) 
      { 
       byte[] buffer = new byte[resp.ContentLength]; 
       BinaryReader reader = new BinaryReader(resp.GetResponseStream()); 
       reader.Read(buffer, 0, buffer.Length); 
       responseData = buffer; 
      } 
     } 
     finally 
     { 
      if (req != null) 
      { 
       req = null; 
      } 

      if (resp != null) 
      { 
       resp.Close(); 
       resp = null; 
      } 
     } 

     return responseData; 

    } 
+0

vous êtes en mesure de le télécharger à l'aide, je veux dire laisser un navigateur (ou wget) faire le travail? – falstro

Répondre

0

Essayez de rincer la réponse après l'écriture binaire ...

Response.BinaryWrite(output); 
Response.Flush(); 
Response.End(); 

Sinon, au lieu de ligne, essayez de sortir le PDF en pièce jointe :

Response.AddHeader("Content-Disposition", "attachment;filename=MyPDF.PDF"); 
+0

Flush n'est pas une méthode sur BinaryReader –

+0

Remplacé par Close selon MSDN: Le vidage du flux ne videra pas son encodeur sous-jacent sauf si vous appelez explicitement Flush ou Close. – sduplooy

+0

rinçage d'un lecteur ?? ce qui n'a pas beaucoup de sens ... :) Vous lisez jusqu'à ce qu'il soit vide, n'est-ce pas? – falstro

1

Essayez d'enregistrer le fichier résultant sur votre disque. Ensuite, ouvrez le fichier avec un éditeur de texte. Peut-être qu'il y a des erreurs dans votre script/fichier source.

+0

bonne vérification de la santé mentale! –

+0

Cela m'a conduit à la réponse –

3

Apparemment, j'ai besoin d'utiliser ReadBytes() Pour une raison quelconque, lors de la lecture d'un PDF à partir d'une URL, vous n'obtenez pas tous les octets que vous avez demandés.

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      byte[] output = DoWork("Http://localhost/test.pdf"); 
      Response.Clear(); 
      Response.ContentType = "application/pdf"; 
      Response.AddHeader("content-disposition", "attachment"); 
      Response.AddHeader("content-length", output.Length.ToString()); 
      Response.BinaryWrite(output); 
      Response.End(); 
     } 
    } 

    public byte[] DoWork(string requestUrl) 
    { 
     byte[] responseData; 
     HttpWebRequest req = null; 
     HttpWebResponse resp = null; 
     StreamReader strmReader = null; 

     try 
     { 
      req = (HttpWebRequest)WebRequest.Create(requestUrl); 

      using (resp = (HttpWebResponse)req.GetResponse()) 
      { 
       byte[] buffer = new byte[resp.ContentLength]; 
       using (BinaryReader reader = new BinaryReader(resp.GetResponseStream())) 
       { 
        buffer = reader.ReadBytes(buffer.Length); 
        reader.Close(); 
       } 
       responseData = buffer; 
      } 
     } 
     finally 
     { 
      if (req != null) 
      { 
       req = null; 
      } 

      if (resp != null) 
      { 
       resp.Close(); 
       resp = null; 
      } 
     } 

     return responseData; 

    } 
0

Quand je l'ai fait en Perl l'autre jour (comme rapide pirater pour notre intranet), le nœud du script a été:

binmode(STDOUT); 
print "Content-type: application/pdf\n\n"; 
binmode(FILE); 
print <FILE>; 
close(FILE); 

Les points clés étant de faire en sorte que l'entrée et les flux de sortie sont en mode binaire, c'est-à-dire que vous avez trouvé, le PDF doit être interprété comme des données binaires dans toute la chaîne.

0

Vous pourriez être en mesure de simplifier votre code un peu en utilisant la classe WebClient

Here's the MSDN documentation. ne est pas aussi lourde que le niveau inférieur HttpWebRequest classe.

1

Vous pouvez aussi utiliser le FileStream lire le fichier

string strPath = Request.PhysicalApplicationPath 
        + "\\document\\Test.pdf"; 
FileStream fStream = new FileStream 
      (strPath, FileMode.Open, FileAccess.Read); 
StreamReader sReader = new StreamReader(fStream); 
Questions connexes