How to add a table as a header?
I am working with iTextSharp trying to add an header and a footer to my generated PDF, but if I try to add an header that have width of 100% of my page I have some problem.
- I have create a class named
PdfHeaderFooter
that extends the iTextSharpPdfPageEventHelper
class, - into
PdfHeaderFooter
I have implemented theOnStartPage()
method that generate the header:
public override void OnStartPage(PdfWriter writer, Document document) { base.OnStartPage(writer, document); PdfPTable tabHead = new PdfPTable(new float[] { 1F }); PdfPCell cell; tabHead.WidthPercentage = 100; cell = new PdfPCell(new Phrase("Header")); tabHead.AddCell(cell); tabHead.WriteSelectedRows(0, -1, 150, document.Top, writer.DirectContent); }
If I use something like tabHead.TotalWidth = 300F;
instead of tabHead.WidthPercentage = 100;
, it works well, but if I try to set as 100% the width of the tabHead
table (as I do in the previous example) when it call the tabHead.WriteSelectedRows(0, -1, 150, document.Top, writer.DirectContent)
method it throws the following exception:
The table width must be greater than zero.
Why? What is the problem? How is it possible that the table have 0 size if I am setting it to 100%?
Posted on StackOverflow on Mar 12, 2014 by AndreaNobili
First things first: please do not add content to a PDF in the OnStartPage()
event. Always use the OnEndPage()
event.
As for your question: when using writeSelectedRows()
, it doesn't make sense to set the width percentage to 100%. Setting the width percentage is meant for when you add a document using document.add()
(which is a method you can't use in a page event). When using document.add()
, iText calculates the width of the table based on the page size and the margins.
You are using writeSelectedRows()
, which means you are responsible to define the size and the coordinates of the table.
If you want the table to span the complete width of the page, you need:
table.TotalWidth = document.Right - document.Left;
You're also using the wrong X-coordinate: you should use document.Left
instead of 150
.
Additional info:
- The first two parameters define the start row and the end row. In your case, you start with row 0 which is the first row, and you don't define an end row (that's what -1 means) in which case all rows are drawn.
- You omitted the parameters for the columns (there's a variation of the
writeSelectedRows()
that expects 7 parameters). - Next you have the X and Y value of start coordinate for the table.
- Finally, you pass a
PdfContentByte
instance. This is the canvas on which you're drawing the table.
Click this link if you want to see how to answer this question in iText 7.