lunes, 15 de abril de 2013

Crear pdf en .NET con iTextSharp


Buenas en este post voy a explicar como se crean pdf en .NET usando la librería iTextSharp. ITextSharp es una librería que permite crear pdfs de forma muy simple para aplicaciones en .NET y en Java (allí es llamada iText). Por ahora voy a crear el proyecto en .NET. En el siguiente post repetiré el proceso continuando el proyecto de retribuciones en especie del post anterior. El proyecto será muy simple: un formulario con una caja de texto y un botón. Luego mostraré un proyecto ya más profesional para que se vea lo fácil y lo bien que queda integrado en nuestras aplicaciones. También se podría usar esa librería para crear pdfs con los datos que tenemos en nuestras bases de datos pero aquí he de reconocer que me decanto más por usar informes, ya que me permiten exportar el contenido a pdf, Excel o Word. Pero para todo siempre hay opciones y gustos.
Bueno cuelgo aquí el vídeo y en el siguiente post continuaremos en Java donde hay muchas cosas por aprender.


A parte estoy preparado un post, ya que ahora comienza la fiesta con la campaña de la Renta 2012, Cuentas Anuales 2012 y en 2 meses el Impuesto sobre Sociedades 2012, en el que hablaré un poco sobre algunos conceptos de fiscalidad y legislación mercantil.

