How to add text at an absolute position on the top of the first page?

I have a script that creates a PDF file and writes contents to it. After the execution is complete I need to write the status (fail, success) to the PDF, but the status should be on the top of the page. So the solution I came up with is to use absolute positioned text like this:

 

PdfContentByte cb = writer.DirectContent;
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb.SaveState();
cb.BeginText();
cb.MoveText(700, 30);
cb.SetFontAndSize(bf, 12);
cb.ShowText("My status");
cb.EndText();
cb.RestoreState();
But as the PDF creates multiple pages, this text is added to the last page of the PDF. How can I add it to the 1st page?

Posted on StackOverflow on Nov 9, 2015 by BiJ

iText was designed to flush content from memory as soon as possible: if a page is finished, that page is sent to the OutputStream and there is no way to return to that page.

That doesn't mean your requirement is impossible. PDF has a concept known as Form XObject. In iText 7, this concept is implemented under the PdfFormXObject class. Such a PdfFormXObject is a rectangular area with a fixed size that can be added to a page without being part of that page.

Please take a look at the WriteOnFirstPage example. We create a template and wrap it inside an Image object. By doing this, we can add the PdfFormXObject to the document just like any other object:

object. By doing this, we can add the Form XObject to the document just like any other object: PdfFormXObject template = new PdfFormXObject(new Rectangle(523, 50)); PdfCanvas templateCanvas = new PdfCanvas(template, pdfDoc); doc.add(new Image(template));

Now we can add as much data as we want:

for (int i = 0; i 

Adding 100 "test" lines will cause iText 7 to create 4 pages. Once we're on page 4, we no longer have access to page 1, but we can still write content to the template object created before:

templateCanvas
    .beginText()
    .setFontAndSize(PdfFontFactory.createFont(FontConstants.HELVETICA), 12)
    .showText(String.format("There are %s pages in this document", pdfDoc.getNumberOfPages()))
    .endText()
    .stroke();

If you check the resulting PDF write_on_first_page.pdf, you'll notice that the text we've added last is indeed on the first page.

Click this link if you want to see how to answer this question in iText 5.



Ready to use iText?

Try our iText 7 Library and add-ons FREE for 30 days. Test your proof of concept, and see if our solution is right for you.

Get my FREE trial
Contact

Still have questions? 

We're happy to answer your questions. Reach out to us and we'll get back to you shortly.

Contact us
Stay updated

Join 11,000+ subscribers and become an iText PDF expert by staying up to date with our new products, updates, tips, technical solutions and happenings.

Subscribe Now