1

我正在尝试使用 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 时,一切正常。但我需要使用内存流创建 PDF。

4

1 回答 1

0

您操作 ( mem.Position = 0) 并使用 ( new FileStreamResult(mem, ...))MemoryStream之前的信号 iTextSharp 它可以完成文档。因此,根据内存流中数据的隐式销毁或数据的使用是否Document首先PdfWriter出现,您可能有一个 PDF 缺少其关闭部分或关闭部分(在您重新定位内存流后写入)覆盖开始的数据。

要向 iTextSharp 发出它可以完成文档的信号,请doc.Close()在操作内存流之前调用,或者Documentusing块中使用,例如:

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

(无耻地从 Webified iTextSharp 示例中的示例 HelloWorldMemory.cs 复制)用于iText in Action — 第 2 版

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

于 2013-02-20T08:11:04.970 回答