Как вставить общее количество страниц в нижний колонтитул каждой страницы документа iTextSharp? [Дубликат]

1

У меня есть следующая ситуация с обработкой iTextSharp: я создаю отчет в формате PDF, и я не знаю ранее числа страниц.

В нижнем колонтитуле каждой страницы я вставляю номер страницы: "1/x", где x - общий номер страницы моего отчета.

В это время у меня есть класс с именем PdfHeaderFooter, который расширяет PdfPageEventHelper, в котором я реализую OnEndPage(), чтобы создать нижний колонтитул в моем PDF- файле.

    // write on end of each page
    public override void OnEndPage(PdfWriter writer, Document document)
    {
        base.OnEndPage(writer, document);
        PdfPTable tabFoot = new PdfPTable(new float[] { 1F });
        tabFoot.TotalWidth = document.Right - document.Left;

        tabFoot.DefaultCell.Border = PdfPCell.NO_BORDER;
        tabFoot.DefaultCell.CellEvent = new RoundedBorder();

        PdfPTable innerTable = new PdfPTable(2);
        innerTable.SetWidths(new int[] { 247, 246 });
        innerTable.TotalWidth = document.Right - document.Left;  
        innerTable.DefaultCell.Border = PdfPCell.NO_BORDER;
        PdfPCell innerCellLeft = new PdfPCell(new Phrase("Early Warning - Bollettino")) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_LEFT };
        PdfPCell innerCellRight = new PdfPCell(new Phrase("Pag. " + numPagina + "/5")) { Border = PdfPCell.NO_BORDER, Padding = 5, MinimumHeight = 20, HorizontalAlignment = Element.ALIGN_RIGHT };
        innerTable.AddCell(innerCellLeft);
        innerTable.AddCell(innerCellRight);

        tabFoot.AddCell(innerTable);

        tabFoot.WriteSelectedRows(0, -1, document.Left, document.Bottom, writer.DirectContent);

        numPagina++;
    }

Как вы можете видеть, в это время я обрабатываю ситуацию, используя:

 PdfPCell innerCellRight = new PdfPCell(new Phrase("Pag. " + numPagina + "/5")) 

Но таким образом общий номер страницы фигед (/5), но я не могу знать ранее, что страницы 5 или другое число.

Поэтому я думаю, что я могу справиться с ситуацией следующим образом:

1) Я могу подсчитать вызов NewPage() в классе, который генерирует

2) Затем я могу попытаться изменить значение общей страницы в нижнем колонтитуле каждой страницы

Но я не знаю, является ли это разумным решением или если это возможно

Теги:
pdf
itext
pdf-generation
itextsharp

1 ответ

0

На данный момент вы добавляете номера страниц (например, страницу X of Y), вы знаете значение X, но нет способа узнать значение Y.

Существует два варианта решения этой проблемы. Это можно найти в официальной документации, если вы посмотрите страницу страницы X X Y.

Один из вариантов - ввести пустой PdfTemplate где вы обычно должны иметь значение Y. Затем вы можете реализовать onCloseDocument(). Это событие запускается непосредственно перед закрытием документа. В этот момент значение Y известно, и вы можете нарисовать его на PdfTemplate.

Другой вариант - создать PDF за два прохода. Сначала вы создаете его в памяти без "Страница X of Y". Затем вы используете PdfStamper для добавления правильных значений X X Y (потому что вы знаете общее количество страниц с первого прохода).

PS если вам нужны образцы кода, вы можете найти # портов С примерами Java здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню