我正在使用来自数据库的数据使用PDFClown生成大型Report pdf文件。
该过程需要很长时间,并且最终在页数接近150标记时占用了超过1.5GB的内存,并且错误:
PDFClown.dll中发生了'System.OutOfMemoryException'类型的第一次机会异常
由于我需要定期生成超过1500页的报告,因此这是一个主要问题。
我能做些什么吗?
请注意:尽管文件很大,但生成的报告(使用较小的数据集)是准确的。
这是我的代码示例:
protected void PopulateReport()
{
foreach (Page page in _lstPages)
{
if (page != _Titlepage)
{
PrimitiveComposer composer = new PrimitiveComposer(page);
BlockComposer blockComposer = new BlockComposer(composer);
DataRow drInspection;
if (_mapPage1Rows.TryGetValue(page, out dataRow))
{
GeneratePage1(page, composer, blockComposer, dataRow);
}
else if (_mapPage2Rows.TryGetValue(page, out dataRow))
{
GeneratePage2(page, composer, blockComposer, dataRow);
}
}
}
}
protected void GeneratePage1()
{
composer.BeginLocalState();
composer.SetFont(ReportFonts.GetFont(GetPDFDocument(), bIsFieldName, false), nFontSize);
blockComposer.Begin(GetRectangle(fMarginX, fMarginY, fWidth, nFontSize), AlignX, AlignY);
int nIndex = blockComposer.ShowText(strText, false);
blockComposer.End();
....
composer.End();
composer.Flush();
}
答案 0 :(得分:1)
函数:ReportFonts.GetFont(...)
每次被创建一个新字体。
然后,该字体被存储在dll的内存空间中,并且最终文件占用了很大的空间。
使用Dictionary <>解决了此问题,不仅内存空间干净而且文件大小可以接受,而且执行时间也大大缩短了。
迁移到64位也有所帮助。