C# iTextSharp - 在电子邮件附件中发送内存中的 pdf
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1196059/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
iTextSharp - Sending in-memory pdf in an email attachment
提问by Gus Cavalcanti
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".
我在这里问了几个问题,但仍然有问题。如果您能告诉我我在代码中做错了什么,我将不胜感激。我从 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("[email protected]", "[email protected]")
{
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("[email protected]", "my_password")
};
smtp.Send(mm); //the "Cannot Access a Closed Stream" error is thrown here
Thanks!!!
谢谢!!!
EDIT:
编辑:
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):
只是为了帮助某人寻找这个问题的答案,发送一个 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("[email protected]", "[email protected]")
{
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("[email protected]", "password")
};
smtp.Send(mm);
采纳答案by brianng
Have you tried:
你有没有尝试过:
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"));
If my memory serves me correctly, this solved a similar problem in a previous project.
如果我没记错的话,这解决了以前项目中的类似问题。
回答by huseyint
Probably calling doc.Close() Disposes the underlying stream. Try removing doc.Close() and instead of that line set memoryStream.Position = 0;
可能调用 doc.Close() 处理底层流。尝试删除 doc.Close() 而不是该行 set memoryStream.Position = 0;
Alternatively you can use a temp file:
或者,您可以使用临时文件:
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("[email protected]", "[email protected]")
{
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("[email protected]", "my_password")
};
smtp.Send(mm);
}
finally
{
File.Delete(tempFilePath);
}
回答by James Conigliaro
Can you flushthe document or memory stream and then close it after you attach it?
您可以刷新文档或内存流,然后在附加后将其关闭吗?
回答by ichiban
I tried the code posted by brianngand it worked. Just change the top of the code to this:
我尝试了bring发布的代码,它奏效了。只需将代码的顶部更改为:
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*/
回答by Zein Sleiman
I had the same problem and I used this post to solve it.In the code written by brianng
我遇到了同样的问题,我用这篇文章解决了它。在 briang 写的代码中
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"));
I think instead of writing
我认为而不是写作
writer.CloseStream = false and memoryStream.Position = 0;
Just create a new Stream
只需创建一个新的流
MemoryStream m = new MemoryStream(memoryStream);
and then call
然后打电话
mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));
Both work but I think it is better to create the new stream
两者都有效,但我认为创建新流更好