I'm creating a PDF using ITextSharp which is composed of a single PdfTable. Unfortunately for a particular data set, I'm getting an Out of memory Exception due to the large number PdfPCells that are created (I've profiled the memory usage - I've got nearly 1/2 a million cells !)
Is there any way to reduce the memory usage in such a case? I've tried flushing at various points (after each row) and full compression
The PdfWriter is based on a FileStream
Code looks a pretty much like this:
Document document = Document();
FileStream stream = new FileStream(fileName,FileMode.Create);
pdfWriter = PdfWriter.GetInstance(document, stream);
document.Open();
PdfPTable table = new PdfPTable(nbColumnToDisplay);
foreach (GridViewRow row in gridView.Rows)
{
j = 0;
for (int i = 0; i < gridView.HeaderRow.Cells.Count; i++)
{
PdfPCell cell = new PdfPCell( new Phrase( text) );
table.AddCell(cell);
}
}
document.Add(table);
document.Close();
PdfPTable pdftbale = new PdfPTable(gridview.HeaderRow.Cells.Count);
iTextSharp has a very cool interface called
ILargeElement
that thePdfPTable
implements. According to the documentation:So all you need to do is after you create your
PdfPTable
, set theComplete
property to false. In your inner loop do some form of counter that every once in a while adds the table and thus clears the memory. Then at the end of the loop setComplete
to true and add it one more time.Below is sample code that shows this off. Without the counter check this code uses about 500MB of RAM on my machine. With the counter check every 1,000 items it goes down to 16MB of RAM. You'll need to find your own sweet spot for the counter and that will depend on how much text you're adding to each cell on average.