1

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

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

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

谢谢你的帮助。

4

2 回答 2

0

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

然后您可以将报告“打印”为 pdf 没有问题。

希望能帮助到你!

于 2013-04-15T12:46:08.990 回答
0

我有一个类似的问题。在我的报告中有一些文字和图像。我读过 Crystal Report 首先将 JPG、PNG 等图像转换为 BMP,然后显示报告。并且将其他图像类型转换为 BMP 会消耗大量内存。首先,我尝试将数据库中的 JPG 图像转换为 BMP 图像,但随后我的数据库变得越来越大。最后我找到了解决方案(感谢这个答案)。

我没有尝试将所有页面导出为 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 页。也许您可以将其更改为另一个数字。

于 2018-10-26T10:50:07.017 回答