'Header Overlapping Content while Manipulating Existing PDF Using API IText 7 Java

In our application, we convert html content to pdf using IText 7 then we manipulate the newly created pdf to add header on each page of it. On first page, header shows up properly but from second page onwards it overlaps on content.

protected void manipulatePdf(String src, String dest) throws Exception {
    PdfReader pf = null;
    PdfWriter pw = null;
    PdfDocument pdfDoc = null;
    Document doc = null;
    try {
        pf = new PdfReader(src);
        pw = new PdfWriter(dest);
        pdfDoc = new PdfDocument(pf, pw);
        doc = new Document(pdfDoc, PageSize.A4);

        TableHeaderEventHandler handler = new TableHeaderEventHandler(doc);
        pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, handler);

        float topMargin = 20 + handler.getTableHeight();
        doc.setMargins(topMargin, 36, 36, 36);

    } catch (Exception e) {
        throw new Exception(e);
    } finally {
        doc.close();
        pdfDoc.close();
        pw.close();
        pf.close();
    }
}

private static class TableHeaderEventHandler implements IEventHandler {
    private Table table;
    private float tableHeight;
    private Document doc;

    public TableHeaderEventHandler(Document doc) {
        this.doc = doc;
        initTable();

        TableRenderer renderer = (TableRenderer) table.createRendererSubTree();
        renderer.setParent(new DocumentRenderer(doc));

        LayoutResult result = renderer.layout(new LayoutContext(new LayoutArea(0, PageSize.A4)));
        tableHeight = result.getOccupiedArea().getBBox().getHeight();
    }

    @Override
    public void handleEvent(Event currentEvent) {
        PdfDocumentEvent docEvent = (PdfDocumentEvent) currentEvent;
        PdfDocument pdfDoc = docEvent.getDocument();
        PdfPage page = docEvent.getPage();
        PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);
        PageSize pageSize = pdfDoc.getDefaultPageSize();
        float coordX = pageSize.getX() + doc.getLeftMargin();
        float coordY = pageSize.getTop() - doc.getTopMargin();
        float width = pageSize.getWidth() - doc.getRightMargin() - doc.getLeftMargin();
        float height = getTableHeight();
        Rectangle rect = new Rectangle(coordX, coordY, width, height);

        Canvas c = new Canvas(canvas, pdfDoc, rect).add(table);
        c.close();
        
    }
    
    public float getTableHeight() {
        return tableHeight;
    }

    private void initTable() {
        table = new Table(1);
        table.useAllAvailableWidth();
        table.addCell("Header row 1");
        table.addCell("Header row 2");
        table.addCell("Header row 3");
    }

}

I tried many examples hosted at IText knowledge base to avoid overlapping but in all the examples they are creating the PDF, but in my scenario the PDF is already created using IText 7's HTMLConverter.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source