Как я могу добавить верхний и нижний колонтитулы в pdf, используя iText в java?

Я пытаюсь добавить верхний и нижний колонтитулы в свой pdf (iText). Для этого я создал один сервлет, а также один класс HeaderandFooter, который расширяет PdfPageEventHelper.

public class HeaderAndFooter extends PdfPageEventHelper {
    public HeaderAndFooter(String name) {
        super();
    }

    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        super.onEndPage(writer, document);
        //code

    }
    @Override
    public void onStartPage(PdfWriter writer, Document document) {
        super.onStartPage(writer, document);
                //code

    }
}

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


person Ashish    schedule 29.10.2013    source источник


Ответы (1)


Взгляните на этот пример, взятый из книга iText in Action.

class TableHeader extends PdfPageEventHelper {
    /** The header text. */
    String header;
    /** The template with the total number of pages. */
    PdfTemplate total;

    /**
     * Allows us to change the content of the header.
     * @param header The new header String
     */
    public void setHeader(String header) {
        this.header = header;
    }

    /**
     * Creates the PdfTemplate that will hold the total number of pages.
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onOpenDocument(PdfWriter writer, Document document) {
        total = writer.getDirectContent().createTemplate(30, 16);
    }

    /**
     * Adds a header to every page
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onEndPage(PdfWriter writer, Document document) {
        PdfPTable table = new PdfPTable(3);
        try {
            table.setWidths(new int[]{24, 24, 2});
            table.setTotalWidth(527);
            table.setLockedWidth(true);
            table.getDefaultCell().setFixedHeight(20);
            table.getDefaultCell().setBorder(Rectangle.BOTTOM);
            table.addCell(header);
            table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
            table.addCell(String.format("Page %d of", writer.getPageNumber()));
            PdfPCell cell = new PdfPCell(Image.getInstance(total));
            cell.setBorder(Rectangle.BOTTOM);
            table.addCell(cell);
            table.writeSelectedRows(0, -1, 34, 803, writer.getDirectContent());
        }
        catch(DocumentException de) {
            throw new ExceptionConverter(de);
        }
    }

    /**
     * Fills out the total number of pages before the document is closed.
     * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(
     *      com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
     */
    public void onCloseDocument(PdfWriter writer, Document document) {
        ColumnText.showTextAligned(total, Element.ALIGN_LEFT,
                new Phrase(String.valueOf(writer.getPageNumber() - 1)),
                2, 2, 0);
    }
}  
person Alexis Pigeon    schedule 29.10.2013
comment
Спасибо, но когда я использую это, оно перекрывается с моим предыдущим текстом. как я могу выровнять так, чтобы заголовок отображался вверху, а нижний колонтитул - внизу страницы. - person Ashish; 30.10.2013
comment
В onEndPage вы можете разместить верхний/нижний колонтитул в абсолютной позиции по вашему выбору. Вы также можете поиграть с полями Document. - person Alexis Pigeon; 30.10.2013
comment
хорошо .. Но могу ли я вызвать метод onEndPage(). Я использую PdfWriter.getInstance(document, response.getOutputStream()).setPageEvent(new HeaderAndFooter(Employee Management System)); - person Ashish; 30.10.2013
comment
Вам не нужно явно вызывать onEndPage, он будет вызван автоматически. - person Alexis Pigeon; 30.10.2013
comment
Я использовал onCloseDocument (создатель PdfWriter, документ документа) и onOpenDocument (создатель PdfWriter, документ документа). Они также вызываются неявно или я должен вызывать? - person Ashish; 31.10.2013
comment
Они также будут автоматически вызываться. - person Alexis Pigeon; 31.10.2013