PuntoBit

Diciembre 16, 2007

iTextSharp – Escribir texto en columna.

Archivado en: Desarrollo, VB.Net — Etiquetas:, , , , , , — A l e x a n d e r @ 3:26 am

Como segunda entrega en relación a iTextSharp hoy veremos como insertar texto encolumnado.

A continuación detallaré como podemos escribir texto dentro de un rectángulo definido en nuestra página.
Este texto será recortado apropiadamente por la biblioteca completando el rectángulo especificado.
Basicamente debemos llamar a 2 métodos del objeto ColumnText:

  • En primer lugar debemos llamar a SetSimpleColumn donde definiremos el rectángulo de la columna.
  • Luego, para escribir el texto llamamos a Go().

Alguien se preguntará a si mismo … ¿Porqué debo llamar a dos métodos distintos?
La respuesta a ambas preguntas se responden con lo siguiente.

Razón 1:

Go() nos devuelve un Integer que deberemos tener en cuenta. Si nos devuelve ColumnText.NO_MORE_COLUMN significa que el texto no cupo dentro del rectángulo donde escribimos. En cambio si devuelve ColumnText.NO_MORE_TEXT significa que hemos escrito todo el texto que asignamos al  objeto ColumnText.

Razón 2:
Go() tiene una sobrecarga con un Boolean como parámetro que indica si deseamos simular la escritura. Es decir, nos devolverá un valor (lo explicado en la razón 1)  pero sin escribir el texto. Útil, por ejemplo, para darnos cuenta si debemos crear una nueva página en caso que queramos escribir un texto sin interrupciones.

De ahí que la definición del área y la escritura del texto se encuentren en métodos separados.

