2011-08-16 80 views
1

我試圖做到以下幾點:腐敗PDF附件

  1. 從網頁
  2. 檢索生成的PDF創建電子郵件
  3. 附上PDF格式的消息
  4. 發送郵件

我能夠從網頁中檢索PDF並將其作爲附件發送。但是,當我嘗試打開附件時,出現可怕的「Adobe Reader無法打開'filename.pdf',因爲它不是支持的文件類型,或者是因爲文件已損壞」消息。

pdf是由MVC3頁面使用自定義ActionResult返回PDF生成的。它看起來像這樣

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(); 
    } 
} 

控制器方法是在這裏

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

這是問題的心臟代碼...

//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 
.... 

作爲一個實驗,我試着寫下載的文件到磁盤

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

Viola,我可以從磁盤上打開文件,而不會出現問題。

我爲了使附件可讀而錯過了什麼?

+0

有多大這個PDF ? –

+0

大概是27KB – seanicus

+0

啊......好吧,我在想也許它對於電子郵件來說可能太大了。現在我必須閱讀更接近的代碼haha –

回答

2

只是要清楚用戶,感謝@ rlb.usa

確保你關閉,你發送的對象後刷新你流」

+0

正如我上面提到的那樣,如果@ rlb.usa將這個答案放在答案中,我會很高興接受它。 – seanicus

2

對於我們來說,答案是不同的。

問題在於寫入數據庫時​​,我們使用GetBuffer()而不是ToArray()。因此,如果緩衝區爲256,則剩餘量作爲空字符附加到數據庫中的文檔。

我在這裏找到了答案http://forums.asp.net/t/1083910.aspx

我不認爲錯誤是在你的下載文件的代碼。我相信這個錯誤是由於文檔最初存儲在數據庫中的原因而發生的。確保在將文件寫入數據庫時​​不使用GetBuffer()方法。嘗試使用ToArray(),而不會將額外的字符附加到文件流的末尾。這裏有一個鏈接給你一些更多的細節:在您的PDF文檔的末尾%% EOF標記之後http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx

多餘的字符最有可能是什麼原因造成的信息: