在itextsharp.dll中发生了'System.OutOfMemoryException'类型的异常,但未在用户代码

时间:2016-05-24 06:48:37

标签: asp.net-mvc pdf c#-4.0 itextsharp

我正在使用iTextSharp来创建pdf。我有100k记录,但我得到以下异常:

  

发生了'System.OutOfMemoryException'类型的异常   itextsharp.dll但未在用户代码中处理在该行:   bodyTable.AddCell(currentProperty.GetValue(lst,null).ToString());

代码是:

var doc = new Document(pageSize);

PdfWriter.GetInstance(doc, stream);
doc.Open();

//Get exportable count
int columns = 0;

Type currentType = list[0].GetType();

//PREPARE HEADER
//foreach visible columns check if current object has proerpty
//else search in inner properties
foreach (var visibleColumn in visibleColumns)
{
    if (currentType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key) != null)
    {
        columns++;
    }
    else
    {
        //check child property objects
        var childProperties = currentType.GetProperties();
        foreach (var prop in childProperties)
        {
            if (prop.PropertyType.BaseType == typeof(BaseEntity))
            {
                if (prop.PropertyType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key) != null)
                {
                    columns++;
                    break;
                }
            }
        }
    }
}


//header
var headerTable = new PdfPTable(columns);
headerTable.WidthPercentage = 100f;

foreach (var visibleColumn in visibleColumns)
{
    if (currentType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key) != null)
    {
        //headerTable.AddCell(prop.Name);
        headerTable.AddCell(visibleColumn.Value);
    }
    else
    {
        //check child property objects
        var childProperties = currentType.GetProperties();
        foreach (var prop in childProperties)
        {
            if (prop.PropertyType.BaseType == typeof(BaseEntity))
            {
                if (prop.PropertyType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key) != null)
                {
                    //headerTable.AddCell(prop.Name);
                    headerTable.AddCell(visibleColumn.Value);
                    break;
                }
            }
        }
    }
}

doc.Add(headerTable);

var bodyTable = new PdfPTable(columns);
bodyTable.Complete = false;
bodyTable.WidthPercentage = 100f;

//PREPARE DATA
foreach (var lst in list)
{
    int col = 1;
    foreach (var visibleColumn in visibleColumns)
    {
        var currentProperty = currentType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key);
        if (currentProperty != null)
        {
            if (currentProperty.GetValue(lst, null) != null)
                bodyTable.AddCell(currentProperty.GetValue(lst, null).ToString());
            else
                bodyTable.AddCell(string.Empty);

            col++;
        }
        else
        {
            //check child property objects
            var childProperties = currentType.GetProperties().Where(p => p.PropertyType.BaseType == typeof(BaseEntity));
            foreach (var prop in childProperties)
            {
                currentProperty = prop.PropertyType.GetProperties().FirstOrDefault(p => p.Name == visibleColumn.Key);
                if (currentProperty != null)
                {
                    var currentPropertyObjectValue = prop.GetValue(lst, null);
                    if (currentPropertyObjectValue != null)
                    {
                        bodyTable.AddCell(currentProperty.GetValue(currentPropertyObjectValue, null).ToString());
                    }
                    else
                    {
                        bodyTable.AddCell(string.Empty);
                    }
                    break;
                }
            }
        }
    }
}

doc.Add(bodyTable);

doc.Close();

1 个答案:

答案 0 :(得分:1)

根据您为内存消耗提供的数据,内存要求的包络计算的后面给出100000 * 40 *(2 * 20 + 4)= 167MB。在你的记忆限制内,但它只是一个下限。我想每个Cell对象都很大。如果每个单元有512字节的开销,你可能会很好地看待2GB。我认为它可能更多,因为PDF是一个复杂的野兽。

因此,您可能会真实地看到实际上内存不足的情况。如果不是你的计算机,那么至少C#已经为它自己的东西预留了一些。

我会先做一件事 - 检查内存消耗,如here。您甚至可以尝试使用10,100,1000,10000,100000行并查看程序的行数。

你或许可以尝试另外一件事。如果您正在尝试使用大量数据打印格式良好的表,也许您可​​以输出HTML文档,这可以通过增量方式完成,您可以通过将内容写入文件而不是使用第三方库来完成。然后,您可以将该HTML文档“打印”为PDF。有问题,StackOverflow再次流向rescue