Un código simple de ejemplo como en el post anterior:

    Private Structure stColumna
        Dim MargenDerecho As Single
        Dim MargenIzquierdo As Single
    End Structure
    Private Sub GenerarPDF_Columnas()
        Dim oDoc As New iTextSharp.text.Document(PageSize.A4, 0, 0, 0, 0)
        Dim pdfw As iTextSharp.text.pdf.PdfWriter
        Dim cb As PdfContentByte
        Dim sNombreArchivo As String = "C:\PdfColumnas.pdf"
        Dim ct As ColumnText
        Dim arrColumnas(1) As stColumna
        Dim iEstado As Integer = 0, iColumna As Integer = 0

        Const INTERLINEADO As Single = 20
        Const MARGEN_INFERIOR As Single = 80

        Try

            pdfw = PdfWriter.GetInstance(oDoc, New FileStream(sNombreArchivo, _
                   FileMode.Create, FileAccess.Write, FileShare.None))

            oDoc.Open()
            oDoc.NewPage()

            cb = pdfw.DirectContent
            ct = New ColumnText(cb)

            arrColumnas(0).MargenIzquierdo = 60
            arrColumnas(0).MargenDerecho = 280
            arrColumnas(1).MargenIzquierdo = 320
            arrColumnas(1).MargenDerecho = 530

            'Asignamos texto, texto y mas texto ...
            ct.AddText(New Phrase("PDF (del inglés Portable Document Format, Formato de Documento Portátil) es un formato de almacenamiento de documentos, desarrollado por la empresa Adobe Systems. Está especialmente ideado para documentos susceptibles de ser impresos, ya que especifica toda la información necesaria para la presentación final del documento, determinando todos los detalles de cómo va a quedar, no requiriéndose procesos anteriores de ajuste ni de maquetación.", FontFactory.GetFont(FontFactory.HELVETICA, 12)))
            ct.AddText(New Phrase("Cada vez se utiliza más también como especificación de visualización, gracias a la gran calidad de las fuentes utilizadas y a las facilidades que ofrece para el manejo del documento, como búsquedas, hiperenlaces, etc.Recientemente pasó a ser un estándar ISO 32000.", FontFactory.GetFont(FontFactory.HELVETICA, 12)))
            ct.AddText(New Phrase("Las versiones tempranas de los documentos PDF no tenían hipervínculos externos; por esta razón, su adopción en internet era considerablemente reducida y no tenía mucha popularidad. En esos tiempos, eran comunes las conexiones a internet a través de módem telefónico, y el tamaño de los documentos PDF era mucho más grande que otros tipos de documentos, como el texto plano (sin formato), por ejemplo; por lo tanto, la banda ancha fue un factor clave para su aceptación en internet.", FontFactory.GetFont(FontFactory.HELVETICA, 12)))
            ct.AddText(New Phrase("Además, ya existían otros tipos de documentos que le hacían fuerte competencia al tipo de documentos PDF, como por ejemplo, los documentos 'PostScript' (.ps), los cuales, en esos tiempos, eran considerablemente comunes.", FontFactory.GetFont(FontFactory.HELVETICA, 12)))
            ct.AddText(New Phrase("Con el tiempo, los documentos PDF fueron adquiriendo popularidad de varias formas diferentes, como publicidad. Este tipo de documentos empezó a popularizarse considerablemente, hasta convertirse en un estándar.[sin referencias] Este tipo de documento es vista como una página digital que está lista para imprimirse exactamente como su muestra en la pantalla, sin problemas de márgenes a la hora de imprimir, tal como sucede en otros documentos digitales.", FontFactory.GetFont(FontFactory.HELVETICA, 12)))
            ct.AddText(New Phrase("En los recientes años de su popularidad, han salido varias aplicaciones lectoras de este tipo de archivos. Su popularidad ha abierto la posibilidad de crear documentos PDF con programas de software libre, como lo hace en la actualidad OpenOffice.org. Otras aplicaciones, son incluso capaces de editarlos, sin necesidad de usar la típica aplicación para crear y editar documentos PDF de Adobe.", FontFactory.GetFont(FontFactory.HELVETICA, 12)))
            ct.AddText(New Phrase("El formato de archivos PDF ha cambiado varias veces, pues las nuevas versiones del Acrobat de adobe se han lanzado. Ha habido ocho versiones de PDF: 1.0 (1993), 1.1 (1994), 1.2 (1996), 1.3 (1999), 1.4 (2001), 1.5 (2003), 1.6 (2005), y 1.7 (2006), correspondiendo al Acrobat lanza 1.0 a 8.0.", FontFactory.GetFont(FontFactory.HELVETICA, 12)))
            ct.AddText(New Phrase("Es multiplataforma, es decir, puede ser presentado por los principales sistemas operativos (Windows, Unix/Linux o Mac), sin que se modifiquen ni el aspecto ni la estructura del documento original", FontFactory.GetFont(FontFactory.HELVETICA, 12)))
            ct.AddText(New Phrase("Puede integrar cualquier combinación de texto, gráficos, imágenes e incluso música. Es uno de los formatos más extendidos en Internet para el intercambio de documentos. Por ello es muy utilizado por empresas, gobiernos e instituciones educativas. ", FontFactory.GetFont(FontFactory.HELVETICA, 12)))
            ct.AddText(New Phrase("Es una especificación abierta, para la que se han generado herramientas de Software Libre que permiten crear, visualizar o modificar documentos en formato PDF. Un ejemplo es la suite ofimática OpenOffice.org. ", FontFactory.GetFont(FontFactory.HELVETICA, 12)))
            ct.AddText(New Phrase("Puede cifrarse para proteger su contenido e incluso firmarlo digitalmente. El archivo PDF puede crearse desde varias aplicaciones exportando el archivo, como es el caso de los programas de OpenOffice.org.", FontFactory.GetFont(FontFactory.HELVETICA, 12)))

            'Mientras haya texto
            While (iEstado <> ColumnText.NO_MORE_TEXT)

                'Seteamos el rectángulo donde escribir ...
                ct.SetSimpleColumn(arrColumnas(iColumna).MargenDerecho, MARGEN_INFERIOR, _
                                   arrColumnas(iColumna).MargenIzquierdo, _
                                   oDoc.PageSize.Height, INTERLINEADO, Element.ALIGN_JUSTIFIED)

                ' ... y escribimos
                iEstado = ct.Go()

                'Si la columna no fue suficiente:
                If (iEstado = ColumnText.NO_MORE_COLUMN) Then
                    iColumna = iColumna + 1

                    'Si se alcanzó la cantidad de columnas por página
                    If iColumna > (arrColumnas.Length - 1) Then
                        'Salto de pagina
                        oDoc.NewPage()
                        iColumna = 0
                    End If

                End If
            End While

            oDoc.Close()

        Catch ex As Exception
            'Si hubo un error y el archivo existe ...
            If File.Exists(sNombreArchivo) Then
                'Chequeo si el Doc esta abierto y asi poder
                'desbloquear el archivo para su eliminacion.
                If oDoc.IsOpen Then oDoc.Close()

                '... lo elimino del disco.
                File.Delete(sNombreArchivo)
            End If

            Throw New Exception("Error al generar archivo PDF (" & ex.Message & ")")
        Finally
            'Limpieza
            cb = Nothing
            pdfw = Nothing
            oDoc = Nothing
        End Try

    End Sub

También es posible definir el área donde escribir el texto como una forma irregular. Por ejemplo podríamos pedir que escriba el párrafo dentro de un área triangular. Dejo eso para un próximo post.

3 comentarios »

  1. Saludos; Estoy comenzado a utilizar esta libreria y queria saber si es posible extraer datos desde una tabla en una base de datos y crear un documento pdf. Gracias Anticipadas

    comentario por orlando — Agosto 11, 2008 @ 5:23 pm

  2. Yo tambien quiero crear un documento pdf que contenga los resultados de consultas select, espero me puedas ayudar.

    saludos!

    comentario por Daniel — Agosto 11, 2008 @ 6:32 pm

  3. Hola…

    yo estoy mas avanzado de como utilizar esto.

    con Select.. Procedures, etc.

    pero lo que no he logrado, como hacer que el interlineado sea menor, es decir, que las tablas creadas, sean de menor tamaño.

    si saben como.. favor de escribirme.

    freddy.barrera.a@gmail.com

    comentario por Freddy — Agosto 28, 2009 @ 4:37 pm


Canal RSS de los comentarios de la entrada. URI para TrackBack.

Deja un comentario

Blog de WordPress.com.