none
Crear un pdf a partir de un fichero de texto

    Question

  • Hola!

    Estoy intentando crear una aplicacion que me permita crear un pdf a partir de un fichero de texto.

    Bien, el código que tengo y con el que estoy haciendo pruebas me permite crear un fichero pdf a partir de un texto que yo que le indico. Para empezar está fenomenal, pero necesito partir de un fichero de texto, que puede contener tablas, o imágenes...

     

    Imports System.IO

    Imports iTextSharp.text

    Imports iTextSharp.text.pdf

     

    Public Class Form1

     

    Dim oDoc As New iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 0, 0, 0, 0)

    Dim pdfw As iTextSharp.text.pdf.PdfWriter

    Dim cb As iTextSharp.text.pdf.PdfContentByte

    Dim fuente As iTextSharp.text.pdf.BaseFont

    Dim NombreArchivo As String = "C:\ejemplo.pdf"

    Try

    pdfw = iTextSharp.text.pdf.PdfWriter.GetInstance(oDoc, New FileStream(NombreArchivo, IO.FileMode.Create _

    , FileAccess.Write, IO.FileShare.None))

    'Apertura del documento.

    oDoc.Open()

    cb = pdfw.DirectContent

    'Agregamos una pagina.

    oDoc.NewPage()

    'Iniciamos el flujo de bytes.

    cb.BeginText()

    'Instanciamos el objeto para el tipo de letra.

    fuente = iTextSharp.text.FontFactory.GetFont(iTextSharp.text.FontFactory.HELVETICA, iTextSharp.text.Font.DEFAULTSIZE, iTextSharp.text.Font.NORMAL).BaseFont

    'Seteamos el tipo de letra y el tamaño.

    cb.SetFontAndSize(fuente, 12)

    'Seteamos el color del texto a escribir.

    cb.SetColorFill(iTextSharp.text.Color.BLACK)

    'Aqui es donde se escribe el texto.

    'Aclaracion: Por alguna razon la coordenada vertical siempre es tomada desde el borde inferior (de ahi que se calcule como “PageSize.A4.Height - 50″)

    cb.ShowTextAligned(iTextSharp.text.pdf.PdfContentByte.ALIGN_LEFT, "Ejemplo basico con iTextSharp", 200, iTextSharp.text.PageSize.A4.Height - 50, 0)

     

    'Fin del flujo de bytes.

    cb.EndText()

    'Forzamos vaciamiento del buffer.

    pdfw.Flush()

    'Cerramos el documento.

    oDoc.Close()

    Catch ex As Exception

    'Si hubo una excepcion y el archivo existe …

    If File.Exists(NombreArchivo) 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(NombreArchivo)

    End If

    Throw New Exception("Error al generar archivo PDF (" & ex.Message & ")")

    Finally

    cb = Nothing

    pdfw = Nothing

    oDoc = Nothing

    End Try

     

    End class

     

    ... El resultado es que me crea un pdf en c:\ con el nombre ejemplo.pdf con el contenido Ejemplo basico con iTextSharp

     

    Alguien conoce alguna manera de trabajar a partir de un fichero de texto??

     

    Gracias!

    Monday, December 01, 2008 11:03 AM

Answers

  • Hola!!!, se pueden hacer tablas inlcusive; pero te paso un ejemplo de un archivo que recupera de una tabla


    Imports System.IO
    Imports System.Text
    Imports GeneraArchivo.DAO
    Imports iTextSharp.text
    Imports iTextSharp.text.pdf

    'Db utilizada ORACLE xe
    ' si bien el codigo funciona, estoy tratando de encontrar alguna forma de generar tablas dinamicamente
    'creo que este control tiene esa funcionalidad, lo estoy probando, por de pronto un breve ejemplo con columnas y filas
    ' a manopla
    Module Module3
        Sub Main()
            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 fuente As iTextSharp.text.pdf.BaseFont
            Dim NombreArchivo As String = "C:\ElDirectorio\ejemplo42.pdf"

            Dim Tabla As New iTextSharp.text.Table(10)
            Dim Celda As New iTextSharp.text.Cell
            Tabla.AddCell(Celda)

            Try
                pdfw = PdfWriter.GetInstance(oDoc, New FileStream(NombreArchivo, _
                FileMode.Create, FileAccess.Write, FileShare.None))
                oDoc.Open()
                cb = pdfw.DirectContent
                oDoc.NewPage()
                cb.BeginText()
                fuente = FontFactory.GetFont(FontFactory.HELVETICA, iTextSharp.text.Font.DEFAULTSIZE, iTextSharp.text.Font.NORMAL).BaseFont
                cb.SetFontAndSize(fuente, 6)
                cb.SetColorFill(iTextSharp.text.Color.BLACK)

                Dim conexion As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST = TUHOST O IP)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));User Id=USUARIO;Password=CONTRASENA;"
                Dim vl As New DAO
                Dim cuenta As Integer = 0
     'uy casi olvido, este recupera de un metodo un data set con los registros de las tablas
     'podes meterlo aca o estirar con un simple select
                Dim lDset As DataSet = vl.OraRecuperaDset(conexion, "select * from TABLA")

                Dim columnas As String
                columnas = lDset.Tables(0).Columns.Item(0).ColumnName & "       |       " & _
                           lDset.Tables(0).Columns.Item(1).ColumnName & "       |       " & _
                           lDset.Tables(0).Columns.Item(2).ColumnName & "       |       " & _
                           lDset.Tables(0).Columns.Item(3).ColumnName & "       |       " & _
     

                cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, columnas, 9, PageSize.A4.Height - 10, 0)
                Dim linea As Int64 = 10

        'recorre la tabla
                For Each registro As DataRow In lDset.Tables(0).Rows
             'espacio entre fila de cada registro
             linea = linea + 10
     
      'donde dice 10, 30, 55, 90 es el espacio entre cada columna, eso se puede meter en un loop
      ' q recupere la dimension del valor retornado
                    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, registro.Item(0) & ",", 10, PageSize.A4.Height - linea, 0)
                    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, registro.Item(1) & ",", 30, PageSize.A4.Height - linea, 0)
                    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, registro.Item(2) & ",", 55, PageSize.A4.Height - linea, 0)
                    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, registro.Item(3) & ",", 90, PageSize.A4.Height - linea, 0)
                   
                Next
                cb.EndText()
                'Forzamos vaciamiento del buffer.
                pdfw.Flush()
                'Cerramos el documento.
                oDoc.Close()
            Catch ex As Exception
                'Si hubo una excepcion y el archivo existe …
                If File.Exists(NombreArchivo) 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(NombreArchivo)
                End If
                Throw New Exception("Error al generar archivo PDF (" & ex.Message & ")")
            Finally
                cb = Nothing
                pdfw = Nothing
                oDoc = Nothing
            End Try
        End Sub
    End Module

    Friday, November 06, 2009 12:34 PM