填充大文件时出现PDFClown System.OutOfMemoryException

时间:2018-07-16 18:58:38

标签: c# out-of-memory pdfclown

我正在使用来自数据库的数据使用PDFClown生成大型Report pdf文件。

该过程需要很长时间,并且最终在页数接近150标记时占用了超过1.5GB的内存,并且错误:

  

PDFClown.dll中发生了'System.OutOfMemoryException'类型的第一次机会异常

由于我需要定期生成超过1500页的报告,因此这是一个主要问题。

我能做些什么吗?

  1. 未用完内存(必要)
  2. 加快文件创建速度(理想情况下)

请注意:尽管文件很大,但生成的报告(使用较小的数据集)是准确的。

这是我的代码示例:

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();
}

屏幕快照样本报告页面(出于客户端隐私原因而删除): Sample Report Page

1 个答案:

答案 0 :(得分:1)

函数:ReportFonts.GetFont(...)每次被创建一个新字体。 然后,该字体被存储在dll的内存空间中,并且最终文件占用了很大的空间。

使用Dictionary <>解决了此问题,不仅内存空间干净而且文件大小可以接受,而且执行时间也大大缩短了。

迁移到64位也有所帮助。