34 comentarios:

  1. yo trabajo con vb.net 2010 y no puedo hacer que funcione

    ResponderEliminar
  2. buen aporte ya me quedo a mi a la primera pero ahora como doy salto de linea para el pdf saludos

    ResponderEliminar
  3. hola Raúl, soy nuevo en esto de visual, no puedo lograr que el contenido de un textbox multilinea, lo convierta a pdf, ya que me pone todo en una linea (solo una parte del contenido del textbox) y no se en que parte del codigo debo indicarle el vbnewline, podras ayudarme?

    ResponderEliminar
  4. hola Raúl, soy nuevo en esto de visual, no puedo lograr que el contenido de un textbox multilinea, lo convierta a pdf, ya que me pone todo en una linea (solo una parte del contenido del textbox) y no se en que parte del codigo debo indicarle el vbnewline, podras ayudarme?

    ResponderEliminar
    Respuestas
    1. Hola para hacer multilínia crea una línia. 1º posicionas con
      cb.SetTextMatrix(x, y)
      escribes la primera varibale
      cb.ShowText(variable1)
      y vuelves a posicionar
      cb.SetTextMatrix(x, y)
      cb.ShowText(variable2)
      También se podría crear un párrafo y entonces si puedes crear varias líneas.
      Saludosm

      Eliminar
    2. En mi anterior repuesta faltaría el código siguiente: antes de empezar a posicionarse y a añadir el texto hay que crear un writer y establecer la fuente.

      Dim cb As PdfContentByte = writer.DirectContent
      Dim bf As BaseFont = BaseFont.CreateFont(BaseFont.COURIER_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED)
      cb.SetFontAndSize(bf, 10)
      cb.BeginText()
      // Aquí va el código del mensaje anterior //
      y finalmente el cb.EndText()

      Eliminar
    3. El código lo tengo tal y como dices, revicé línea por línea para no omitir nada y no me hace ningún salto de línea, el pdf se crea pero con todo el contenido del textbox en una misma línea

      Eliminar
  5. se me olvidó comentarte que también me marca error al crear el documento pdf, al ir rastreando el motivo, me encuentro que de la linea de codigo cb.show("Datos:" & me.datostextbox.text)
    se pasa al Catch, ojala puedas ayudarme, gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola Jorge.
      Me parece que hay un error de tipeo, no se si aca o en tu código.
      En donde tenes cb.show("Datos:" & me.datostextbox.text)
      Deberias tener cb.showtext("Datos:" & me.datostextbox.text)

      Con eso debería bastar.

      Eliminar
    2. Hola Raúl, perdón por mi ausencia pero como se acerca el período vacacional nos han puesto unas actividades de cierre que he descuidado un poco mi proyecto, el tipeo fue una equivocación mía, dentro del código si esta bien pero aún el día de hoy me sigue marcando error al crear pdf, sigue bricando de la instrucción ("Datos: " & me.datostextbox.text) al Catch
      y por consiguiente todavía no puedo ver si funciona lo del texto multilinea, espero tu gran ayuda, gracias

      Eliminar
    3. Hola Raúl, te comento que ya me crea el pdf el error que tenía en mi código es que había omitido la línea cb.SetFontAndSize(bf, 10) y por eso no me creaba el documento, pero sigo sin poder crear el salto de linea, todo el contenido del textbox.text multilinea me lo manda en una sola, necesito de tu ayuda, gracias una vez más

      Eliminar
    4. Hola el tema de unar SetTextMatrix(x, y) está en que el texto no se corta al final de la línea. Es ideal para rellenar los campos de un formulario pdf prediseñado o si sabes en la posición en la que tienes que añadir el texto y la longuitud máxima del texto. Sino has de usar fues SubString para separar el texto.

      Si lo que quieres es añadir un texto en varias líneas, de forma similar a como lo añades en un documento word, es mejor usar párrafos:
      Dim parrafo As New Paragraph()
      parrafo.Add(New Phrase(
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vitae mauris sed dui rhoncus aliquam nec ac orci."))
      parrafo.Add(New Phrase(
      "Lorem ipsum dolor sit amet, consectetur adipiscing elit." & vbNewLine & "Morbi vitae mauris sed dui rhoncus aliquam nec ac orci."))
      document.Add(parrafo)

      Si tienes sabes la posición en la que tiene que ir el texto puedes tambien hacer:
      Dim ct As New ColumnText(cb)
      Dim frase As New Phrase("Texto1" & vbNewLine & "Texto2")
      ct.setSimpleColumn(frase, 35, 750, 580, 318, 18, Element.ALIGN_LEFT)
      ct.go()

      Eliminar
    5. lo que pasa es lo siguiente, tengo un TEXTBOX con la propiedad multilinea=true, en ese textbox escribo por dar un ejemplo, la letra de una canción tal como si lo hiciera en word, ese texto que escribí es el que quiero mandar a pdf y que en el documento creado aparezca la letra de la canción tal y como la esciribi en el textbox, no puedo saber en tiempo de diseño como cortar ese texto pues sólo es uno y el usuario puede escribir una canción de 10 lineas o 20, etc, etc. Si yo escribí 5 lineas de mi canción, al crear el pdf las 5 lineas me aparecen como si fuera una sola y eso es lo que no puedo controlar, espero no ser molesto con esta situación, gracias por el aporte.

      Eliminar
    6. Hola, ¿has provado con la última de las opciones usando ColumnText? En principio te tiene que separar el contenido en varias columnas.

      Eliminar
  6. Hola Raul.

    Al igual que Jorge no puedo insertar un salto de línea en el PDF, yo me traigo texto de una base de datos que cargo en una variable tipo string, arme una rutina para que corte el string en varias líneas sin cortar las palabras, pero no logro insertar un salto de línea al final de cada corte.
    Agradeceria mucho tu ayuda.
    Saludos.
    Guillermo.

    ResponderEliminar
  7. Hola que tal puedes subir el código de la factura

    ResponderEliminar
  8. Hola Raúl tengo que hacer algo muy parecido a lo que mencionaste al ultimo de la factura si pudieras mostrar como lo hiciste seria genial. Desde ya muchas gracias y espero tu pronta respuesta.

    ResponderEliminar
    Respuestas
    1. Hola necesitas el código o el programa compilado?

      Eliminar
    2. Y PARA QUE SE MUESTRE EL CONTENIDO DE UN DATAGRIDVIEW DENTRO DEL PDF GENERADO?

      cb.SetTextMatrix(50, 670)
      cb.ShowText(Me.datagridview1.Text)

      asi intente mi codigo

      Eliminar
  9. Hola Raúl, soy Edwin Puello, muy interesante tu aporte, pero quiero estoy haciendo un reporte con iTextSharp, sera que se puese determinar el acho de un caracter con esta libreria o una funcion que me justifique un texto en particular, a partir de un margen superior y margenes izquierdos y derechos y que me devuelva la fila actual?

    ResponderEliminar
    Respuestas
    1. Hola, en principio lo que podrías usar es la creación de una parágrafo y así justificar el texto.
      Hay una función que devuelve la fila actual que creo que es PdfWriter.getVerticalPosition()
      Además tendrías que mirar si el texto sobrepasa una página para ir añadiendo nuevas páginas al documento.
      También podrías usar una variable contador para saber el número de columnas y así ir añadiendo el contenido en la página correcta.
      Saludos,

      Eliminar
  10. Hola Raul, muy bueno tu aporte. Has intentando interpretar tags html y convertirlas a PDF? Una especie de parsing html a PDF? Gracias

    ResponderEliminar
    Respuestas
    1. Hola, sería muy sencillo hacerlo. Hay varios ejemplos, desde leer archivo html e interpretar cada uno de los tags html hasta soluciones más elaboradas con librerías como XMLWorker

      Eliminar
  11. Te agradesco Raul por el excelte ejemplo que nos has dado, mi pregunta es como hago para agregarle una nueva pagina, lo que yo estoy trantando de hacer es que solo cargue en la hoja 1 y en la hoja 2 un pdf cada uno hecho a partir de un formulario.

    ResponderEliminar
    Respuestas
    1. Buenas, añadir nuevas páginas a un documento pdf se consigue con el método NewPage():
      document.NewPage()

      y así añades el contenido que quieras en la página que necesitas.

      Saludos,

      Eliminar
  12. Y PARA QUE SE MUESTRE EL CONTENIDO DE UN DATAGRIDVIEW DENTRO DEL PDF GENERADO?

    cb.SetTextMatrix(50, 670)
    cb.ShowText(Me.datagridview1.Text)

    asi intente mi codigo

    ResponderEliminar
  13. Como creo una tabla para meter datos como por ejm
    ----------------------------------------
    Cod Descripcion Cant Precio
    1 Arroz 4 $5,90

    pura vida por tu ayuda y gracias por tu aporte

    ResponderEliminar
  14. hola, estoy tratando de crear una factura pero no encuentro tutoriales de como crear una plantilla con paneles para ingresarle datos, veo que en el ejemplo final existen 4 paneles entre descripcion, fecha, cliente e info de la factura, tal vez podrias compartir el proyecto o las clases editor.vb y logica.vb para implementarla

    ResponderEliminar
  15. Hola buenas, no se si este post sigue activo , mira soy estudiante de programación de aplicaciones plataforma y estoy haciendo mi proyecto antes de hacer las practicas ... , y en mi proyecto tengo que generar facturas en formato PDF , ya he consegui introducir los datos a un PDF y eso , pero ahora quiero estructurarlos dentro del PDF (crear tablas, cabecera , poner imagenes ...) y me he fijado que en el video que hay en la parte superior de este post tu ya tienen una factura perfectamente estructurada, me preguntaba si me podrías dar una nociones básicas para poder estructurar mi PDF.

    Un saludo y gracias.

    ResponderEliminar
  16. HOLA DE IGUAL MANERA YO QUIERO HACER UNA FACTURA O UN TIPO DE VALE YA REALICE LO DE LA INTRODUCCION DE DATOS PERO QUISIERA COMO DICEN METER ALGUNAS FORMAS COMO LINEAS, O RECTÁNGULOS Y DENTRO O SOBRE PONER TEXTO ASI COMO UNA IMAGEN O LOGO EN LA ESQUINA SUPERIOR SIN ALTERAR EL TEXTO, YA LO INTENTE MEDIANTE COORDENADAS PERO AUN NADA. SI PUDIERAS AYUDARME TE LO AGRADECERIA BASTANTE. SALUDOS

    ResponderEliminar