d0x
d0x

Reputation: 11571

How to append the text "Continuation of ..." at the new page, when an element got split by setKeepTogether(true)

When an Element gets moved to a new page because of a setKeepTogether(true) configuration, I need to a text "Continutation of ..." to the new page.

I tried that with the PageEvent.onStartPage() but it's not allowed to call Document.add() inside a PageEvent.

But how to solve that now?

This small example reproduces my problem:

public class Main {
    public static String continuation = null;

    public static void main(final String[] args) throws Exception {
        final Document document = new Document(PageSize.A7);

        final PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("text.pdf"));

        document.open();

        // Now I add the introduction text
        document.add(new Paragraph("A nice \nIntroduction \nover some lines."));

        // Now I put my "huge" paragraph. When it breaks,
        // the first line of the new page should be "Continuation of smth."
        continuation = "smth.";

        final Paragraph paragraph = new Paragraph("What is \nthe answer \nto life the \nuniverse and \neverything?\n\nThe Answer to \nthis question \nis:\n42");
        paragraph.setKeepTogether(true);

        document.add(paragraph);

        document.close();
    }
}

The result should look somehow like this.

Upvotes: 3

Views: 294

Answers (1)

d0x
d0x

Reputation: 11571

This can be hacked by utelizing the headerRows of a PdfPTable.

It is really a hack, maybe someone else has a better idea to reach the goal:

public static void main(final String[] args) throws Exception
{
    final Document document = new Document(PageSize.A7);

    PdfWriter.getInstance(document, new FileOutputStream("text.pdf"));

    document.open();

    // The content gets wrapped into an table. If the table breaks
    // we utilize the "headerRows" to print `Continuation of xx`.
    final PdfPTable table = new PdfPTable(1);
    table.setHeadersInEvent(false);
    table.setHeaderRows(1);
    table.setSkipFirstHeader(true);
    table.setWidthPercentage(100);
    table.getDefaultCell().setBorder(0);
    table.getDefaultCell().setPadding(0);

    // This is the header we print ONLY if the page breaks.
    table.addCell("Continuation of " + "smth.");

    // Now I add the introduction text
    final PdfPTable firstText = new PdfPTable(1);
    firstText.addCell("A nice \nIntroduction \ninto \"smth.\" \nover some lines.");
    // in the original code i add some other things here as well
    table.addCell(firstText);

    // Now I put a "huge" paragraph (it will not fit on the first page
    final PdfPTable secondText = new PdfPTable(1);
    secondText.addCell("Force \na pagebreak\nasdf\nasdf\nasdf\nasdf\nasdf\nasdf\nasdf\nasdf\nasdf\nasdf\nasdf\nasdf\nasdf\nasdf.");
    // in the original code i add some other things here as well
    table.addCell(secondText);

    document.add(table);

    document.close();
}

The code generates the correct PDF. But the way is really ugly...

I've uploded the PDF here.

Upvotes: 1

Related Questions