2

这个问题可能有一个简单的答案,但我似乎无法找到解决方案。

因此,我目前正在使用 iTextSharp 生成 PDF,并在提交表单时将此 PDF 发送回用户。但是,我不想在响应流中发送此 PDF,而是呈现一个指向该文件的链接,即“感谢您提交,单击此处下载 PDF”。

查看了 Stack 上的大多数 iTextSharp 问题,但都与通过响应流发送它有关。

谢谢

    [HttpPost]
    public ActionResult Index(FormCollection formCollection)
    {

        // Create PDF
        var doc = new Document();
        MemoryStream memoryStream = new MemoryStream();

        PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);

        doc.Open();
        doc.Add(new Paragraph("First Paragraph"));
        doc.Add(new Paragraph("Second Paragraph"));
        doc.Close();

        byte[] docData = memoryStream.GetBuffer(); // get the generated PDF as raw data

        // write the data to response stream and set appropriate headers:

        Response.AppendHeader("Content-Disposition", "attachment; filename=test.pdf");
        Response.ContentType = "application/pdf";
        Response.BinaryWrite(docData);

        Response.End();

        return View();

    }
4

1 回答 1

4

这完全独立于 iTextSharp。

您必须将创建的字节数组存储在服务器上的某个位置并创建另一个操作,以便稍后通过某种 ID 获取生成的数据并将其提供给用户。

您可以存储在文件系统中,也可以只存储在会话或 TempData 中。

public ActionResult Index(FormCollection formCollection)
{
    // Create PDF ...
    byte[] docData = memoryStream.GetBuffer(); 
    // create id and store data in Session
    string id = Guid.NewGuid().ToString();
    Session[id] = docData;
    return View("Index", id);
}

在视图Index.cshtml中,您将字符串设置为模型类型并生成下载链接:

@model string
@Html.ActionLink("Download pdf", "Download", "Controller", new { id = Model })

以及您的新下载操作:

public ActionResult Download(string id) {
    var docData = (byte[])Session[id];

    if (docData == null) 
      return HttpNotFound();

    // clear data from session
    Session[id] = null;
    // a simpler way of returning binary data with mvc
    return File(docData, "application/pdf", "test.pdf");
}
于 2012-11-21T20:28:53.957 回答