2017-07-17 66 views
0

itext sharp在使用c#asp.net發送電子郵件時創建了損壞的PDF,但在本地服務器上下載時正在使用localhost。在存儲流中附加PDF到郵件會導致PDF損壞

using (MemoryStream ms = new MemoryStream()) 
     { 
      try 
      { 
       Document document = new Document(PageSize.A4, 25, 25, 30, 30); 
       PdfWriter writer = PdfWriter.GetInstance(document, ms); 
       writer.CloseStream = false; 
       document.Open(); 
       Font fnt = FontFactory.GetFont("Times New Roman", 12); 
       PdfPTable PdfTable = new PdfPTable(1); 

       var path = Server.MapPath(@"~/image.png"); 
       iTextSharp.text.Image logopng = 
       iTextSharp.text.Image.GetInstance(path); 
       document.Add(logopng); 
       logopng.ScaleAbsolute(120f, 155.25f); 
       logopng.SpacingBefore = 10f; 
       logopng.SpacingAfter = 1f; 
       logopng.Alignment = Element.ALIGN_LEFT; 

       string dtt = todaydate.Text; 
       PdfPCell dtt1 = new PdfPCell(new Phrase(new Chunk(dat + dtt))); 
       PdfTable.AddCell(dtt1); 

       string buy; 
       buy = "Hello World"; 

       string frst = first_name.Text; 
      PdfPCell frst1 = new PdfPCell(new Phrase(new Chunk(buy + frst))); 
       PdfTable.AddCell(frst1); 
       string city = city_add.Text; 
       PdfPCell city1 = new PdfPCell(new Phrase(new Chunk(city))); 
       PdfTable.AddCell(city1); 

       document.Add(PdfTable); 
       document.Close(); 
       writer.Close(); 

       sendmail(ms); 
Response.ContentType = "application/pdf"; 
       Response.AddHeader("content-disposition", "attachment; filename=payment agreement.pdf"); 
       Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length); 

catch 
{ 
ScriptManager.RegisterStartupScript(this, GetType(), "showalert", "alert('Mail not sent');", true); 
      } 
     } 
    } 

private void sendmail(Stream ms) 
    { 
     string FromMail = "[email protected]"; 
     string ToMail = email_id.Text; 
     string Subject = "Payment Agreement"; 
     string Body = "Dear Customer "; 
     using (Attachment att = new Attachment(ms, "payment agreement.pdf", MediaTypeNames.Application.Pdf)) 
     { 
      using (MailMessage mm = new MailMessage(
       FromMail, ToMail, Subject, Body)) 
      { 
       mm.Attachments.Add(att); 
       SmtpClient smtp = new SmtpClient(); 
       smtp.Host = "server name"; 
       smtp.Port = 25; 
       smtp.Send(mm); 
      } 
     } 
    } 

回答

2

刪除以下行:

sendmail(ms); 

使用此行:

sendmail(new MemoryStream(ms.ToArray())); 

附加說明:我看到你在代碼中使用ms.GetBuffer()。請在Microsoft's Developer Network上閱讀以下注釋:

請注意,緩衝區包含可能未使用的已分配字節。 例如,如果將字符串「test」寫入到MemoryStream對象中,則從GetBuffer返回的緩衝區的長度爲256,而不是 4,未使用252個字節。要僅獲取緩衝區中的數據,請使用 ToArray方法;但是,ToArray會在 內存中創建數據的副本。

當您在PDF上使用GetBuffer時,您可能會遇到在最後具有額外字節的PDF。這可能會產生問題,因爲PDF查看器開始讀取文件末尾的PDF(這是可以找到交叉引用表的位置)。如果PDF不以%%EOF結尾,但有一些隨機多餘的字節會得到256的倍數,那麼您的PDF查看器可能會認爲您的PDF已損壞。

+0

謝謝你,這是工作,肯定會記得以後的帖子, –

+0

這是自接受解決了這個問題的答案。點擊左側樂譜旁邊的複選標記即可完成接受。通過接受答案,您還向其他人顯示問題已正確回答。 –

2

我認爲你需要將流的位置移動到開始位置。現在它已經結束了,並且會附上一個「空白」文件。 所以在發送前,位置設置爲0。

ms.Position = 0; 
sendmail(ms);