2015-10-13 54 views
0

這是我的代碼塊。它編譯得很好,當我關閉事件我收到電子郵件,但我然後得到這個錯誤 電子郵件附件錯誤在Adobe打開時(Acrobat無法打開'Att00002.pdf',因爲它不是支持的文件類型或因爲該文件已被損壞(例如,它被髮送作爲電子郵件的附件和wasnt正確地解碼。)試圖使用PdfStamper和MemoryStream將數據添加到現有的PDF然後發電子郵件

string agentName = "My Name";    
MemoryStream _output = new MemoryStream(); 
      PdfReader reader = new PdfReader("/pdf/Agent/Specialist_Certificate.pdf"); 
      using (PdfStamper stamper = new PdfStamper(reader, _output)) 
      { 
       AcroFields fields = stamper.AcroFields; 
      // set form fields 
      fields.SetField("FIELD_AGENT_NAME", agentName); 
      fields.SetField("FIELD_DATE", AvalonDate); 

      // flatten form fields and close document 
      stamper.FormFlattening = true; 
      SendEmail(_output); 
      DownloadAsPDF(_output); 
      stamper.Close(); 
     } 

private void SendEmail(MemoryStream ms) 
{ 
    Attachment attach = new Attachment(ms, new System.Net.Mime.ContentType("application/pdf")); 
    EmailHelper.SendEMail("[email protected]", "[email protected]", null, "", "Avalon Cert", "Hope this works", EmailHelper.EmailFormat.Html,attach); 
} 

EDITED ******************* ******************

 using (MemoryStream _output = new MemoryStream()) 
     { 
      using (PdfStamper stamper = new PdfStamper(reader, _output)) 
      { 
       AcroFields fields = stamper.AcroFields; 
       // set form fields 
       fields.SetField("FIELD_AGENT_NAME", agentName); 
       fields.SetField("FIELD_DATE", AvalonDate); 

       // flatten form fields and close document 
       stamper.FormFlattening = true; 
      } 
      SendEmail(_output); 
     } 
+0

嘗試調用'SendEmail'之前關閉'PdfStamper'。您可能只附加了PDF字節流的一部分,因爲並非所有內容都被刷新爲輸出。 – rhens

+0

當我將其更改爲stamper.Close(); SendEmail(_output);發送電子郵件時出現此錯誤 System.ObjectDisposedException:無法訪問已關閉的流 – user1566783

回答

2

你調用stamper.close()using (PdfStamper stamper = new PdfStamper(reader, _output))內。該using將部門自動化除了手動關閉()之外,在關閉壓模後關閉壓模,因此在技術上壓模試圖關閉兩次。正因爲如此,它也試圖不止一次關閉MemoryStream。這是例外來自的地方。

我會用設在這裏的答案技術的MemoryStreamPdfStamper(修改,摘自:Getting PdfStamper to work with MemoryStreams (c#, itextsharp)):

using (MemoryStream _output = new MemoryStream()) { 
    using (PdfStamper stamper = new PdfStamper(reader, _output)) { 
// do stuff  
    }  
} 
+2

我同意這一點,但我會更進一步,主張kuujinbo的完整模式,我也一直使用它,這就是返回一個字節數組流。如果您稍後需要流,則只需將新數組包裝到字節數組中。是的,這裏有一些額外的CPU週期,但實際上並不多。流經周圍的問題正是UncleRico指向的問題,也就是說其他人可以通過關閉他們或設置職位或其他方式來惹惱他們。 –

+0

好的,我會在哪裏放我的SendEmail(_output);大塊呢?如果我把它放在使用PdfStamper之外,我會得到一個錯誤,說明流已經關閉。 – user1566783

+0

@ user1566783我會主張先創建加蓋的pdf,然後使用上面的代碼作爲模板關閉它。然後作爲輔助進程使用您的'SendEmail()'方法將其附加到您的電子郵件中。請記住,在一種情況下,您的MemoryStream正在用於寫入信息,您的附件進程正在使用同一個MemoryStream從中讀取(這不是一件好事)。 –

相關問題