jueves, 6 de marzo de 2014

Posted by Unknown On 9:17
Estoy utilizando un componente denominado itextsharp de uso libre para la elaboración de archivos PDF desde un entono NET.

Si deseas conocer sobre este componente, su instalación y descarga te recomiendo que utilices la siguiente liga:  introducción a itextsharp

Para quienes aún no tienen el gusto les presento iTextSharp, una biblioteca original de Javaportada a .Net. 
¿Su función? Arrimarle el paraíso a aquellos que buscan generar archivos con formato Adobe PDF desde la plataforma .Net. No menos importante destacar que se trata de un proyecto de código abierto totalmente libre. Existen infinidad de bibliotecas similares pagas pero como practicamente siempre tenemos nuestra alternativa gratuita ;). 

Si ya conoces dicho componente y tienes dudas de como elaborar una tabla, colocar encabezados y pies de página, te comparto el siguiente código.


Sub PrintCatalogWareHouse() Dim oDoc As New iTextSharp.text.Document(iTextSharp.text.PageSize.LETTER) Dim pdfw As iTextSharp.text.pdf.PdfWriter Dim pdfGrid As New iTextSharp.text.pdf.PdfPTable(7) Dim fBodyFont As iTextSharp.text.Font = FontFactory.GetFont(FontFactory.COURIER, 7, iTextSharp.text.Font.NORMAL) Dim fHeaderFont As iTextSharp.text.Font = FontFactory.GetFont("Arial", 8, iTextSharp.text.BaseColor.WHITE) Dim CCon As New ClassConection Dim sFileName As String = "sinafi_ctlg.pdf" Try '----------------------------------------------------------------------------------------- ' PROPIEDADES DEL DOCUMENTO '----------------------------------------------------------------------------------------- pdfw = PdfWriter.GetInstance(oDoc, New FileStream(sFileName, FileMode.Create, FileAccess.Write, FileShare.None)) oDoc.AddTitle("XXXXX") oDoc.AddAuthor("XXXXX") oDoc.AddCreationDate() oDoc.AddSubject("XXXXXX") oDoc.SetMargins(28.5, 28.5, 70, 35) '----------------------------------------------------------------------------------------- ' ENCABEZADO DEL DOCUMENTO '----------------------------------------------------------------------------------------- Dim ev As New CClassPDFPage pdfw.PageEvent = ev '----------------------------------------------------------------------------------------- ' APERTURA DEL DOCUMENTO Y CREACION DE HOJA '----------------------------------------------------------------------------------------- oDoc.Open() '----------------------------------------------------------------------------------------- ' GENERACION DE TABLA '----------------------------------------------------------------------------------------- Dim Titulo1 As New Phrase("Folio", fHeaderFont) Dim Titulo2 As New Phrase("Partida", fHeaderFont) Dim Titulo3 As New Phrase("Descripción", fHeaderFont) Dim Titulo4 As New Phrase("Medida", fHeaderFont) Dim Titulo5 As New Phrase("Cantidad", fHeaderFont) Dim Titulo6 As New Phrase("Precio", fHeaderFont) Dim Titulo7 As New Phrase("Existencia", fHeaderFont) Dim celda As New pdf.PdfPCell Dim dsTabla As New DataSet '----------------------------------------------------------------------------------------- ' DIMENSION DE LA TABLA Y FORMATO DE LOS ENCABEZADOS '----------------------------------------------------------------------------------------- pdfGrid.WidthPercentage = 100 Dim ancho() As Single = {20, 20, 110, 20, 20, 20, 20} pdfGrid.SetWidths(ancho) celda.Colspan = 1 celda.Padding = 5 celda.BackgroundColor = iTextSharp.text.pdf.ExtendedColor.BLACK celda.HorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER celda.Phrase = Titulo1 : pdfGrid.AddCell(celda) celda.Phrase = Titulo2 : pdfGrid.AddCell(celda) celda.Phrase = Titulo3 : pdfGrid.AddCell(celda) celda.Phrase = Titulo4 : pdfGrid.AddCell(celda) celda.Phrase = Titulo5 : pdfGrid.AddCell(celda) celda.Phrase = Titulo6 : pdfGrid.AddCell(celda) celda.Phrase = Titulo7 : pdfGrid.AddCell(celda) pdfGrid.HeaderRows = 1 ' Esta instrucción define los renglones para el encabezado '----------------------------------------------------------------------------------------- ' CONSULTA SQL, FORMATO DE CELDAS Y AGREGADO DE CELDAS A LA TABLA '----------------------------------------------------------------------------------------- Dim iCol As Integer = 1 Dim sDataCell As String = "" Dim iHorizontalAlignment = 0 CCon.SelectRows(dsTabla, "SELECT * FROM tblwarehousecatalog") For Each oFila As Data.DataRow In dsTabla.Tables(0).Rows iCol = 1 For Each oColumna As Data.DataColumn In dsTabla.Tables(0).Columns sDataCell = oFila(oColumna) Select Case iCol Case 1, 2, 4, 5, 7 iHorizontalAlignment = iTextSharp.text.Element.ALIGN_CENTER Case 3 iHorizontalAlignment = iTextSharp.text.Element.ALIGN_LEFT Case 6 sDataCell = FormatNumber(sDataCell, 2) iHorizontalAlignment = iTextSharp.text.Element.ALIGN_RIGHT End Select Dim celda2 As New pdf.PdfPCell(New Phrase(sDataCell, fBodyFont)) celda2.HorizontalAlignment = iHorizontalAlignment celda2.VerticalAlignment = iTextSharp.text.Element.ALIGN_CENTER pdfGrid.AddCell(celda2) iCol += 1 Next oColumna Next oFila '----------------------------------------------------------------------------------------- ' INCORPORACION DE LA TABLA AL DOCUMENTO '----------------------------------------------------------------------------------------- oDoc.Add(pdfGrid) '----------------------------------------------------------------------------------------- ' LIBRACION DEL DOCUMENTO Y PRESENTACION '----------------------------------------------------------------------------------------- pdfw.Flush() oDoc.Close() Process.Start(sFileName) Catch ex As Exception 'Si hubo una excepcion y el archivo existe ... If File.Exists(sFileName) Then 'Cerramos el documento si esta abierto. 'Y asi desbloqueamos el archivo para su eliminacion. If oDoc.IsOpen Then oDoc.Close() '... lo eliminamos de disco. File.Delete(sFileName) End If Throw New Exception("Error al generar archivo PDF (" & ex.Message & ")") Finally pdfw = Nothing oDoc = Nothing End Try End Sub

