Asp.net mvc iTextSharp正在内存中创建文件,导致文件损坏

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

我正在尝试使用iTextSharp在MVC中创建pdf文件。我有一个简单的用例。正在创建文件,但当我打开PDF时,我收到错误文件已损坏,无法打开该文件。有什么想法/帮助吗

我的控制器代码如下

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设置得更严格。