Search code examples
c#pdfitext7

Creating and displaying data in iText 7 for .NET Table


It should be simple enough:

public void WritePartsPdf(Document doc)
{
    Table table = new Table(2, true);

    foreach (var part in PartsList)
    {
        Paragraph name = new Paragraph(part.PartName);
        Paragraph length = new Paragraph(part.Length.ToString());

        var cell = new Cell().Add(name);
        var cell2 = new Cell().Add(length);
        cell.Add(cell2);

        table.AddCell(cell);
    }
    doc.Add(table);
}

However my paragraphs are duplicated across all cells, I need the obvious here being one column for name and the other one for length. This is what I got so far:

enter image description here

Help please!


Solution

  • So, the "problem" was that setting the table up is even simpler than I initially thought. We don't need nested cells, since I already had a column count set just adding one cell after the other did the trick:

    public void WritePartsPdf(Document doc)
    {
        Table table = new Table(2, true);
        foreach (var part in PartsList)
        {
            var name = new Paragraph(part.PartName);
            var length = new Paragraph(part.Length.ToString());
            var column1 = new Cell().Add(name);
            var column2 = new Cell().Add(length);
            table.AddCell(column1);
            table.AddCell(column2);
        }
        doc.Add(table);
    }
    

    Had to dig through the code here to get the idea: https://developers.itextpdf.com/content/itext-7-jump-start-tutorial-net/chapter-3-using-renderers-and-event-handlers

    ****UPDATE****

    It gets even easier. I was messing around with it and figured out that Paragraph extends BlockElement<T>, so we don't need the cell object at all to add cells to the table:

    private void WriteListToPdf(Document doc)
    {
        Table table = new Table(2, true);
    
        foreach (var item in myList)
        {
            table.AddCell(new Paragraph(item.Foo));
            table.AddCell(new Paragraph(item.Bar));
        }
        doc.Add(table);
    }
    

    Fortunatelly tableAddCell has an overload for BlockElement<T> ;)

    You're still gonna need cell objects if you need multiple lines inside a single cell. Just add a bunch of paragraphs to the cell and then add the cell to the table.