我正在VS 2010开发一个C#/ ASP.NET Web项目,它使用Crystal Reports(2008)版本12.3.0.601。项目调用报告并将其导出为pdf。每当我在报表设计中更改某些内容时,“内存已满”错误会在页面刷新时显示。有时它不会给出错误,但有时我会尝试不要错误地持续数小时。
我搜索了许多与该标题相关的网站,但没有找到解决方案的运气。 有没有人曾经遇到过这样的错误?
System.Runtime.InteropServices.COMException(0x80041004):内存已满。无法导出报告。操作内存不足。
感谢您的帮助。
答案 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页的原因。也许您可以将其更改为另一个数字。