Как добавить номер страницы в нижний колонтитул в PDF от Itextsharp
Я использую iTextSharp DLL в коде ASP.NET. Я собираю данные в набор данных и добавляю набор данных в таблицу PDF.
Если в моем наборе данных больше 100 строк, в таблицу PDF будет добавлено 100 строк, а в файле PDF будет создана 3 или 4 страницы.
Как добавить нижний колонтитул на каждую страницу?
Ответы
Ответ 1
Вам нужно наследовать класс PdfPageEventHelper и переопределить методы, показанные в фрагменте кода ниже:
Document doc = new Document(PageSize.A4.Rotate());
using (MemoryStream ms = new MemoryStream())
{
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
PageEventHelper pageEventHelper = new PageEventHelper();
writer.PageEvent = pageEventHelper;
}
public class PageEventHelper : PdfPageEventHelper
{
PdfContentByte cb;
PdfTemplate template;
public override void OnOpenDocument(PdfWriter writer, Document document)
{
cb = writer.DirectContent;
template = cb.CreateTemplate(50, 50);
}
public override void OnEndPage(PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
int pageN = writer.PageNumber;
String text = "Page " + pageN.ToString() + " of ";
float len = this.RunDateFont.BaseFont.GetWidthPoint(text, this.RunDateFont.Size);
iTextSharp.text.Rectangle pageSize = document.PageSize;
cb.SetRGBColorFill(100, 100, 100);
cb.BeginText();
cb.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
cb.SetTextMatrix(document.LeftMargin, pageSize.GetBottom(document.BottomMargin));
cb.ShowText(text);
cb.EndText();
cb.AddTemplate(template, document.LeftMargin + len, pageSize.GetBottom(document.BottomMargin));
}
public override void OnCloseDocument(PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
template.BeginText();
template.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
template.SetTextMatrix(0, 0);
template.ShowText("" + (writer.PageNumber - 1));
template.EndText();
}
}
Ответ 2
Вы должны унаследовать pageeventhepler, чтобы добавить номер страницы в динамически создаваемые PDF-страницы.
public void printPdf()
{
Document doc = new Document(PageSize.A4.Rotate());
using (MemoryStream ms = new MemoryStream())
{
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
PageEventHelper pageEventHelper = new PageEventHelper();
writer.PageEvent = pageEventHelper;
}
}
public class PageEventHelper : PdfPageEventHelper
{
PdfContentByte cb;
PdfTemplate template;
public override void OnOpenDocument(PdfWriter writer, Document document)
{
cb = writer.DirectContent;
template = cb.CreateTemplate(50, 50);
}
public override void OnEndPage(PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
int pageN = writer.PageNumber;
String text = "Page " + pageN.ToString() + " of ";
float len = this.RunDateFont.BaseFont.GetWidthPoint(text, this.RunDateFont.Size);
iTextSharp.text.Rectangle pageSize = document.PageSize;
cb.SetRGBColorFill(100, 100, 100);
cb.BeginText();
cb.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
cb.SetTextMatrix(document.LeftMargin, pageSize.GetBottom(document.BottomMargin));
cb.ShowText(text);
cb.EndText();
cb.AddTemplate(template, document.LeftMargin + len, pageSize.GetBottom(document.BottomMargin));
}
public override void OnCloseDocument(PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
template.BeginText();
template.SetFontAndSize(this.RunDateFont.BaseFont, this.RunDateFont.Size);
template.SetTextMatrix(0, 0);
template.ShowText("" + (writer.PageNumber - 1));
template.EndText();
}
}
Ответ 3
Вот другой подход: создайте шаблоны на каждой странице, а затем при обновлении onCloseDocument эти шаблоны рассмотрите приведенный ниже код. Я использую iTextSharp 7
class PDFBackgroundHelper : PdfPageEventHelper
{
private PdfContentByte cb;
private List<PdfTemplate> templates;
//constructor
public PDFBackgroundHelper()
{
this.templates = new List<PdfTemplate>();
}
public override void OnEndPage(PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
cb = writer.DirectContentUnder;
PdfTemplate templateM = cb.CreateTemplate(50, 50);
templates.Add(templateM);
int pageN = writer.CurrentPageNumber;
String pageText = "Page " + pageN.ToString() +" of ";
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
float len = bf.GetWidthPoint(pageText, 10);
cb.BeginText();
cb.SetFontAndSize(bf, 10);
cb.SetTextMatrix(document.LeftMargin, document.PageSize.GetBottom(document.BottomMargin));
cb.ShowText(pageText);
cb.EndText();
cb.AddTemplate(templateM, document.LeftMargin + len, document.PageSize.GetBottom(document.BottomMargin));
}
public override void OnCloseDocument(PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
foreach (PdfTemplate item in templates)
{
item.BeginText();
item.SetFontAndSize(bf, 10);
item.SetTextMatrix(0, 0);
item.ShowText("" + (writer.PageNumber));
item.EndText();
}
}
Ответ 4
Если вам просто нужен простой номер страницы, то это сделает работу:
public class PageHeaderFooter : PdfPageEventHelper
{
private readonly Font _pageNumberFont = new Font(Font.HELVETICA, 8f, Font.NORMAL, Color.BLACK);
public override void OnEndPage(PdfWriter writer, Document document)
{
AddPageNumber(writer, document);
}
private void AddPageNumber(PdfWriter writer, Document document)
{
var text = writer.PageNumber.ToString();
var numberTable = new PdfPTable(1);
var numberCell = new BorderlessPdfPCell(new Phrase(text, _pageNumberFont)) {HorizontalAlignment = Element.ALIGN_RIGHT};
numberTable.AddCell(numberCell);
numberTable.TotalWidth = 50;
numberTable.WriteSelectedRows(0, -1, document.Right - 80, document.Bottom + 20, writer.DirectContent);
}
}
И вы используете это так:
var stream = new MemoryStream();
var document = new Document(PageSize.A4, 20, 20, 30, 30);
var pdfWriter = PdfWriter.GetInstance(document, stream);
pdfWriter.PageEvent = new PageHeaderFooter();
// rest of PDF generation