这个问题可能有一个简单的答案,但我似乎无法找到解决方案。
因此,我目前正在使用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();
}
答案 0 :(得分: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");
}