2011-08-16 5 views
1

Je cherche à faire ce qui suit:Pièce jointe Corrupt PDF

  1. récupérer un pdf généré à partir d'une page Web
  2. Créer un message électronique
  3. Fixez le pdf au message
  4. Envoyer le message Je peux récupérer le pdf de la page Web et envoyer le message avec lui comme pièce jointe.

Toutefois, lorsque j'essaie d'ouvrir la pièce jointe, je suis redouté "Adobe Reader n'a pas pu ouvrir 'filename.pdf' car il ne s'agit pas d'un type de fichier pris en charge ou parce que le fichier a été endommagé".

Le fichier pdf est généré par une page MVC3 en utilisant un objet ActionResult personnalisé pour renvoyer le fichier pdf. On dirait que cette

public class EnrollmentExpectationsPdfResult : FileResult 
{ 
    IList<AdminRepEnrollmentExpectationViewModel> adminreps; 

    public EnrollmentExpectationsPdfResult(IList<AdminRepEnrollmentExpectationViewModel> adminrep) 
     : this("application/pdf", adminrep) 
    { } 

    public EnrollmentExpectationsPdfResult(string contentType, IList<AdminRepEnrollmentExpectationViewModel> adminrep) 
     : base(contentType) 
    { 
     adminreps = adminrep; 

    } 

    protected override void WriteFile(HttpResponseBase response) 
    { 
     var cd = new ContentDisposition 
     { 
      Inline = true, 
      FileName = "MyPDF.pdf" 
     }; 
     response.AppendHeader("Content-Disposition", cd.ToString()); 

     //Skip a bunch of boring font stuff 
     ... 

     var writer = PdfWriter.GetInstance(doc, response.OutputStream); 
     writer.PageEvent = new EnrollmentExpectationPDFPageEvent();    
     doc.Open(); 

     //Skip the doc writing stuff 
     ... 

     doc.Close(); 
    } 
} 

La méthode du contrôleur est ici

public ActionResult EnrollmentExpectationsPDF() 
{ 
    //skip a bunch a database stuff 
    ... 
    return new EnrollmentExpectationsPdfResult(adminList); 
} 

Voici le code au cœur du problème ...

//Get PDF 
CredentialCache cc = new CredentialCache(); 
cc.Add(
     new Uri("http://myserver/mypdfgeneratingpage"), 
     "NTLM", 
     new NetworkCredential("myusername", "mypassword")); 

var webRequestObject = (HttpWebRequest)WebRequest.Create("http://iapps.national.edu/erp/Reports/EnrollmentExpectationsPDF"); 
webRequestObject.Credentials = cc; 
var response = webRequestObject.GetResponse(); 
var webStream = response.GetResponseStream(); 

//Create Mail 
System.Net.Mail.MailMessage eMail = ... 

//Skipping to attachment stuff 
ContentType ct = new ContentType() 
{ 
    MediaType = MediaTypeNames.Application.Pdf, 
    Name = "EnrollmentExpecations_2.pdf" 
}; 

Attachment a = new Attachment(webStream, ct); 
eMail.Attachments.Add(a); 

//Send Message 
.... 

A titre d'expérience, j'essayé d'écrire le fichier téléchargé sur le disque

MemoryStream ms = new MemoryStream(); 
var fileStream = File.Create("C:\\MyPDF.pdf"); 
webStream.CopyTo(fileStream); 

Alto, je suis capable d'ouvrir le fichier à partir du disque sans problème.

Qu'est-ce qui me manque pour rendre la pièce jointe lisible?

+0

Quelle est la taille PDF ? –

+0

Il est environ 27KB – seanicus

+0

ah ... ok, je pensais que c'était peut-être trop gros pour le courrier électronique.Maintenant, je dois lire le code plus près haha ​​ –

Répondre

2

Juste pour faire comprendre aux utilisateurs, grâce à @ rlb.usa

« Assurez-vous que vous fermez et rincez votre flux après avoir envoyé l'objet »

+0

comme je l'ai mentionné ci-dessus, si @ rlb.usa mettra cela dans une réponse, je serais ravi de l'accepter. – seanicus

2

Pour nous, la réponse était différente .

Le problème était lors de l'écriture dans la base de données, nous utilisions GetBuffer() au lieu de ToArray(). Donc, si le tampon était 256, la quantité restante a été ajoutée au document dans la base de données en tant que caractères nuls.

J'ai trouvé la réponse ici http://forums.asp.net/t/1083910.aspx

Je ne pense pas que l'erreur est dans votre code pour télécharger le document. Je crois que l'erreur se produit en raison de la façon dont le document est initialement stocké dans la base de données. Assurez-vous que vous n'utilisez pas la méthode GetBuffer() lors de l'écriture du fichier dans la base de données. Essayez à la place d'utiliser ToArray() et il n'ajoutera pas de caractères supplémentaires à la fin de votre flux de fichiers. Voici un lien pour vous donner plus de détails: http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx

Les caractères supplémentaires après la balise EOF %% à la fin de votre document PDF sont très probablement ce qui est à l'origine du message: