When asked how he adds new values ββto the title, the OP clarified in a comment that he is doing this
sending values ββto the constructor for each page
This indicates that it creates a new instance of HeaderAddFooter each time and redirects it to the PdfWriter setPageEvent method.
Unfortunately, the OP was unable or unwilling to provide more code. So let his code look like this:
Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, ...); document.open(); for (int page = ...) { String nameForPage = ... String idForPage = ... writer.setPageEvent(new HeaderAddFooter(nameForPage, idForPage)); ... add content for page ... document.newPage(); } document.close();
This, unfortunately, does not work as expected, because PdfWriter.setPageEvent is a little unnamed (and also incorrectly documented in Javadocs): it is not a real setter, but rather more like an adder:
public void setPageEvent(final PdfPageEvent event) { if (event == null) this.pageEvent = null; else if (this.pageEvent == null) this.pageEvent = event; else if (this.pageEvent instanceof PdfPageEventForwarder) ((PdfPageEventForwarder)this.pageEvent).addPageEvent(event); else { PdfPageEventForwarder forward = new PdfPageEventForwarder(); forward.addPageEvent(this.pageEvent); forward.addPageEvent(event); this.pageEvent = forward; } }
Thus, the accepted OP code does not replace the old page event listener with a new one, but instead adds it .
There are two ways to fix this:
Or install only one instance of HeaderAddFooter initially outside the loop and change the contents of its members inside the loop:
Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, ...); document.open(); HeaderAddFooter headerAddFooter = new HeaderAddFooter("", ""); writer.setPageEvent(headerAddFooter); for (int page = ...) { String nameForPage = ... String idForPage = ... headerAddFooter.patientName = nameForPage; headerAddFooter.patientID = idForPage; ... add content for page ... document.newPage(); } document.close();
This will most likely require more visibility for these HeaderAddFooter variables. Alternatively, customization methods may be added for them.
Or use the special null handling in PdfWriter.setPageEvent :
Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, ...); document.open(); for (int page = ...) { String nameForPage = ... String idForPage = ... writer.setPageEvent(null); writer.setPageEvent(new HeaderAddFooter(nameForPage, idForPage)); ... add content for page ... document.newPage(); } document.close();
The first option (using setter methods for cleaner code) is a more common option.
source share