title: PdfPTable generation on multiple pages at absolute value with itext
body: <p>I'm generating an invoice and I've been working with iText for 2 days now.</p>
  
  <p>My question is: How can I split a PdfPTable over multiple pages if I'm not adding them directly in a document but writing it from a PdfContentByte.</p>
  
  <p><a href="http://ge.tt/4o1AaIV1/v/0" rel="nofollow">this</a> is the output. The things I don't get the hang of:</p>
  
  <p>1: How do I make the header  row show up on the new page? (without readding the first row) </p>
  
  <p>2: How can I automate a loop (and not hard code) for many records so it splits the table on multiple pages? </p>
  
  <p>3: <a href="http://ge.tt/2nHBLGV1/v/0" rel="nofollow">Here</a> This is how my invoice should look and at the end of the table I add a footer table that holds information about total cost and cost with VAT. How can I calculate the total height of the table on the last page and add at the end of it my footer table?</p>
  
  <p>this is the code I use to generate the pdf so far:</p>
  
  <pre><code>private void generateTable(Document doc, PdfContentByte cb) throws DocumentException {
  TableHeaderFields headerFields = new TableHeaderFields();
  
  PdfPTable invTable = new PdfPTable(7);
  invTable.setWidths(new int[] {20, 200, 40, 40, 70, 70, 70});
  PdfPCell invCell;
  // invTable.getDefaultCell().setBackgroundColor(BaseColor.LIGHT_GRAY);
  for (String colTitle : headerFields.getHeaderFields()) {
    invCell = new PdfPCell(new Phrase(colTitle, new Font(bfBold, 8)));
    invCell.setBackgroundColor(BaseColor.LIGHT_GRAY);
    invCell.setHorizontalAlignment(Element.ALIGN_CENTER);
    invTable.addCell(invCell);
  }
  invTable.setHeaderRows(2);
  invTable.setTotalWidth(500);
  
  //   invTable.getDefaultCell().setBackgroundColor(null);
  //Sample Content of the table;
  List&lt;InvoiceLine&gt; contentList = InvoiceLine.generateListOfInvLine(70);
  
  int nrCrt = 1;
  float totalSum = 0;
  float height = 0;
  for (InvoiceLine invLine : contentList) {
    //      System.out.println(invLine);
    height = invTable.getTotalHeight();
  
    invCell = new PdfPCell(new Phrase("" + nrCrt++, new Font(bf, 8)));
    invTable.addCell(invCell);
  
    invCell = new PdfPCell(new Phrase(invLine.getItem_desc(), new Font(bf, 8)));
    invTable.addCell(invCell);
  
    invCell = new PdfPCell(new Phrase("" + invLine.getUm(), new Font(bf, 8)));
    invCell.setHorizontalAlignment(Element.ALIGN_CENTER);
    invTable.addCell(invCell);
  
    invCell = new PdfPCell(new Phrase("" + invLine.getQty(), new Font(bf, 8)));
    invCell.setHorizontalAlignment(Element.ALIGN_CENTER);
    invTable.addCell(invCell);
  
    invCell = new PdfPCell(new Phrase("" + invLine.getPrice(), new Font(bf, 8)));
    invCell.setHorizontalAlignment(Element.ALIGN_CENTER);
    invTable.addCell(invCell);
  
    invCell = new PdfPCell(new Phrase("" + (float) (invLine.getQty() * invLine.getPrice()), new Font(bf, 8)));
    invCell.setHorizontalAlignment(Element.ALIGN_CENTER);
    invTable.addCell(invCell);
  
    invCell = new PdfPCell(new Phrase("" + (float) (invLine.getQty() * invLine.getPrice() * 0.24), new Font(bf, 8)));
    invCell.setHorizontalAlignment(Element.ALIGN_CENTER);
    invTable.addCell(invCell);
    totalSum += (invLine.getQty() * invLine.getPrice());
  }
  invTable.writeSelectedRows(0, 40, 50, 630, cb);
  //    if ((PageSize.A4.getHeight() - height) &lt;= 40) {
  //      System.out.println("A4 : " + PageSize.A4.getHeight() + " vs " + height);
  doc.newPage();
  invTable.writeSelectedRows(41, -1, 50, 630, cb);
  //    } else
  System.out.println("WE'RE OK:" + "A4 : " + PageSize.A4.getHeight() + " vs " + height);
  
  PdfPTable footer = generateFooterForTable(totalSum, (float) 0.24);
  footer.setTotalWidth(500);
  footer.writeSelectedRows(0, -1, 50, 630 - height, cb);
   }
  
    private PdfPTable generateFooterForTable(float total, float vatRate) throws DocumentException {
  PdfPTable footerTable = new PdfPTable(5);
  footerTable.setWidths(new int[] {75, 185, 110, 70, 70,});
  
  PdfPCell invCell = new PdfPCell(new Phrase("Semnatura si\n" + "stampila furnizorului", new Font(bf, 8)));
  invCell.setRowspan(2);
  footerTable.addCell(invCell);
  
  invCell = new PdfPCell(new Phrase("Numele Delegatului\n" + "Act Delegat" + "Semnatura", new Font(bf, 8)));
  invCell.setRowspan(2);
  footerTable.addCell(invCell);
  
  invCell = new PdfPCell(new Phrase("TOTAL", new Font(bf, 8)));
  invCell.setHorizontalAlignment(Element.ALIGN_CENTER);
  footerTable.addCell(invCell);
  
  invCell = new PdfPCell(new Phrase("" + total, new Font(bf, 8)));
  invCell.setHorizontalAlignment(Element.ALIGN_CENTER);
  footerTable.addCell(invCell);
  
  invCell = new PdfPCell(new Phrase("" + total * vatRate, new Font(bf, 8)));
  invCell.setHorizontalAlignment(Element.ALIGN_CENTER);
  footerTable.addCell(invCell);
  
  invCell = new PdfPCell(new Phrase("TOTAL GENERAL", new Font(bf, 8)));
  invCell.setHorizontalAlignment(Element.ALIGN_CENTER);
  footerTable.addCell(invCell);
  
  invCell = new PdfPCell(new Phrase("" + (total + (total * vatRate)), new Font(bfBold, 8)));
  invCell.setHorizontalAlignment(Element.ALIGN_CENTER);
  invCell.setColspan(2);
  footerTable.addCell(invCell);
  return footerTable;
  }
  </code></pre>