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
Please, take a look at the TableHeader example for iText 7. We implement IEventHandler
interface so that the table will have the full width of your page. This is done using setWidth()
method.
Note that setWidthPercent()
won't work in your case, because 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.
Also beware of adding event handlers in the START_PAGE
event. Use END_PAGE
instead. And don't forget to set the document margins after creating a header:
TableHeaderEventHandler handler = new TableHeaderEventHandler(doc);
pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, handler);
doc.setMargins(20 + handler.getTableHeight(), 36, 36, 36);
Click this link if you want to see how to answer this question in iText 5.