Itext PDF: нижний колонтитул генерируется только на последней странице - PullRequest
0 голосов
/ 07 мая 2019

Я создаю список из 1К строк в PDF, и каждая страница имеет 50 строк. Мне нужно добавить нижний колонтитул в 2 строки на каждой странице. Поэтому я добавил PdfPageEventHelper, но он печатает только на последней странице и только в одной строке. Номер страницы также не печатается. Я попробовал примеры с сайта itext5. все еще не мог

Вот код ниже.

    public byte[] exportToPDF(List<T> searchResult, String serviceName) throws IOException{

        Document document = new Document(PageSize.A4.rotate(), 25f, 25f, 25f, 50f);
        try (ByteArrayOutputStream out = new ByteArrayOutputStream();)
        {
            PdfWriter writer = PdfWriter.getInstance(document, out);
            document.open();
            PdfPTable table = new PdfPTable(8);
            table.setWidthPercentage(100);
            printDataRows(searchResult, table);
            //Adding Footer
            document.add(table);
            HeaderFooter event = new HeaderFooter();
            writer.setPageEvent(event); 
            document.close();       
            return out.toByteArray();  
    }catch (Exception e)
    {
        e.printStackTrace();
        logger.error(PDF_GEN_ERROR + e);
    }
}

Вот код события

static class HeaderFooter extends PdfPageEventHelper
{
public HeaderFooter()
{
    super();
}



@Override
public void onEndPage(PdfWriter writer, Document document)
{

    PdfPTable table = new PdfPTable(3);
    try
    {
    Font regularFonts = FontFactory.getFont(FontFactory.HELVETICA);
    regularFonts.setSize(6);
    table.setTotalWidth(document.right() - document.left());
    table.setLockedWidth(true);
    table.getDefaultCell().setFixedHeight(10);
    table.getDefaultCell().setBorder(0);

    PdfPCell cv1 = new PdfPCell(new Phrase("Project Name", regularFonts));

    cv1.setFixedHeight(8);
    cv1.setBorder(0);
    cv1.setHorizontalAlignment(Element.ALIGN_LEFT);
    table.addCell(cv1);

    PdfPCell cv2 = new PdfPCell(new Phrase(String.format("Page %d of  ", writer.getPageNumber), regularFonts));

    cv2.setFixedHeight(8);
    cv2.setBorder(0);
    cv2.setHorizontalAlignment(Element.ALIGN_CENTER);
    table.addCell(cv2);

    PdfPCell cv3 = new PdfPCell(new Phrase("Product Group", regularFonts));

    cv3.setFixedHeight(8);
    cv3.setBorder(0);
    cv3.setHorizontalAlignment(Element.ALIGN_RIGHT);
    table.addCell(cv3);
    table.completeRow();

    PdfPCell cv21 = new PdfPCell(new Phrase("Printed on " + todaysDate(), regularFonts));

    cv21.setFixedHeight(8);
    cv21.setBorder(0);
    cv21.setHorizontalAlignment(Element.ALIGN_LEFT);
    table.addCell(cv21);

    PdfPCell cv22 = new PdfPCell(new Phrase(""));
    cv22.setBorder(0);
    table.addCell(cv22);

    PdfPCell cv23 = new PdfPCell(new Phrase(new Phrase("Proprietary and Confidential", regularFonts)));

    cv23.setBorder(0);
    cv23.setHorizontalAlignment(Element.ALIGN_LEFT);
    table.addCell(cv23);
    table.completeRow();
    PdfContentByte canvas = writer.getDirectContent();
    canvas.beginMarkedContentSequence(PdfName.ARTIFACT);
    table.writeSelectedRows(0, -1, 34, 40, canvas);
    canvas.endMarkedContentSequence();
    }
    catch (Exception de)
    {
    throw new SystemException(PDF_GEN_ERROR, de);
    }

}
}

1 Ответ

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

Вы устанавливаете обработчик событий после добавления таблицы в документ:

PdfWriter writer = PdfWriter.getInstance(document, out);
document.open();
...
document.add(table);
HeaderFooter event = new HeaderFooter();
writer.setPageEvent(event); 
document.close();

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

Чтобы обработчик событий страницы извлекал события для всех страниц, установите его заранее, например,

PdfWriter writer = PdfWriter.getInstance(document, out);
HeaderFooter event = new HeaderFooter();
writer.setPageEvent(event); 
document.open();
...
document.add(table);
document.close();

Таким образом, ваш обработчик событий страницы вызывается для каждогостр.

...