Чтобы добавить верхние и нижние колонтитулы в PDF-файл, сгенерированный с помощью iText 7.x, вы обычно создаете прослушиватели событий для начала и / или конца страницы и добавляете туда содержимое верхнего и нижнего колонтитула.
Например, вы можете сделать это, как в этом примере на сайте iText . Здесь определены два слушателя событий:
//Header event handler
protected class Header implements IEventHandler {
String header;
public Header(String header) {
this.header = header;
}
@Override
public void handleEvent(Event event) {
//Retrieve document and
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfDocument pdf = docEvent.getDocument();
PdfPage page = docEvent.getPage();
Rectangle pageSize = page.getPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(
page.getLastContentStream(), page.getResources(), pdf);
Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
canvas.setFontSize(18f);
//Write text at position
canvas.showTextAligned(header,
pageSize.getWidth() / 2,
pageSize.getTop() - 30, TextAlignment.CENTER);
}
}
Этот обработчик событий добавляет простую константную строку в качестве заголовка к текущей странице. Точно так же вы можете добавить изображение.
//page X of Y
protected class PageXofY implements IEventHandler {
protected PdfFormXObject placeholder;
protected float side = 20;
protected float x = 300;
protected float y = 25;
protected float space = 4.5f;
protected float descent = 3;
public PageXofY(PdfDocument pdf) {
placeholder =
new PdfFormXObject(new Rectangle(0, 0, side, side));
}
@Override
public void handleEvent(Event event) {
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfDocument pdf = docEvent.getDocument();
PdfPage page = docEvent.getPage();
int pageNumber = pdf.getPageNumber(page);
Rectangle pageSize = page.getPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(
page.getLastContentStream(), page.getResources(), pdf);
Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
Paragraph p = new Paragraph()
.add("Page ").add(String.valueOf(pageNumber)).add(" of");
canvas.showTextAligned(p, x, y, TextAlignment.RIGHT);
pdfCanvas.addXObject(placeholder, x + space, y - descent);
pdfCanvas.release();
}
public void writeTotal(PdfDocument pdf) {
Canvas canvas = new Canvas(placeholder, pdf);
canvas.showTextAligned(String.valueOf(pdf.getNumberOfPages()),
0, descent, TextAlignment.LEFT);
}
}
Этот обработчик событий немного сложнее, он добавляет Page x из y нижний колонтитул к текущей странице. Поскольку общее количество страниц y в то время неизвестно, вместо этого добавляется ссылка на заполнитель XObject, и как только вы узнаете, что все страницы созданы, вы можете вызвать writeTotal
чтобы этот метод записал текущее количество страниц документа в заполнитель XObject.
Вы регистрируете этих слушателей событий следующим образом:
PdfWriter writer= new PdfWriter(pdfDest);
PdfDocument pdfDocument = new PdfDocument(writer);
//Create event-handlers
String header = "pdfHtml Header and footer example using page-events";
Header headerHandler = new Header(header);
PageXofY footerHandler = new PageXofY(pdfDocument);
//Assign event-handlers
pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE,headerHandler);
pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE,footerHandler);
//Add content
[... here you add the regular page content to the PdfDocument ...]
//Write the total number of pages to the placeholder and close the document
footerHandler.writeTotal(pdfDocument);
pdfDocument.close();
(Фактический пример добавляет обычное содержимое страницы на основе HTML с использованием pdfHTML. Вы также можете сделать это или создать контент напрямую, используя Document
, Paragraph
, Text
и другие классы макета. )