在循环中导出 Crystal 报告为 PDF 仅适用于第一个

Export Crystal Report to PDF in a Loop only works with first

我正在尝试生成一个报告并将其循环导出为pdf,报告将在每个循环中接收一个新参数并提示客户端下载PDF,换句话说,客户端可能需要同时下载2个或3个(或更多)PDF,问题是接受下载的提示只出现在第一个pdf上,不知道为什么。我可以毫无问题地导出到磁盘(服务器端)。

代码:

Sub PrintReport(ByVal Cod As Integer)
        Dim CTableLogInfo As TableLogOnInfo
        Dim ConnInfo As CrystalDecisions.Shared.ConnectionInfo = New ConnectionInfo()
        ConnInfo.Type = ConnectionInfoType.SQL
        ConnInfo.ServerName = ConfigurationManager.AppSettings("SQLSERVERNAME")
        ConnInfo.DatabaseName = ConfigurationManager.AppSettings("SQLDBNAME")
        ConnInfo.UserID = ConfigurationManager.AppSettings("SQLSERVERUSER")
        ConnInfo.Password = ConfigurationManager.AppSettings("SQLSERVERPASSWORD")
        ConnInfo.AllowCustomConnection = False
        ConnInfo.IntegratedSecurity = False

        For Each CTable As Table In CrystalReportSource1.ReportDocument.Database.Tables
            CTable.LogOnInfo.ConnectionInfo = ConnInfo
            CTableLogInfo = CTable.LogOnInfo
            CTableLogInfo.ReportName = CrystalReportSource1.ReportDocument.Name
            CTableLogInfo.TableName = CTable.Name
            CTable.ApplyLogOnInfo(CTableLogInfo)
        Next

        Dim pField As ParameterField = CrystalReportSource1.ReportDocument.ParameterFields(0)
        Dim val1 As ParameterDiscreteValue = New ParameterDiscreteValue
        val1.Value = Cod
        pField.CurrentValues.Clear()
        pField.CurrentValues.Add(val1)


        Dim PDFName As String = "PDF Nº " & Cod 
        CrystalReportSource1.ReportDocument.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Page.Response, True, PDFName)      
    End Sub

编辑: 尝试使用 DotNetZip 压缩报告,但我得到一个损坏的压缩包。

你能告诉我有什么问题吗? (已解决:现在更正了下面的代码)

    Response.ClearContent()
    Response.ClearHeaders()
    Response.ContentType = "application/zip"
    Response.AppendHeader("content-disposition", "attachment; filename=AllPDFs.zip")

    Using zipFile As New ZipFile()
        For i = 0 To Cod.Length - 1
            If Cod(i) > 0 Then
                val1.Value = Cod(i)
                pField.CurrentValues.Clear()
                pField.CurrentValues.Add(val1)

                val2.Value = Cod(i)
                pField2.CurrentValues.Clear()
                pField2.CurrentValues.Add(val2)

                Dim PDFNameAs String = "PDF Nº " & Cod(i) & ".pdf" 

                Dim s As New System.IO.MemoryStream 
                s =CrystalReportSource1.ReportDocument.ExportToStream(ExportFormatType.PortableDocFormat)
                zipFile.AddEntry(PDFName, s)
            End If
        Next
        zipFile.Save(Response.OutputStream)
    End Using
    Response.Clear()

可能响应在第一个响应之后结束,因此第二次和第三次尝试都没有响应可写。

相反,您可以让客户端通过 AJAX 请求下载报告(将您的报告生成移动到 .ashx 通用处理程序中),或者让用户点击按钮 3 次以启动新的请求。

或者将 PDF 压缩成一个文件并允许客户下载。