Прежде всего, разработчики iText часто подчеркивали, что в onStartPage
НЕ ДОЛЖНО добавлять контент в PDF.Причина в том, что при определенных обстоятельствах создаются неиспользуемые страницы и для них вызывается onStartPage
, но затем они удаляются.Однако, если вы добавляете контент к ним в onStartPage
, они не удаляются, а остаются в вашем документе.
Таким образом, всегда используйте onEndPage
для добавления любого контента на страницу.
В вашем случае использования есть еще одна причина для использования onEndPage
: Обычно становится ясно, что данная страница является последней страницей, когда последний бит контента был добавлен в документ.Обычно это происходит после того, как onStartPage
был вызван для страницы, но до того, как onEndPage
получил.
Таким образом, после того, как вы добавили последний бит обычного содержимого страницы в документ, вы можете просто установить флагв прослушивателе событий страницы текущая страница является последней страницей документа.Теперь следующий вызов onEndPage
знает, что он обрабатывает последнюю страницу и может добавлять содержимое по-разному.
Таким образом, прослушиватель событий страницы будет выглядеть так
class MyPageEventListener extends PdfPageEventHelper {
public boolean lastPage = false;
@Override
public void onEndPage(PdfWriter writer, Document output) {
if (!lastPage) {
[add extra content for page before the last one]
} else {
[add extra content for last page]
}
}
...
}
и использоваться так
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, TARGET);
MyPageEventListener pageEventListener = new MyPageEventListener();
writer.setPageEvent(pageEventListener);
document.open();
[add all regular content to the document]
pageEventListener.lastPage = true;
document.close();