locked
iTextSharp PdfPtable issue RRS feed

  • Question

  • User168966904 posted

    Hello, I have created a pdfPTable(3) but if I don't fill 3 cells per line, the row is not rendered.

    For me that is the easiest way to create it because I need  a page with 3 columns of the same size.

    I put my code here.

    #region "Inicializacion e instanciación de objetos pdf que solo requieren ser instanciados una vez"

    MemoryStream m = new MemoryStream();

     

    //documento con tamaño A4 y los margenes de la plantilla original

    Document documento = new Document(PageSize.A4, 7, 6, 6, 10);

     

    //tipo de la descarga

    Response.ContentType = "application/pdf";

     

    //instanciamos el objeto escritor, que se encargara de guardarlo en su destino

    PdfWriter writer = PdfWriter.GetInstance(documento, m);

    writer.CloseStream = false;

     

    //abrimos el documento

    documento.Open();

     

    //le asignamos al documento unas propiedades

    documento.AddAuthor("Servicio de cocina");

    documento.AddCreationDate();

     

    //creamos una pdfPtable y le definimos 3 columnas

    PdfPTable tabla = new PdfPTable(3);

    tabla.

    //a la tabla le asignamos un 100% de anchura

    tabla.WidthPercentage = 100;

     

    //alineamos la tabla a la izquierda porque si

    //no la tabla solo ocuparia el 80% del ancho

    //total del documento, es decir, centrandolo.

    tabla.HorizontalAlignment = Element.ALIGN_LEFT;

     

    //debido a que varios namespaces tienen

    //el objeto Image, hay que hacer la referencia

    //completa.

    //Tambien creamos una nueva instancia de

    //imagen diciendole donde esta la imagen.

    iTextSharp.text.Image logoOsakidetza = iTextSharp.text.Image.GetInstance("C:/Inetpub/wwwroot/GestionTickets/Images/Logo_Osakidetza_peque_email.jpg");

     

    //escalamos la imagen al 30% porque si no es muy grande.

    logoOsakidetza.ScalePercent(30);

     

    //alineamos la imagen a la izquierda.

    logoOsakidetza.Alignment = iTextSharp.text.Image.ALIGN_LEFT;

     

    //esto sirve para convertir un codigo de barras en una imagen

    PdfContentByte cb = writer.DirectContent;

    #endregion

     

    for (x = 0; x < filas; x++)

    {

    #region "Inicializacion e instanciacion de objetos pdf que requieren ser instanciados e inicializados una vez por registro"

    //creamos una celda (creamos una para cada registro)

    PdfPCell celda = new PdfPCell();

     

    //creamos un codigo de barras

    Barcode39 codigoBarras = new Barcode39();

     

    //creamos una imagen en la que guardaremos el codigo de barras

    iTextSharp.text.Image barcode;

     

    //creamos trozos de texto,

    //aunque chunk tenga un nombre gracioso

    //significa "trozo", "pedazo", y ya los instanciaremos despues

    Chunk pdfTipoTicket;

    Chunk pdfSeccion;

    Chunk pdfFechaTicket;

     

    //recogemos el tipoTicket del registro

    //actual e instanciamos pdfTipoTicket.

    tipoTicket = ticketsTable.Rows[x]["tipoTicket"].ToString().ToUpper();

    pdfTipoTicket = new Chunk("VALE " + tipoTicket, FontFactory.GetFont(FontFactory.HELVETICA, 14, Font.BOLD));

     

    //recogemos la seccion del registro actual

    //e instanciamos pdfSeccion

    seccion = ticketsTable.Rows[x]["seccion"].ToString().ToUpper();

    pdfSeccion = new Chunk("SERVICIO DE " + seccion, FontFactory.GetFont(FontFactory.HELVETICA, 12, Font.ITALIC));

     

    //recogemos la fecha del registro actual y la guardamos en 2 variables una datetime y la otra string

    //e instanciamos pdfFechaTicket

    fechaTicket = Convert.ToDateTime(ticketsTable.Rows[x]["fecha"]);

    pdfFechaTicket = new Chunk("FECHA: " + fechaTicket.ToShortDateString() + "\n\n", FontFactory.GetFont(FontFactory.HELVETICA, 12));

    #endregion

     

    //asignamos las propiedades necesarias a la celda

    celda.FixedHeight = 165;

    celda.Padding = 5;

    celda.BorderWidth = 1.5f;

     

    #region "Creación del codigo unívoco para el codigo de barras"

    codSeccion = Convert.ToInt32(seccionesAdapter.ScalarQueryCodSeccion(seccion));

    dia = fechaTicket.Day;

    mes = fechaTicket.Month;

    year = fechaTicket.Year;

     

    numero = Convert.ToInt32(ticketsTable.Rows[x]["numero"]);

    codigoUnivoco = codSeccion.ToString() + dia.ToString() + mes.ToString() + year.ToString() + tipoTicket + numero;

    #endregion

     

    //propiedades del codigo de barras

    codigoBarras.CodeType = Barcode128.CODABAR;

    codigoBarras.Code = codigoUnivoco;

     

    //conversion del objeto barcode al tipo image

    barcode = codigoBarras.CreateImageWithBarcode(cb, null, null);

    Chunk xa = new Chunk(x.ToString());

    #region "inserción de los objetos en la celda y finalmente en la tabla

    celda.AddElement(logoOsakidetza);

    celda.AddElement(xa);

    celda.AddElement(pdfTipoTicket);

    celda.AddElement(pdfSeccion);

    celda.AddElement(pdfFechaTicket);

    celda.AddElement(barcode);

     

    tabla.AddCell(celda);

    #endregion

    }

    documento.Add(tabla);

     

    documento.Close();

     

    Response.AppendHeader("Content-Disposition", "attachment;filename=plantilla_" + DateTime.Now.Month.ToString() + "_" + DateTime.Now.Year + ".pdf");

    Response.OutputStream.Write(m.GetBuffer(), 0, m.GetBuffer().Length);

    Response.OutputStream.Flush();

    Response.OutputStream.Close();

    m.Close();


    if x is less than 3 in the resulting pdf is nothing rendered

    thanks in advance

    Tuesday, April 27, 2010 4:48 AM

All replies