2012-03-23 11 views
12

He intentado 3 formas diferentes de mostrar los números de página, el contenido OnCloseDocument no se muestra en la página, ninguno de ellos funcionó.Página X de la edición Y

mi intención es mostrar Los números de página como esto

1 de 10
2 0f 10
..............
..... .......
10 de 10 en cada página

sé cómo mostrar

....

pero `t saben cómo mostrar el número total de páginas

` m usando OnCloseDocument para mostrar No. de páginas contadas, pero el contenido en él no está mostrando .

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 
    } 

WAY 1ST:

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); 
    }  

WAY 2ª:

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

3ª WAY:

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(); 
    } 

¿Estoy haciendo algo mal?

Respuesta

16

Su segunda forma es probablemente la forma más sencilla. A continuación se muestra un muy, muy adelgazado pero trabajando versión:

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); 
    } 
} 

Y utilizarlo:

//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

Lo siento, pensé que estaban teniendo problemas con el configuración básica de los eventos, mi error.

Solo he visto dos formas de hacer lo que está intentando hacer, ya sea que haga dos pasadas o use el PdfTemplate syntax which renders an image as far as I know.

Recomiendo solo ejecutar dos pases, el primero solo para crear su PDF y el segundo para agregar sus números de página. Puede ejecutar su primer pase a MemoryStream para no tener que golpear dos veces el disco si lo desea.

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); 
     } 
    } 
} 
+0

Una buena solución, aunque me gustaría poder descubrir por qué el método de plantillas no funciona, ya que puedo ver que es más poderoso. –

+0

¿Por qué el segundo archivo y cómo lo creas? – spadelives

+0

Eso funciona bien. Mi único problema es que tengo algunas páginas en mi documento que son retratos y otras que son de paisaje. ¿Hay alguna manera fácil de saber cuál es cuál y ajustar la coordenada x para la 'página x de y' en consecuencia? –

3

Aquí es código de ejemplo para la explicación "Chris Haas" (el método de dos pasos con salida archivo en el disco duro de escritura)

El "copiar y pegar el código" usando MemoryStream de la página x de salida 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(); 
    } 
} 
Cuestiones relacionadas