我正在与一些内存流逻辑作斗争。
我有一个接收Id列表的方法。使用它们从网络服务器中提取pdf,并将它们合并为一个pdf。
我想通过电子邮件发送此pdf(仅在内存中工作)
private Stream GetWebReport(string selected_id)
{
var IdLst = selected_id.Split(',').ToList();
MemoryStream stream = new MemoryStream();
Document document = new Document();
PdfCopy pdf = new PdfCopy(document, stream);
PdfReader reader = null;
try
{
document.Open();
foreach (var id in IdLst)
{
int i = Convert.ToInt32(id);
string invoice_url = string.Concat("http://specialurl/", id);
var urlpdf = new System.Net.WebClient().OpenRead(invoice_url);
reader = new PdfReader(urlpdf);
pdf.AddDocument(reader);
reader.Close();
}
}
catch (Exception)
{
throw;
}
finally
{
if (document != null)
{
document.Close();
}
}
return stream;
}
但是当我尝试将结果流用于电子邮件时 var mem = GetWebReport(selected_id);
mem.Seek(0, SeekOrigin.Begin);
Attachment att = new Attachment(mem, "Report for you", "application/pdf");
我被告知:
System.ObjectDisposedException: 'Cannot access a closed Stream.'
所以我确信我的itextsharp逻辑是好的(当我使用文件流时,我得到了正确的结果)。 我确信我传递流的逻辑是错误的
答案 0 :(得分:2)
使用
PdfCopy pdf = new PdfCopy(document, stream);
pdf.CloseStream = false;
这将在关闭要在别处使用的pdf后保持流打开。