iTextSharp在内存中创建文件导致文件损坏

时间:2013-02-19 22:02:44

标签: asp.net-mvc itextsharp

我正在尝试使用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.ActionLink(“Pdf Memory”,“GetPdfMemory”,“Home”,null,new {id =“download”})

仅供参考:当我尝试使用FileStream而不是MemoryStream时,一切正常。但我需要使用memorystream创建PDF。

1 个答案:

答案 0 :(得分:0)

您操纵(mem.Position = 0)并使用new FileStreamResult(mem, ...)MemoryStream,然后发信号通知iTextSharp它可以完成文档。因此,根据DocumentPdfWriter的隐式销毁或内存流中数据的使用是否先出现,您要么缺少PDF,要么关闭部分或关闭部分(正在写入)在重新定位内存流之后)覆盖数据的开始。

要通知iTextSharp它可以完成文档,请在操作内存流之前调用doc.Close(),或者在Document块中使用using,例如:

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());
}

(从[{3}}的样本HelloWorldMemory.cs无耻地复制)Webified iTextSharp Examples

隐式使用using会导致Document关闭。