title: iTextSharp - Sending in-memory pdf in an email attachment
body: <p>I've asked a couple of questions here but am still having issues. I'd appreciate if you could tell me what I am doing wrong in my code. I run the code above from a ASP.Net page and get "Cannot Access a Closed Stream". </p>
  
  <pre><code>var doc = new Document();
  
  MemoryStream memoryStream = new MemoryStream();
  
  PdfWriter.GetInstance(doc, memoryStream);
  doc.Open();
  doc.Add(new Paragraph("First Paragraph"));
  doc.Add(new Paragraph("Second Paragraph"));
  
  doc.Close(); //if I remove this line the email attachment is sent but with 0 bytes 
  
  MailMessage mm = new MailMessage("username@gmail.com", "username@gmail.com")
  {
      Subject = "subject",
      IsBodyHtml = true,
      Body = "body"
  };
  
  mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));
  SmtpClient smtp = new SmtpClient
  {
      Host = "smtp.gmail.com",
      Port = 587,
      EnableSsl = true,
      Credentials = new NetworkCredential("username@gmail.com", "my_password")
  };
  
  smtp.Send(mm); //the "Cannot Access a Closed Stream" error is thrown here
  </code></pre>
  
  <p>Thanks!!!</p>
  
  <h2>EDIT:</h2>
  
  <p>Just to help somebody looking for the answer to this question, the code to send a pdf file attached to an email without having to physically create the file is below (thanks to Ichiban and Brianng):</p>
  
  <pre><code>var doc = new Document();
  MemoryStream memoryStream = new MemoryStream();
  PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);
  
  doc.Open();
  doc.Add(new Paragraph("First Paragraph"));
  doc.Add(new Paragraph("Second Paragraph"));
  
  writer.CloseStream = false;
  doc.Close();
  memoryStream.Position = 0;
  
  MailMessage mm = new MailMessage("username@gmail.com", "username@gmail.com")
  {
      Subject = "subject",
      IsBodyHtml = true,
      Body = "body"
  };
  
  mm.Attachments.Add(new Attachment(memoryStream, "filename.pdf"));
  SmtpClient smtp = new SmtpClient
  {
      Host = "smtp.gmail.com",
      Port = 587,
      EnableSsl = true,
      Credentials = new NetworkCredential("username@gmail.com", "password")
  
  };
  
  smtp.Send(mm);
  </code></pre>