【问题标题】:Send server side generated PDF to the browser将服务器端生成的 PDF 发送到浏览器
【发布时间】:2013-09-20 10:01:38
【问题描述】:

我有一个在服务器端调用静态 WebMethod 的 AJAX 调用。 服务器端方法返回一个包含 PDF 文件字节流的 MemoryStream。 然后,如何在 AJAX 调用的成功方法中在客户端使用此 PDF 字节流,以某种方式触发 PDF 文件下载。 我也不会对页面进行完整的回发。

我已将此作为参考:http://forums.asp.net/t/1377154.aspx?Download+from+Javascript 但我想有一个完整的例子来实现这一点。

function generatePDF(param1, param2, param3) {
    $.ajax({
        type: 'POST',
        url: 'Page.aspx/GeneratePDF',
        data: '{ "param1" : "' + param1+ '", "param2" : "' + param2+ '", "param3" : "' + param3+ '" }',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function (pdf) {

            //from here somehow, download the generated PDF file
        }
    });
}

【问题讨论】:

  • 你能从后面的代码中尝试一下吗?我添加了示例。

标签: c# javascript asp.net


【解决方案1】:

我没有亲自做过,但我会尝试的第一件事是:

在服务器端动态构建相应的 HTML 文档和 CSS 使用 phantomJS 呈现该文档 告诉 phantomJS 将该文档转换为 PDF,保存在临时文件中 通过将临时 PDF 文件写入响应正文,将 PDF 作为 HTTP 响应发回 删除临时文件 如果您正在为内容类型、内容处置等问题苦苦挣扎,那么如果您在磁盘上有一个有效的 pdf 文件并将该数据写入 HTTP 响应,则不必担心这一点。使用正确的标题,您应该能够要求浏览器显示 PDF 或将其视为要保存为下载的文件。

【讨论】:

    【解决方案2】:

    这里我建议你使用

    Window.open('~/path/name.pdf');
    

    使用它,您可以在浏览器上显示pdf,并可以从浏览器保存和打印。

    【讨论】:

    • 我不想将文件保留在服务器上,因为它可能仍然是孤立文件。我只是想从服务器端发送一个字节流到浏览器,然后使用该字节流弹出下载文件窗口。
    • 好的,但我再次建议您不要使用 ajax 调用此操作,使用 window.open Response.ContentType = "application/pdf"; Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length); Response.OutputStream.Flush(); Response.OutputStream.Close();
    • 谢谢,你有完整的例子吗?
    【解决方案3】:

    试试这个, 从数据库中选择字节并提供给内容。

    byte[] content = "Select Your Bytes From Database";
    HttpContext.Current.Response.Buffer = false;
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.AppendHeader("content-disposition","attachment;filename=" + fileName);
    HttpContext.Current.Response.ContentType = "Application/pdf";
    //Write the file content directly to the HTTP content output stream.
    HttpContext.Current.Response.BinaryWrite(content);
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.End();
    

    【讨论】:

    • 我不能在 WebMethod 调用中使用它。
    • 好的。但您也可以在服务器端事件中使用。从你的客户端你可以调用你的服务器端事件而不是它的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2010-10-18
    • 2018-06-19
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多