Создать PDF с изображениями в верхнем и нижнем колонтитулах с iText - PullRequest
0 голосов
/ 21 мая 2019

Я с нетерпением жду создания PDF-файла с помощью iText. PDF будет иметь верхний и нижний колонтитулы. В верхнем и нижнем колонтитулах будет изображение (логотип компании).

Я с нетерпением жду примера, подобного этому. Я буду использовать библиотеку iText впервые, поэтому не знаю, с чего начать.

1 Ответ

0 голосов
/ 27 мая 2019

Чтобы добавить верхние и нижние колонтитулы в 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 и другие классы макета. )

...