Página X da questão Y

Eu tentei 3 maneiras diferentes de exibir números de página, conteúdo OnCloseDocument não está exibindo na página, nenhum deles funcionou.

Minha intenção está exibindo números de página como este

1 de 10
2 0f 10
…………..
…………
10 de 10 em cada página

Eu sei como exibir

1
2
3
4
….
10

mas não sabe como exibir o número total de páginas

Eu estou usando OnCloseDocument para exibir o número de páginas, mas o conteúdo não está sendo exibido.

 public class MyPdfPageEventHelpPageNo : iTextSharp.text.pdf.PdfPageEventHelper { protected PdfTemplate total; protected BaseFont helv; private bool settingFont = false; public override void OnOpenDocument(PdfWriter writer, Document document) { template= writer.DirectContent.CreateTemplate(100, 100); bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED); } public override void OnCloseDocument(PdfWriter writer, Document document) { //See below } 

1ª MANEIRA:

  public override void OnCloseDocument(PdfWriter writer, Document document) { //I create a table with one column like below. PdfPTable pageNumber2 = new PdfPTable(1); pageNumber2.TotalWidth = 50; pageNumber2.HorizontalAlignment = Element.ALIGN_RIGHT; pageNumber2.AddCell(BuildTable2RightCells("Page " + writer.PageNumber)); pageNumber.AddCell(BuildTable2LeftCells(writer.PageCount)); pageNumber2.WriteSelectedRows(0, -1, 500, (document.PageSize.GetBottom(140)), cb); } 

2ª MANEIRA:

  public override void OnCloseDocument(PdfWriter writer, Document document) { ColumnText.ShowTextAligned(template,Element.ALIGN_CENTER,new Phrase(writer.PageNumber.ToString()), 500, 140, 0); } 

3ª MANEIRA:

  public override void OnCloseDocument(PdfWriter writer, Document document) { template.BeginText(); template.SetFontAndSize(bf, 8); template.SetTextMatrix(500, 140); template.ShowText(Convert.ToString((writer.PageNumber - 1))); template.EndText(); } 

Estou fazendo algo errado?

Seu segundo caminho é provavelmente o caminho mais simples. Abaixo está uma versão muito reduzida, mas funcional:

 public class MyPdfPageEventHelpPageNo : iTextSharp.text.pdf.PdfPageEventHelper { public override void OnEndPage(PdfWriter writer, Document document) { ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_CENTER, new Phrase(writer.PageNumber.ToString()), 500, 140, 0); } } 

E para usá-lo:

 //Create a file on our desktop string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "OnCloseTest.pdf"); //Standard PDF creation, adjust as needed using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) { using (Document doc = new Document(PageSize.LETTER)) { using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) { //Find our custom event handler writer.PageEvent = new MyPdfPageEventHelpPageNo(); doc.Open(); //Add text the first page doc.Add(new Paragraph("Test")); //Add a new page with more text doc.NewPage(); doc.Add(new Paragraph("Another Test")); doc.Close(); } } } 

EDITAR

Desculpe, eu pensei que você estava tendo problemas com a configuração básica de events, meu erro.

Eu só vi duas maneiras de fazer o que você está tentando fazer, ou fazer duas passagens ou usar a syntax PdfTemplate que processa uma imagem, tanto quanto eu sei .

Eu recomendaria apenas executar dois passos, o primeiro apenas para criar seu PDF e o segundo para adicionar seus números de página. Você pode executar sua primeira passagem para um MemoryStream para não precisar acertar o disco duas vezes, se quiser.

 PdfReader reader = new PdfReader(outputFile); using (FileStream fs = new FileStream(secondFile, FileMode.Create, FileAccess.Write, FileShare.None)) { using (PdfStamper stamper = new PdfStamper(reader, fs)) { int PageCount = reader.NumberOfPages; for (int i = 1; i <= PageCount; i++) { ColumnText.ShowTextAligned(stamper.GetOverContent(i), Element.ALIGN_CENTER, new Phrase(String.Format("Page {0} of {1}", i, PageCount)), 500, 140, 0); } } } 

Aqui está o código de exemplo para a explicação “Chris Haas” (o método de duas passagens sem escrever o arquivo no disco rígido)

O “copiar e colar código” usando o memorystream para a página x da saída y

 protected void Button2_Click(object sender, EventArgs e) { byte[] b = CreatePDF2(); string ss = HttpContext.Current.Request.PhysicalApplicationPath; string filenamefirst = ss + DateTime.Now.ToString("ddMMyyHHmmss"); string filenamefirstpdf = filenamefirst + ".pdf"; using (PdfReader reader = new PdfReader(b)) { using (FileStream fs = new FileStream(filenamefirstpdf, FileMode.Create, FileAccess.Write, FileShare.None)) { using (PdfStamper stamper = new PdfStamper(reader, fs)) { int PageCount = reader.NumberOfPages; BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED); for (int i = 1; i <= PageCount; i++) { string sss = String.Format("Page {0} of {1}", i, PageCount); PdfContentByte over= stamper.GetOverContent(i); over.BeginText(); over.SetTextMatrix(500, 750); over.SetFontAndSize(bf, 8); over.ShowText(sss); over.EndText(); } } } } } private byte[] CreatePDF2() { Document doc = new Document(PageSize.LETTER, 50, 50, 50, 50); using (MemoryStream output = new MemoryStream()) { PdfWriter wri = PdfWriter.GetInstance(doc, output); doc.Open(); Paragraph header = new Paragraph("My Document") { Alignment = Element.ALIGN_CENTER }; Paragraph paragraph = new Paragraph("Testing the iText pdf."); Phrase phrase = new Phrase("This is a phrase but testing some formatting also. \nNew line here."); Chunk chunk = new Chunk("This is a chunk."); PdfPTable tab = new PdfPTable(3); PdfPCell cell = new PdfPCell(new Phrase("Header", new Font(Font.FontFamily.HELVETICA, 24F))); cell.Colspan = 3; cell.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right //Style cell.BorderColor = new BaseColor(System.Drawing.Color.Red); cell.Border = Rectangle.BOTTOM_BORDER; // | Rectangle.TOP_BORDER; cell.BorderWidthBottom = 3f; tab.AddCell(cell); //row 1 for (int i = 1; i < 120; i++) { //row 1 tab.AddCell("R1C1"); tab.AddCell("R1C2"); tab.AddCell("R1C3"); //row 2 tab.AddCell("R2C1"); tab.AddCell("R2C2"); tab.AddCell("R2C3"); } doc.Add(header); doc.Add(paragraph); doc.Add(phrase); doc.Add(chunk); doc.Add(tab); doc.Close(); return output.ToArray(); } }