Asp.net mvc iTextSharp正在内存中创建文件,导致文件损坏
我正在尝试使用iTextSharp在MVC中创建pdf文件。我有一个简单的用例。正在创建文件,但当我打开PDF时,我收到错误文件已损坏,无法打开该文件。有什么想法/帮助吗 我的控制器代码如下Asp.net mvc iTextSharp正在内存中创建文件,导致文件损坏,asp.net-mvc,itextsharp,Asp.net Mvc,Itextsharp,我正在尝试使用iTextSharp在MVC中创建pdf文件。我有一个简单的用例。正在创建文件,但当我打开PDF时,我收到错误文件已损坏,无法打开该文件。有什么想法/帮助吗 我的控制器代码如下 public FileStreamResult GetPdfMemory() { iTextSharp.text.Document doc = new iTextSharp.text.Document(); MemoryStream mem = new M
public FileStreamResult GetPdfMemory()
{
iTextSharp.text.Document doc = new iTextSharp.text.Document();
MemoryStream mem = new MemoryStream();
PdfWriter pdfWriter = PdfWriter.GetInstance(doc, mem);
//pdfWriter.CloseStream = false;
doc.Open();
doc.Add(new Paragraph("Charts"));
mem.Position = 0;
FileStreamResult fileStreamResult = new FileStreamResult(mem, System.Net.Mime.MediaTypeNames.Application.Pdf)
{
FileDownloadName = "chart_" + ".PDF"
};
return fileStreamResult;
}
视图:
@Html.ActionLinkPdf内存,GetPdfMemory,Home,null,new{id=download}
仅供参考:当我尝试使用FileStream而不是MemoryStream时,一切都很好。但我需要使用memorystream创建PDF 操作mem.Position=0并使用新文件streamresultmem。。。MemoryStream会在向iTextSharp发出可以完成文档的信号之前进行处理。因此,取决于是先隐式销毁文档和PdfWriter,还是先使用内存流中的数据,您可能会发现PDF缺少其结束部分,或者在重新定位内存流覆盖数据的开始部分后正在写入结束部分
要向iTextSharp发出可以完成文档的信号,请在操作内存流之前调用doc.Close,或者在使用块中使用文档,例如:
using (MemoryStream ms = new MemoryStream()) {
// step 1
using (Document document = new Document()) {
// step 2
PdfWriter.GetInstance(document, ms);
// step 3
document.Open();
// step 4
document.Add(new Paragraph("HelloWorldMemory"));
}
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
}
厚颜无耻地从样品中抄袭
隐式使用Using会导致文档关闭。在MVC中,当将FileStreamResult作为操作结果返回时,我们不能使用Using子句。我们总是会遇到无法访问封闭流错误。仅供参考,我正在.NET MVC中尝试这一点。在这种情况下,请尝试回答中的另一种选择。这就是我在原始问题中发布的选择,除非您指的是其他选项。仅供参考:当我在操作内存流之前尝试doc.close时,我无法访问已关闭的流。如果PDFWriter设置为false,则可能需要将CloseStream设置得更严格。