У меня есть следующая ситуация с обработкой 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) Затем я могу попытаться изменить значение общей страницы в нижнем колонтитуле каждой страницы
Но я не знаю, является ли это разумным решением или если это возможно
На данный момент вы добавляете номера страниц (например, страницу X of Y), вы знаете значение X, но нет способа узнать значение Y.
Существует два варианта решения этой проблемы. Это можно найти в официальной документации, если вы посмотрите страницу страницы X X Y.
Один из вариантов - ввести пустой PdfTemplate
где вы обычно должны иметь значение Y. Затем вы можете реализовать onCloseDocument()
. Это событие запускается непосредственно перед закрытием документа. В этот момент значение Y известно, и вы можете нарисовать его на PdfTemplate
.
Другой вариант - создать PDF за два прохода. Сначала вы создаете его в памяти без "Страница X of Y". Затем вы используете PdfStamper
для добавления правильных значений X X Y (потому что вы знаете общее количество страниц с первого прохода).
PS если вам нужны образцы кода, вы можете найти # портов С примерами Java здесь.