将PDF发送到浏览器(作为附件)

时间:2013-08-06 13:14:56

标签: pdf browser download response aspose

我目前正在尝试解决以下问题:

        var fileName = "monthly_report.pdf"
        var document = new Document();
        //DO SOME STUFF WITH THE DOCUMENT

        MemoryStream stream = new MemoryStream();
        doc.Save(stream, SaveFormat.Pdf);
        byte[] bytes = stream.GetBuffer();
        Response.Clear();
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment; filename="+fileName);
        Response.BinaryWrite(bytes);
        Response.End();

根据这段代码,我试图显示一个Aspose。单词文档在浏览器中转换为pdf /尝试在浏览器中为所述文档创建下载对话框。

执行操作时没有错误消息。然后,pdf的内容显示在chrome调试器的响应消息中。响应也保持适当的大小(pdf为60kb)。它只是不开始下载或在浏览器中显示pdf,我想知道为什么会这样。

我也尝试过Aspose提供的替代方案:

        var resp = System.Web.HttpContext.Current.Response;
        resp.Clear();
        // Create Memory Stream Object
        MemoryStream stream = new MemoryStream();
        doc.Save(stream, SaveFormat.Pdf);
        doc.Save(resp, fileName, ContentDisposition.Attachment,                                SaveOptions.CreateSaveOptions(
        SaveFormat.Pdf));
        resp.End();

这导致完全相同的结果pdf在响应中显示而不是浏览器本身。

执行此代码的控制器操作由ajax语句调用:

$("#btnReport").click(function () {

            var datum = $("#hiddenDatum").val();

            $.ajax({
                type: "GET",
                url: '@Url.Action("GenerateMonthlyReport", "Reporting")',
                data: { datum: datum},
                success: function (data) {

                }
            });
        });

对我所做错的任何建议都将受到高度赞赏。

编辑:我的研究表明ajax调用确实不起作用。如何根据我的控制器逻辑启动文件下载?

1 个答案:

答案 0 :(得分:0)

您无法使用AJAX调用直接下载文件。你可以这样做:

$.ajax({
   type: "GET",
   url: '@Url.Action("GenerateMonthlyReport", "Reporting")',
   data: { datum: datum},
   success: function (data) {
      window.location.href = data.filePath; // i.e. '/downloads/file.pdf';
   }
});

您无法将数据流回jQuery处理程序。为什么不使用标准的HTML锚点将其作为简单的get请求?

@Html.ActionLink("Generate Monthly Report", "GenerateMonthlyReport", "Reporting", new { datum = DateTime.Now.ToString("d", new CultureInfo("en-US")})