【发布时间】:2015-01-30 23:21:33
【问题描述】:
我正在尝试生成一个包含 HTML 内容的 PDF 文件,该文件通过 AJAX 从 JavaScript 发送。
我已经正确发送了 HTML,并且使用 HTML 正确生成了 PDF,但我一直在试图弄清楚如何在用户的浏览器上启动文件下载。
这是我目前正在尝试的。当直接点击文件的 URL 时,这在 IHttpHandler 文件中有效,但在通过 AJAX 发布时在 ApiController 中无效。
我也尝试过发布到 IHttpHandler 文件,结果相同。一切正常,直到我尝试使用 BinaryWrite 启动下载。
public class DownloadScheduleController : ApiController
{
public void Post(HtmlModel data)
{
var htmlContent = data.html;
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);
using (var mstream = new System.IO.MemoryStream())
{
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=UserSchedule.pdf");
HttpContext.Current.Response.BinaryWrite(pdfBytes);
HttpContext.Current.Response.End();
}
}
}
这是 Ajax 请求。它使用 Angular 的 $http。
$http({
method: 'POST',
url: 'api/downloadSchedule',
dataType: "json",
contentType: "application/json; charset=utf-8",
data: data
});
或者,我可以将 PDF 二进制文件返回到 JavaScript,但是我如何使用 JavaScript 来保存 pdf?
任何帮助将不胜感激。
【问题讨论】:
-
我只是通过实际重定向(通过 301)到返回字节流和
content-disposition: attachment的非 API 控制器来做到这一点。我不能 100% 确定它是否可以用 AJAX 完成(但我肯定是错的 - 在这里失去记忆)。 -
是的,不幸的是我处于需要通过 AJAX 完成的情况。 PDF 生成器需要的 html 内容正在另一个页面上通过 Javascript 动态加载。当他们点击下载按钮时,我使用 iFrame 触发页面并获取内容,一旦内容加载,我就会有一个事件触发对 downloadSchedule ApiController 的 API 调用。
-
我会尝试做两件事:Response.Flush();在您的 Response.End();和 Response.OutputStream.Write(pdfBytes,0,pdfBytes.Length);而不是 Response.BinaryWrite(pdfBytes)
-
感谢 JFlox 的评论。我尝试了这两个,但仍然没有。
-
不确定是否需要 using 语句,因为您似乎实际上并未在该块中的任何位置使用 mstream。
标签: javascript c# jquery .net