Crystal Report 2008 - 内存已满

时间:2013-04-02 06:33:09

标签: crystal-reports report export-to-pdf

我正在VS 2010开发一个C#/ ASP.NET Web项目,它使用Crystal Reports(2008)版本12.3.0.601。项目调用报告并将其导出为pdf。每当我在报表设计中更改某些内容时,“内存已满”错误会在页面刷新时显示。有时它不会给出错误,但有时我会尝试不要错误地持续数小时。

我搜索了许多与该标题相关的网站,但没有找到解决方案的运气。 有没有人曾经遇到过这样的错误?

System.Runtime.InteropServices.COMException(0x80041004):内存已满。无法导出报告。操作内存不足。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

要导出为pdf,我建议您下载一些pdf打印机即。 http://www.cutepdf.com/products/cutepdf/writer.asp

然后你可以“打印”报告到pdf没有问题。

希望它有所帮助!

答案 1 :(得分:0)

我有类似的问题。我的报告中有一些文字和图像。我读过Crystal Report首先将JPG,PNG等图像转换为BMP,然后显示该报告。将其他图像类型转换为BMP会占用大量内存。首先,我尝试将JPG图像转换为数据库中的BMP图像,但随后数据库变得越来越大。终于找到了解决方法(thanks to this answer)。

我没有尝试将所有页面导出为PDF文件,而是分割文件,将它们压缩并下载zip文件:

    Dim exportOpts As ExportOptions = New ExportOptions()
    Dim pdfRtfWordOpts As PdfRtfWordFormatOptions = ExportOptions.CreatePdfRtfWordFormatOptions()
    Dim destinationOpts As DiskFileDestinationOptions = ExportOptions.CreateDiskFileDestinationOptions()
    Dim intPageCount As Integer = crReportDocument.FormatEngine.GetLastPageNumber(New CrystalDecisions.Shared.ReportPageRequestContext)
    Dim pagecount As Integer
    pagecount = Int(intPageCount / 100) + 1
    Dim sonsayfa As Integer
    Dim ilksayfa As Integer
    Dim Anadosyaadi As String
    Dim foldername As String
    Dim foldernameMap As String
    Anadosyaadi = Now.ToString("yyyy-MM-dd-hh-mm-ss")
    foldername = "C:\inetpub\wwwroot\" + Anadosyaadi
    foldernameMap = "./" + Anadosyaadi

    If Not Directory.Exists(foldername) Then
        Directory.CreateDirectory(foldername)
    End If
    For li_count As Integer = 1 To pagecount
        ilksayfa = (li_count - 1) * 100 + 1
        pdfRtfWordOpts.FirstPageNumber = ilksayfa
        sonsayfa = li_count * 100
        If sonsayfa > intPageCount Then sonsayfa = intPageCount
        pdfRtfWordOpts.LastPageNumber = sonsayfa
        pdfRtfWordOpts.UsePageRange = True
        exportOpts.ExportFormatOptions = pdfRtfWordOpts
        exportOpts.ExportFormatType = ExportFormatType.PortableDocFormat

        destinationOpts.DiskFileName = foldername + "\" + li_count.ToString + ".pdf"
        exportOpts.ExportDestinationOptions = destinationOpts
        exportOpts.ExportDestinationType = ExportDestinationType.DiskFile
        crReportDocument.Export(exportOpts)
    Next
    Using zip As ZipFile = New ZipFile
        zip.AddDirectory(foldername)
        zip.Save(foldername + "\" + Anadosyaadi + ".zip")
    End Using
    Response.Redirect(foldernameMap + "/" + Anadosyaadi + ".zip")

PS1:我使用Ionic.Zip压缩文件。您应该添加

Imports Ionic.Zip

位于您的来源上方。

PS2:重新启动服务器时,无需执行任何其他操作,就可以从第1页到第500页获取500页PDF。这时,我认为Crystal Reports使用了一些内存。然后,如果我想获得第二500页(我的意思是从第501页到1000页),则会看到内存已满错误。然后我可以获得300页(从501到800)。然后是另一个内存已满的问题,我可以从801到900等。这就是为什么我更喜欢拆分100页的原因。也许您可以将其更改为另一个数字。