Я использую itext.dll для создания PDF с использованием ASP.NET, и я хочу нижний колонтитул в моем документе? - PullRequest
0 голосов
/ 30 октября 2009

Я использую itext.dll для создания PDF с использованием ASP.NET , и я хочу нижний колонтитул в моем документе в виде:

    Page 1 of 6 

    HeaderFooter footer = new HeaderFooter(new Phrase("Page"), new Phrase(" of 6")); 
    footer.setBorder(Rectangle.NO_BORDER); 
    footer.setAlignment(Element.ALIGN_CENTER); 
    document.setFooter(footer); 

Возможно ли это без жесткого кодирования общего количества страниц? То есть Есть ли способ получить общее количество страниц в документе?

1 Ответ

2 голосов
/ 16 ноября 2009

Я обнаружил, что есть (по крайней мере) 2 способа сделать это.

Одним из них является создание документа без нижнего колонтитула, а после этого используйте PdfStamper, чтобы поставить отметки с номерами страниц с общим количеством. Но у меня возникли некоторые проблемы, когда я вывел продукт штампов на MemoryStream, и, похоже, нет способа закрыть штамповщик без одновременного закрытия потока.

Другой способ - создать один экземпляр PdfTemplate, который будет представлять общее количество страниц, и добавить его на каждую страницу в нижний колонтитул или в любое другое место.

Далее вы можете использовать свой собственный класс PdfPageEventHelper и реализовать метод OnCloseDocument, где вы можете заполнить шаблон общим количеством страниц:

public override void OnCloseDocument(PdfWriter writer, Document document)
{
    PageCountTemplate.BeginText();
    PageCountTemplate.SetFontAndSize(HeaderFont.BaseFont, HeaderFont.Size);
    PageCountTemplate.ShowText((writer.CurrentPageNumber - 1).ToString());
    PageCountTemplate.EndText();
}

Лично я также использую OnOpenDocument для создания шаблона и OnEndPage для написания его на каждой странице.

EDIT: Чтобы ответить на вопрос Яна, OnCloseDocument вызывается только один раз, когда весь документ написан. Когда Doc.Close() называется, я имею в виду.

...