PdfPTable as a header in iTextSharp

55,827

Solution 1

Bingo! PdfPageEventHandler class worked for me.

I used the PdfPageEventHelper overriding the OnEndPage method:

class _events : PdfPageEventHelper
{
    public override void OnEndPage(PdfWriter writer, Document document)
    {
        PdfPTable table = new PdfPTable(1);
        //table.WidthPercentage = 100; //PdfPTable.writeselectedrows below didn't like this
        table.TotalWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin; //this centers [table]
        PdfPTable table2 = new PdfPTable(2);

        //logo
        PdfPCell cell2 = new PdfPCell(Image.GetInstance(@"C:\path\to\file.gif"));
        cell2.Colspan = 2;
        table2.AddCell(cell2);

        //title
        cell2 = new PdfPCell(new Phrase("\nTITLE", new Font(Font.HELVETICA, 16, Font.BOLD | Font.UNDERLINE)));
        cell2.HorizontalAlignment = Element.ALIGN_CENTER;
        cell2.Colspan = 2;
        table2.AddCell(cell2);

        PdfPCell cell = new PdfPCell(table2);
        table.AddCell(cell);

        table.WriteSelectedRows(0, -1, document.LeftMargin, document.PageSize.Height - 36, writer.DirectContent);
    }
}

then, build pdf

Document document = new Document(PageSize.A4, 36, 36, 36 + <height of table>, 36); // note height should be set here
_events e = new _events();
PdfWriter pw = PdfWriter.GetInstance(document, new FileStream("TableTest.pdf", FileMode.Create));
pw.PageEvent = e;
document.Open();

for(int i=0;i<100;i++)
{
    document.Add(new Phrase("TESTING\n"));
}

document.Close();

Solution 2

I used a a very simple approach to add a header row on each page, when creating a PdfPTable with 'n' rows, where 'n' could any integer. I am using iTextSharp 4.0.4.0.

So, you could create a table with 1000 rows or 2 rows or 5000 rows, but iTextSharp will automatically page the output for you. What iTextSharp will not do is automatically add a header to start of every page.

In order to add a header row for every page, all I did was add the single line of code after creating the PdfPTable with all its rows and cells, and then iTextSharp automatically paged the output with a header row. 'table' is the instance of PdfPTable that I created in my code before setting its HeaderRows property.

table.HeaderRows = 1; //this will automatically insert a header row 
                      //at start of every page. The first row you created
                      //in your code will be used as the header row in this case.
Share:
55,827
David Fox
Author by

David Fox

C# ASP.NET MVC JavaScript Azure SQL Server

Updated on March 31, 2020

Comments

  • David Fox
    David Fox over 4 years

    I need a table with about 12 cells to display as a header. The following code fails to do this. I am aware table2 does not have 12 cells. On the second page, only "testing" is displayed. What am I missing?

    Thanks in advance!

    Document document = new Document();
    
            try
            {
                PdfWriter.GetInstance(document, new FileStream("TableTest.pdf", FileMode.Create));
                document.Open();
    
                PdfPTable table = new PdfPTable(1);
                table.WidthPercentage = 100;
                PdfPTable table2 = new PdfPTable(2);
    
                //logo
                PdfPCell cell2 = new PdfPCell(Image.GetInstance(@"C:\path\to\file.gif"));
                cell2.Colspan = 2;
                table2.AddCell(cell2);
    
                //title
                cell2 = new PdfPCell(new Phrase("\nTITLE TEXT", new Font(Font.HELVETICA, 16, Font.BOLD | Font.UNDERLINE)));
                cell2.HorizontalAlignment = Element.ALIGN_CENTER;
                cell2.Colspan = 2;
                table2.AddCell(cell2);
    
                PdfPCell cell = new PdfPCell(table2);
                table.HeaderRows = 1;
                table.AddCell(cell);
                table.AddCell(new PdfPCell(new Phrase("")));
    
                document.Add(table);
    
                document.Add(new Phrase("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ntesting"));
            }
            catch (DocumentException de)
            {
                Console.Error.WriteLine(de.Message);
            }
            catch (IOException ioe)
            {
                Console.Error.WriteLine(ioe.Message);
            }
    
            document.Close();
    
  • mkl
    mkl almost 3 years
    Nope. iText developers have been recommending against using OnStartPage for adding any content as that can have adverse side effects. OnEndPage is the method to use just like in David's accepted answer.