poner el número de página al crear PDF con iTextSharp

Estoy trabajando con ASP MVC y uso iTextSharp para generar PDF en mi aplicación. Pero ahora tengo un problema: imprimo listas y cuando existe más de una página, quiero mostrar el número de página (por ejemplo: de la Page 1 to 4 ). Encontré algunos ejemplos, pero creo que es más complejo de lo que necesito hacer (como exameple ).

EDIT: encontré este ejemplo 2 . Puedo contar el número de páginas, pero no puedo imprimir el número en páginas.

Lo que hice:

 public ActionResult downloadListaISCC(DateTime? DataFimFiltro) { //Code to generate list to PDF //My document Document doc1 = new Document(); doc1.SetPageSize(iTextSharp.text.PageSize.A4); doc1.SetMargins(0f, 0f, 0f, 0f); doc1.NewPage(); MemoryStream pdfStream = new MemoryStream(); PdfWriter pdfWriter = PdfWriter.GetInstance(doc1, pdfStream); //Code to create table doc1.Add(table); //table list in document //Follow the example 2 (link) pdfWriter.CloseStream = true; doc1.Close(); //E fui seguindo o exemplo do segundo link string file = "D:/gerarPDFOleotorres/"+ nomeDoc +""; // add page numbers Document copyDoc = new Document(); PdfCopy copyPdf = new PdfCopy(copyDoc, new FileStream(file, FileMode.Create)); copyPdf.SetPageSize(PageSize.A4.Rotate()); copyDoc.Open(); // read the initial pdf document PdfReader reader = new PdfReader(pdfStream.ToArray()); int totalPages = reader.NumberOfPages; PdfImportedPage copiedPage = null; iTextSharp.text.pdf.PdfCopy.PageStamp stamper = null; for (int i = 0; i < totalPages; i++) { // get the page and create a stamper for that page copiedPage = copyPdf.GetImportedPage(reader, (i + 1)); stamper = copyPdf.CreatePageStamp(copiedPage); // add a page number to the page ColumnText.ShowTextAligned(stamper.GetUnderContent(), Element.ALIGN_CENTER, new Phrase((i + 1) + "/" + totalPages, fontetexto), 820f, 15, 0); stamper.AlterContents(); // add the altered page to the new document copyPdf.AddPage(copiedPage); } copyDoc.Close(); reader.Close(); // flush and clear the document from memory pdfStream.Flush(); pdfStream.Close(); } 

Básicamente, tiene dos opciones: o bien crea el documento de una vez, o crea el documento en dos pasos.

Si crea el documento de una sola vez, no conoce el valor de Y (el número total de páginas) por adelantado, por lo que debe crear un objeto PdfTemplate como PdfTemplate posición. Esto se demuestra en el ejemplo de MovieCountries1 .

En este ejemplo, creamos una clase TableHeader que amplía PdfPageEventHelper . Creamos una instancia de la clase PdfTemplate para el total en el método OnOpenDocument() , utilizamos este marcador de posición total en el método OnEndPage() donde agregamos el encabezado o pie de página, y completamos el número total de páginas en OnCloseDocument() método.

La desventaja de este enfoque es que es algo difícil predecir las dimensiones necesarias para el total . La ventaja es que puede crear el documento de una vez (no es necesario crear primero el documento en la memoria).

Si crea el documento en dos pasos , primero crea el documento sin encabezado / pie de página, y luego examina el documento para averiguar cuántas páginas contiene. Luego usa PdfStamper para agregar los números de página a cada página. Esto se muestra en el ejemplo TwoPasses .

Estos ejemplos están tomados de mi libro “iText in Action – Second Edition”. Puede descargar el capítulo 6 de forma gratuita desde esta URL: http://manning.com/lowagie2/samplechapter6.pdf

Consulte la [ documentación oficial ] [4] cuando tenga dudas sobre la funcionalidad específica.

Actualización: no entiendo por qué prefiere mirar ejemplos no oficiales. El ejemplo que te di se ve así:

 using (PdfStamper stamper = new PdfStamper(reader, ms2)) { // Loop over the pages and add a header to each page int n = reader.NumberOfPages; for (int i = 1; i <= n; i++) { // Add content } } 

Sin embargo, por alguna razón, buscó en Google un ejemplo que es mucho más complejo (y excesivo para lo que necesita).

Simplemente reemplace // Add content parte de // Add content con:

 ColumnText.ShowTextAligned(stamper.GetUnderContent(), Element.ALIGN_CENTER, new Phrase((i + 1) + "/" + totalPages, fontetexto), 297f, 15f, 0); 

Tenga en cuenta que he adaptado el valor x en el método ShowTextAligned() . Está creando una página con tamaño A4, lo que significa que su página tiene 595 unidades de usuario de ancho. Si agrega números de página en la posición x = 820, se agregará el pie de página, pero estará fuera del área visible de la página. No copie / pegue código sin conocer los parámetros de cada método.

Para los registros, lo usé de esta manera

 byte[] bytes = memoryStream.ToArray(); //Save pdf in the temporary location. System.IO.File.WriteAllBytes(Server.MapPath("~/TempReports/") + lbReports.Text + "_JEA.pdf", bytes); /*This is a page counter - it stamps the number of pages in the document. It will read dynamically the 'document' that was just closed above [document.Close();] from the location, then in memory will write the new content plus the one from [byte[] bytes = memoryStream.ToArray();] Solution has been applied from: https://www.aspsnippets.com/Articles/iTextSharp-Add-Page-numbers-to-existing-PDF-using-C-and-VBNet.aspx */ try { File.ReadAllBytes(Server.MapPath("~/TempReports/") + lbReports.Text + "_JEA.pdf"); iTextSharp.text.Font blackFont = FontFactory.GetFont("Arial", 7, iTextSharp.text.Font.BOLD, BaseColor.BLACK); using (MemoryStream stream = new MemoryStream()) { PdfReader reader = new PdfReader(bytes); using (PdfStamper stamper = new PdfStamper(reader, stream)) { int pages = reader.NumberOfPages; for (int i = 1; i <= pages; i++) { ColumnText.ShowTextAligned(stamper.GetUnderContent(i), @Element.ALIGN_LEFT, new Phrase(lbReports.Text + " - HD - JEA", blackFont), 63f, 24f, 0); ColumnText.ShowTextAligned(stamper.GetUnderContent(i), @Element.ALIGN_CENTER, new Phrase("Page " + i.ToString() + " of " + pages, blackFont), 300f, 24f, 0); ColumnText.ShowTextAligned(stamper.GetUnderContent(i), @Element.ALIGN_RIGHT, new Phrase("" + DateTime.Now, blackFont), 549f, 24f, 0); } txConnection.Text = "This report contains " + pages + " page(s)"; } bytes = stream.ToArray(); }//End of page counter /*System.IO.File.WriteAllBytes will write all bytes to file again*/ System.IO.File.WriteAllBytes(Server.MapPath("~/TempReports/") + lbReports.Text + "_JEA.pdf", bytes); // Temporary path that is used to display the pdf in the embed. System.IO.File.WriteAllBytes(Server.MapPath("~/TempReports/ReportsEmbed/") + lbReports.Text + "_JEA.pdf", bytes); /*this is what sends the PDF to the embed viewer object The ltEmbed is what receives the plugin to dispplay the file*/ string embed = ""; embed += "If you are unable to view file, you can download it from here"; embed += " or download Adobe PDF Reader to view it."; embed += ""; ltEmbed.Text = string.Format(embed, ("http://localhost:65423/TempReports/ReportsEmbed/") + lbReports.Text + "_JEA.pdf"); memoryStream.Close(); this.Context.ApplicationInstance.CompleteRequest(); } catch (DocumentException exe) { txConnection.Text = "There has been an error generating the file. Please try again. Error: " + exe; } 

Contador de número de página iTextSharp