从 Ajax 下载返回的 PDF



我有以下操作返回一个PDF:

[HttpPost]
public string GetPDF(string data, float scaleFactor)
{
var result = JArray.Parse(data);
using (var fs = new FileStream(@"c:pdfpdftest.pdf", FileMode.Create))
{
MemoryStream ms = (MemoryStream)PdfMaker.CreatePDF(scaleFactor, result, dt);
ms.WriteTo(fs);
return Convert.ToBase64String(ms.ToArray());
}
}

(忽略FileStream,那只是为了测试(
结果基本上是PDF本身,但它没有得到下载,如何下载输出PDF?我应该退回其他东西吗?我尝试使用FileResult,但它基本上是相同的场景。

这是我目前通过 Ajax "读取"文件的方式:

$.ajax({
type: "POST",
url: "home/GetPDF",
data: { data: JSON.stringify(data), scaleFactor: $("#sf").val() },   
success: function (data) {      
window.location = "data:application/pdf;base64, " + data;
}
});

谢谢。

编辑:

使用了Stephen Muecke提供的这篇文章中的解决方案

通过 ajax 下载文件不起作用,因为数据最终位于 JS 对象的内存中,而不是用户设备上。最终,您需要使用正常的HTTP请求并返回FileResult。

但是,在您的情况下,您还需要先上传一些数据,这些数据需要在下载之前添加到 PDF 中。这很尴尬,因为下载必须是在单独窗口中触发的 GET 请求(因为之后您需要应用程序保持在同一页面上(,并且在查询字符串上提供该数据不太可能切合实际。

解决此问题的解决方案是采用两步过程:

1( 在浏览器中,通过 AJAX 将数据上传到"编辑PDF"操作方法。在操作方法中,使用新数据编辑 PDF,然后保存。然后将某种唯一 ID 返回给客户端,以标识正确的 PDF。

2(当浏览器收到来自EditPDF方法的响应时,它会获取返回的ID,并对"GetPDF"操作的URL进行新的window.open调用。此操作接受 PDF ID 作为查询字符串参数,因此在发出请求时可以轻松地将其包含在 URL 中。此操作在服务器上找到正确的文档,并将其返回到 FileResult 中。浏览器将下载文档,但不会影响正在浏览的 HTML 页面。

最新更新