Mostrando las entradas con la etiqueta PDF. Mostrar todas las entradas
Mostrando las entradas con la etiqueta PDF. Mostrar todas las entradas

martes, 28 de junio de 2016

Enviar el contenido de un DataGridView a un archivo .PDF

Una vez que tengamos el DataGridView con la información, creamos un botón que llama la función.
El DataGridView tendrá una columna llamada RUTA_IMAGEN que almacenara la ruta donde se encuentra la imagen a exportar, ejemplo: "c:\imagenes\articulo1.jpg"

Para el ejemplo necesitaremos la librería iTextSharp.
Puedes descargar la librería: http://sourceforge.net/projects/itextsharp/ 


Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.IO

Private Sub impresion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles impresion.Click
Try
   Dim doc As New Document(PageSize.A4.Rotate(), 10, 10, 10, 10)
   'Guarda el reporte en el escritorio de windows (Desktop).
   Dim filename As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\Reporte.pdf"
   Dim file As New FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)
  PdfWriter.GetInstance(doc, file)
  doc.Open()
  ExportarDatosPDF(doc)
  doc.Close()
 
Process.Start(filename)
Catch ex As Exception
   MessageBox.Show(ex.Message)
End Try
End Sub


Public Function GetColumnasSize(ByVal dg As DataGridView) As Single()
   Dim values As Single() = New Single(dg.ColumnCount - 1) {}
   For i As Integer = 0 To dg.ColumnCount - 1
     values(i) = CSng(dg.Columns(i).Width)
   Next
   Return values
End Function

Public Sub ExportarDatosPDF(ByVal document As Document)
   'Se crea un objeto PDFTable con el numero de columnas del DataGridView.
   Dim datatable As New PdfPTable(DataGridView2.ColumnCount)
   'Se asignan las propiedades del .PDF
   datatable.DefaultCell.Padding = 3
   Dim headerwidths As Single() = GetColumnasSize  (DataGridView2)
   datatable.SetWidths(headerwidths)
   datatable.WidthPercentage = 100
   datatable.DefaultCell.BorderWidth = 2
datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_LEFT
   'Se crea el encabezado en el PDF.
   Dim encabezado As New Paragraph("REPORTE", New Font(Font.Name = "Tahoma", 20, Font.Bold))
   Dim texto1 As New Paragraph("Nombre: " + Me.TextBox_nombre.Text, New Font(Font.Name = "Tahoma", 14, Font.Bold))
   Dim texto2 As New Paragraph("Fecha: " + Me.DateTimePicker_fecha.Text, New Font(Font.Name = "Tahoma", 14, Font.Bold))
   'Se capturan los nombres de las columnas del DataGridView.
   For i As Integer = 0 To DataGridView2.ColumnCount - 1
     datatable.AddCell(DataGridView2.Columns(i).HeaderText)
 
 
   Next
   datatable.HeaderRows = 1
   datatable.DefaultCell.BorderWidth = 1
 
'Se generan las columnas del DataGridView.
   For i As Integer = 0 To DataGridView2.RowCount - 2
       For j As Integer = 0 To DataGridView2.ColumnCount - 1
          If (j = 3) Then 'ubica la imagen en la columna 3 de datagridview
             'capturo la ruta de la imagen
             Dim RutaImage As String
             RutaImage = DataGridView2("ruta_imagen", i).Value
             'Procedo a convertir la imagen de tipo itextsharp.text.image
             Dim Img As Image = Image.GetInstance(RutaImage)
             'agrego la imagen a la celda
             datatable.AddCell(Img)  
           Else
             datatable.AddCell(DataGridView2(j, i).Value.ToString())  
           End If
       Next
       datatable.CompleteRow()  
    Next
    'Se agrega el PDFTable al documento.
    document.Add(encabezado)
    document.Add(texto1)
    document.Add(texto2)
    document.Add(datatable)
 
 
End Sub

Enviar el contenido de una DataGridView a un archivo .PDF

Una vez que tengamos el DataGridView con la información, creamos un botón que llama la función.
Para el ejemplo necesitaremos la librería iTextSharp.


Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.IO

Private Sub impresion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles impresion.Click
Try
   Dim doc As New Document(PageSize.A4.Rotate(), 10, 10, 10, 10)
   'Guarda el reporte en el escritorio de windows (Desktop).
   Dim filename As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\Reporte.pdf"
   Dim file As New FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)
  PdfWriter.GetInstance(doc, file)
  doc.Open()
  ExportarDatosPDF(doc)
  doc.Close()
 
Process.Start(filename)
Catch ex As Exception
   MessageBox.Show(ex.Message)
End Try
End Sub


Public Function GetColumnasSize(ByVal dg As DataGridView) As Single()
   Dim values As Single() = New Single(dg.ColumnCount - 1) {}
   For i As Integer = 0 To dg.ColumnCount - 1
     values(i) = CSng(dg.Columns(i).Width)
   Next
   Return values
End Function

Public Sub ExportarDatosPDF(ByVal document As Document)
   'Se crea un objeto PDFTable con el numero de columnas del DataGridView.
   Dim datatable As New PdfPTable(DataGridView2.ColumnCount)
   'Se asignan las propiedades del .PDF
   datatable.DefaultCell.Padding = 3Dim headerwidths As Single() = GetColumnasSize  (DataGridView2)
   datatable.SetWidths(headerwidths)
   datatable.WidthPercentage = 100
   datatable.DefaultCell.BorderWidth = 2
datatable.DefaultCell.HorizontalAlignment = Element.ALIGN_LEFT
   'Se crea el encabezado en el PDF.
   Dim encabezado As New Paragraph("REPORTE", New Font(Font.Name = "Tahoma", 20, Font.Bold))
   Dim texto1 As New Paragraph("Nombre: " + Me.TextBox_nombre.Text, New Font(Font.Name = "Tahoma", 14, Font.Bold))
   Dim texto2 As New Paragraph("Fecha: " + Me.DateTimePicker_fecha.Text, New Font(Font.Name = "Tahoma", 14, Font.Bold))
   'Se capturan los nombres de las columnas del DataGridView.
   For i As Integer = 0 To DataGridView2.ColumnCount - 1
     datatable.AddCell(DataGridView2.Columns(i).HeaderText)
 
 
   Next
     datatable.HeaderRows = 1
     datatable.DefaultCell.BorderWidth = 1
 
'Se generan las columnas del DataGridView.
     For i As Integer = 0 To DataGridView2.RowCount - 2
       For j As Integer = 0 To DataGridView2.ColumnCount - 1
          If (j = 3) Then 'ubica la imagen en la columna 3 de datagridview
             'capturo la ruta de la imagen
             Dim RutaImage As String
             RutaImage = DataGridView2("ruta_imagen", i).Value
             'Procedo a convertir la imagen de tipo itextsharp.text.image
             Dim Img As Image = Image.GetInstance(RutaImage)
             'agrego la imagen a la celda
             datatable.AddCell(Img)  
           Else
             datatable.AddCell(DataGridView2(j, i).Value.ToString())  
           End If
       Next
       datatable.CompleteRow()  
    Next
       'Se agrega el PDFTable al documento.
       document.Add(encabezado)
       document.Add(texto1)
       document.Add(texto2)
       document.Add(datatable)
 
 
   End Sub

Comparte