Explicación del código:


Si sabes desarrollar aplicaciones en .Net, creo que está de más explicar cada línea, así que me enfocaré en el componente itextsharp.

  • oDOC, es nuestro objeto PDF. De tamaño carta y posición vertical.
  • pdfw, es nuestra instancia al objeto oDOC
  • pdfGrid, es nuestra tabla de datos
  • fBodyFont, es la definición de nuestra fuente para el cuerpo de la tabla
  • fHeaderFont, es la definición de nuestra fuente para el encabezado de la tabla
  • CCon, es una clase que me permite conectarme a mi base de datos (MySQL)
  • oDoc.SetMargins(28.5, 28.5, 70, 35), me permite crear el área de trabajo de nuestro documento (definición de margenes). Izquierdo, Derecho, Arriba y Abajo
Para que nuestro documento repita encabezados y pies de pagina se utiliza la siuiente definición (se explicará en otra entrada):

Dim ev As New CClassPDFPage pdfw.PageEvent = ev
Continuamos con el resto del código:

  • Imagina que utilizas un textbox, new Phrase es su equivalente. En él vas a definir las propiedades del texto.
  • pdf.PdfPCell es la propiedad de la celda, pero no puedes editar el texto que va dentro de la celda, para eso utilizas Phrase (si me equivoco, no dudes en hacer comentarios).
  • pdfGrid.HeaderRows, sirve para definir cuantos renglones se repetirán como encabezado.
  • pdfGrid.AddCell, agregamos cada celda a la tabla
  • oDoc.Add(pdfGrid), agregamos la tabla al documento

Producto terminado:





4 comentarios:

  1. hola he seguido tu ejemplo pero en la linea Dim ev As New CClassPDFPage
    no reconoce a CClassPDFPage se debe referenciar algo mas??

    ResponderEliminar
    Respuestas
    1. es una clase en el cual se agregan los metodos que llamaran al encabezado y pie de pagina el detalle es.. que no puso eso.. o debe estar por ahi

      Eliminar
  2. MUCHAS GRACIAS POR TU AYUDA ME SIRVIÓ DE MUCHO

    ResponderEliminar
  3. Muy bien hecho, sencillo y claro. bravo.

    ResponderEliminar