我在这里问过几个问题,但我仍然遇到问题。如果你能在我的代码中告诉我我做错了什么,我将不胜感激。我从ASP.Net页面运行上面的代码并获得“无法访问封闭的流”。
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
感谢!!!
只是为了帮助某人寻找这个问题的答案,下面发送一个附加到电子邮件的pdf文件的代码,无需实际创建该文件(感谢Ichiban和Brianng):
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);
答案 0 :(得分:79)
你试过了吗?
PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);
// Build pdf code...
writer.CloseStream = false;
doc.Close();
// Build email
memoryStream.Position = 0;
mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));
如果我的记忆正确地为我服务,这解决了之前项目中的类似问题。
答案 1 :(得分:18)
我尝试了brianng发布的代码并且有效。只需将代码顶部更改为:
var doc = new Document();
MemoryStream memoryStream = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream); //capture the object
doc.Open();
doc.Add(new Paragraph("First Paragraph"));
doc.Add(new Paragraph("Second Paragraph"));
writer.CloseStream = false; //set the closestream property
doc.close(); //close the document without closing the underlying stream
memoryStream.Position = 0;
/* remainder of your code stays the same*/
答案 2 :(得分:3)
可能调用doc.Close()处理基础流。尝试删除doc.Close()而不是该行设置memoryStream.Position = 0;
或者,您可以使用临时文件:
var tempFilePath = Path.GetTempFileName();
try
{
var doc = new Document();
PdfWriter.GetInstance(doc, File.OpenWrite(tempFilePath));
doc.Open();
doc.Add(new Paragraph("First Paragraph"));
doc.Add(new Paragraph("Second Paragraph"));
doc.Close();
MailMessage mm = new MailMessage("username@gmail.com", "username@gmail.com")
{
Subject = "subject",
IsBodyHtml = true,
Body = "body"
};
mm.Attachments.Add(new Attachment(tempFilePath, "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);
}
finally
{
File.Delete(tempFilePath);
}
答案 3 :(得分:3)
您可以刷新文档或内存流,然后在附加后将其关闭吗?
答案 4 :(得分:1)
我遇到了同样的问题,我用这篇文章来解决它。在brianng编写的代码中
PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);
// Build pdf code...
writer.CloseStream = false;
doc.Close();
// Build email
memoryStream.Position = 0;
mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));
我认为不是写作
writer.CloseStream = false and memoryStream.Position = 0;
只需创建一个新的流
MemoryStream m = new MemoryStream(memoryStream);
然后致电
mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));
两者都有效,但我认为最好创建新流