将 RadFlowDocument 作为 PDF 发送给用户

Send RadFlowDocument as PDF to user

我在 MVC 应用程序中使用 VS 2013、VB.Net 和 Telerik 2016 Q1。我正在使用 Telerik RadFlowDocument 创建报告,并将其以 pdf 格式发送给用户。我已成功创建报告并将其保存在本地。我的问题是,当我尝试将其转换为内存流并将其发回给用户时,用户永远无法选择下载报告。

我有一个通过 ajax:

启动进程的按钮
function supervisorPDF() {
    $.ajax({
        url: '@Url.Action("GenerateSupervisorReportPDF", "InteriorReport")',
        type: 'POST'
    })
    .success(function (result) {

    })
    .error(function (xhr, status) {
        alert(status);
    })
}

我有一个接收 ajax 调用然后生成报告的子例程:

    Sub GenerateSupervisorReportPDF()
        Dim generator As New PdfGenerator
        Dim selectedSupervisorName = System.Web.HttpContext.Current.Session("selectedSupervisorName").ToString()
        Dim selectedSupervisorIdNumber = System.Web.HttpContext.Current.Session("selectedSupervisorIdNumber").ToString()
        Dim report As New RadFlowDocument

        Dim viewModel As New SupervisorReportViewModel
        Dim model = viewModel.getSupervisorReportInfo(selectedSupervisorName, selectedSupervisorIdNumber)

        report = generator.generateSupervisorPdf(model)

        Dim provider As New PdfFormatProvider()
        Dim output As New MemoryStream
        provider.Export(report, output)

        Dim buffer As Byte()

        Try
            buffer = output.ToArray
            Response.ClearContent()
            Response.ClearHeaders()
            Response.ContentType = "application/pdf"
            Response.OutputStream.Write(buffer, 0, buffer.Length)
            Response.AddHeader("Content-Disposition", "attachment;filename=SupervisorReport.pdf")
            Response.End()
        Catch ex As Exception

        End Try

    End Sub

在这个子例程中,如果我将 output 声明为本地文件路径,一切都会按预期进行。然而,当使用这个实现时,我的 Response.OutputStream 总是以空结束。不会抛出任何错误。

我需要更改什么才能以用户可以选择下载报告的方式将此报告发回给用户?

您将无法通过 ajax 执行此操作。

为了让浏览器接收和处理

Content-Disposition:attachment

必须直接浏览。

ajax 调用可能会将二进制文件下载到 jquery,但 jquery 无法将其保存在本地。

最简单的选择是让浏览器打开一个 link 直接生成 PDF 的操作,例如:

<a href='@Url.Action("GenerateSupervisorReportPDF", "InteriorReport")'>download report</a>

另外,您可以将所有 Response. 代码简化为一个简单的 return FileStreamResult(... 并且它应该处理提示用户保存等 - 我会把这个留给你(因为我没有确切的语法)