Para quienes aún no tienen el gusto les presento iTextSharp, una biblioteca original de Java portada 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 siempre tenemos nuestra alternativa gratuita
.
Puedes descargarla aquí.
Veamos como utilizarla:En primer lugar, una vez descargada la biblioteca, necesitamos incluir la referencia en nuestro proyecto.
- Clickeamos en “Add Reference” dentro del menú “Project”

- Seleccionamos nuestra biblioteca recien descargada.

- De modo que nos quede referenciado en nuestro proyecto.

Y simplemente para cerrar esta archi sencilla intro les dejo un breve ejemplo de cómo hacer uso del assembly para generar un documento PDF con texto …
Private Sub GenerarPDF()
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:\ejemplo.pdf”
Try
pdfw = PdfWriter.GetInstance(oDoc, New FileStream(NombreArchivo, _
FileMode.Create, FileAccess.Write, 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 la tipo de letra.
fuente = FontFactory.GetFont(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(PdfContentByte.ALIGN_LEFT, “Ejemplo basico con iTextSharp”, 200, 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 Sub

Hola quisiera preguntar algo sobre el tema, la verdad el codigo que alli utilizas no me funciona en 2003, es acaso una clase dll, exclusiva para 2005 o newer?
tks
comentario por Vallenato — Diciembre 4, 2007 @ 8:20 pm
Mil disculpas, habia un error en el código.
La linea cb = pdfw.DirectContent debe ir luego de oDoc.Open(), supongo que ese era tu problema.
Mis pruebas fueron sobre 2005 asique tambien modifiqué FileShare.Delete por FileShare.None para hacerlo compatible con Framework 1.1.
Y gracias por el aviso.
comentario por A l e x a n d e r — Diciembre 4, 2007 @ 10:37 pm
consulta… tengo un proyecto que utiliza esta DLL, y estoy intentando cambiar el formato de este(cambios en los textos).. pero al ejecutarlo no lo toma.
puede ser que se tenga que incluir nuevamente la DLL para que tome esto???
o se les ocurre algo??
comentario por Freddy — Diciembre 6, 2007 @ 12:20 pm
Freddy:
Dudo que tengas que referenciar nuevamente la DLL.
Postea algo mas específico. En lo posible las lineas de codigo que te traen inconvenientes asi puedo ayudarte.
comentario por A l e x a n d e r — Diciembre 6, 2007 @ 12:42 pm
Hola, tengo una duda respecto a la entrada de flujo de bytes.
Resulta que, previamente, el programa me ha generado un html en mi disco local y es el que quiero convertir a pdf… pero no se cómo.
Supongo que debe ir por el tema de document.add(“el archivo que sea”), pero no lo tengo muy claro. ¿¿Alguna ayuda??.
Gracias!
comentario por Xavi — Diciembre 27, 2007 @ 9:27 am
hola , dime funciona en web el itextChart
comentario por Roberto — Enero 15, 2008 @ 1:43 pm
Gracias me funcionó perfecto… lo que sí es que en un principio me mostraba errores pero agregé esto en la cabecera y se soluciona todo.. kizas hubo gente ke no le funcionó debido a esto…
agregar:
Imports System.IO
Imports iTextSharp.text
Imports iTextSharp.text.pdf
comentario por Pancho — Febrero 21, 2008 @ 1:34 am
Me esta generando el siguiente error:
System.Exception: Error al generar archivo PDF (Acceso denegado a la ruta de acceso “c:\ejemplo.pdf”.)
Como se soluciona?
Gracias.
comentario por JU4N35 — Marzo 11, 2008 @ 11:40 am
JU4N35:
Está arrojando ese error porque la biblioteca no puede crear ó acceder al archivo en cuestión.
Chequea:
1) No tener abierto el archivo PDF en el momento de generarlo nuevamente.
2) Tener permisos suficientes para acceder al directorio donde quieres generarlo. Si se trata de un proyecto web el usuario “ASP.NET” del servidor debe tener permiso de escritura sobre el directorio.
comentario por A l e x a n d e r — Marzo 11, 2008 @ 11:48 am
aaaaa claro A l e x a n d e r que vergüenza, el problema si era de permisos…muchas gracias por la colaboración.
comentario por JU4N35 — Marzo 11, 2008 @ 11:55 am
…y una preguntica mas, como inserto una imagen en el PDF?
Gracias de nuevo.
comentario por JU4N35 — Marzo 11, 2008 @ 12:04 pm
JU4N35:
El tema de las imagenes es un poco mas complejo. En un futuro debería publicar algun articulo sobre el tema.
Puedo dejarte un ejemplo muy básico de como insertar una imagen:
[-------- INICIO --------]
Dim oImagen As iTextSharp.text.Image
Dim coordenadaX As Single = 10.5
Dim coordenadaY As Single = 10.5
oImagen = iTextSharp.text.Image.GetInstance(“C:\imagen.jpg”)
oImagen.SetAbsolutePosition(coordenadaX, coordenadaY)
documento.Add(oImagen)
[---------- FIN ----------]
Donde el objeto “documento” es de tipo “iTextSharp.text.Document”
Espero te sirva.
Saludos.
comentario por A l e x a n d e r — Marzo 11, 2008 @ 12:37 pm
Y que tipo es “oImagen”?
Muchas gracias de verdad, que pena tanta molestia.
comentario por JU4N35 — Marzo 11, 2008 @ 1:08 pm
aaaa no, que pena…es que no había visto…
comentario por JU4N35 — Marzo 11, 2008 @ 1:09 pm
Bueno, me ha f¡uncionado perfecto agregandole par modificaciones pequeñas pero ya me dio el resto es carpintería.
A l e x a n d e r Muchas gracias por toda la ayuda.
comentario por JU4N35 — Marzo 11, 2008 @ 1:30 pm
hola, queria preguntar algo
con esta libreria se podra pasar de un html o xhtml a pdf?
Gracias
comentario por antonio — Mayo 2, 2008 @ 1:57 pm
Probé el código y funciona pero mi pregunta es la siguiente: ¿cómo puedo meter un párrafo completo y no línea por línea?
comentario por Edgar — Junio 2, 2008 @ 10:20 am
muy buen ejemplo, me ha servido pero kisiera saber es como puedo hace run reporte completo de 4 websites en PDF.. es posible? supongo ke si ya que me lo piden pero no entiendo un poco.. a ver si alguien me peude ayudar
Gracias
comentario por Fu Urashima — Junio 26, 2008 @ 11:25 pm
hola necesito saber como se agregan datos de una base de datos a un pdf ademas probe con la informacion que aparece aqui para agregar imagenes y me tira un error donde me dice el tipo documento no esta definido por favor alguien me puede ayudar
comentario por xavi — Junio 30, 2008 @ 3:28 am
para agregar los datos de una base hecha en sql server yo utilizo este codigo
***********************************
Protected Sub Button4_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim oDoc As New Document(PageSize.LETTER, 0, 0, 0, 0)
Dim pdfw As PdfWriter
Dim cb As PdfContentByte
‘Dim fuente As iTextSharp.text.pdf.BaseFont
‘Dim pdfw As iTextSharp.text.pdf.PdfWriter
‘Dim fuente As BaseFont
Dim NombreArchivO As String = “C:\Comentario.pdf”
Dim Conexion As New Data.SqlClient.SqlConnection(“Data Source=(local)\SQLEXPRESS; ” & “Initial Catalog=basededatos; ” & “Integrated Security=true”)
Dim Comando As New Data.SqlClient.SqlCommand(“”, Conexion)
‘Dim fuente As iTextSharp.text.pdf.BaseFont
Dim leer As Data.SqlClient.SqlDataReader
Try
pdfw = PdfWriter.GetInstance(oDoc, New FileStream(NombreArchivO, FileMode.Create, FileAccess.Write, FileShare.None))
Dim oTabla As New Table(5, 5)
oDoc.Open()
Dim cell1 As New Cell(“Cliente”)
Dim cell2 As New Cell(” comentario”)
cell1.GrayFill = 0.5F
cell2.GrayFill = 0.5F
oTabla.AddCell(cell1)
oTabla.AddCell(cell2)
Conexion.Open()
Comando.CommandText = “SELECT * from Comentario”
leer = Comando.ExecuteReader
While leer.Read()
oTabla.AddCell(leer.GetString(0))
oTabla.AddCell(leer.GetString(1))
End While
Conexion.Close()
oTabla.Cellpadding = 2
oDoc.Add(oTabla)
oDoc.Close()
Catch ex As Exception
If File.Exists(NombreArchivO) Then
If oDoc.IsOpen Then oDoc.Close()
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 Class
****************************
y el error de la imagen por que documento en este caso seria oDoc que es Dim oDoc As New Document(PageSize.LETTER, 0, 0, 0, 0)
comentario por jose — Julio 1, 2008 @ 4:09 pm
señores necesito ayuda … podre pasar directamente un doc a pdf
gracias
comentario por cazo — Julio 14, 2008 @ 12:14 am
como puedor exportar un pdf a un jpg.
gracias.
comentario por manolo — Agosto 4, 2008 @ 8:22 am
Amigo, q buen dato el q has dado, es excelente, pero tengo una pequeña duda:
¿como puedo establecer el tamaño de la imagen?; osea, quiero q sea cual sea la imagen todas salgan del mismo tamaño.
Gracias por el codigo y los ejemplo y de antemano tambien por la ayuda.
Ricardo, Colombia
comentario por RICARDO MANCILLA — Agosto 15, 2008 @ 5:07 pm
Hola amigo… tu posteo es genial. Estoy haciendo un proyecto en Visual studio 2005 framework 2.0. mas especificamente en c#. Es compatible con esto?
saludos y muchas gracias
comentario por paulo — Agosto 19, 2008 @ 8:30 pm
paulo:
Si, la biblioteca iTextSharp puede usarse bajo cualquier lenguaje del FrameWork. Incluso como su nombre lo indica está escrita en C#.
comentario por A l e x a n d e r — Agosto 20, 2008 @ 10:10 am
Saludos amigo blogger, una pregunta.. estoy pasando una imagen tiff a pdf, la imagen tiff es un scan de una factura, ya tengo el pdf y todo, pero no puedo hacer copy/paste del texto del pdf porque se pasa como una imagen, hay forma de solucionarlo?? tambien tengo un EMF del documento scaneado
comentario por Felix — Agosto 21, 2008 @ 11:11 am
Un ejemplo genial pero…
estoy buscando justo lo contrario, como leer el contenido de un PDF y pasarlo a una base. Alguien me da una pista? Mil Gracias !
comentario por Dimoniet — Septiembre 2, 2008 @ 6:26 am
Esta todo muy padre pero como podré hacer para darle formato al reporte, es decir, ponerle líneas tipo cuadrícula como si fuese un diseño de crystal y también necesito que en lugar de que se abra guardarlo automáticamente en una carpeta porque necesito generar reportes en masa basándome en los registros de un DataTable.
Gracias.
comentario por Manuel — Septiembre 10, 2008 @ 12:11 pm
Jo, que rabia, yo no lo he conseguido.
El primer error me da en esta linea
iTextSharp.text.Document
Me dice que ese tipo de no esta definido.
Yo trabajo con web developer con asp
He insertado la dll en mi carpeta bin y he copiado el trozo de codigo que habeis publicado en esta pagina y me da errores similares al que he puesto al principio.
Espero que alguien me pueda ayudar
comentario por Machuca — Septiembre 21, 2008 @ 12:50 pm
A mi me funciona bien hasta ahora (probando el ejemplo), pero ¿no hay alguna manera de que no me tire el archivo a un lugar predeterminado, sino que le pregunte al usuario donde guardarlo?
comentario por Eduardo — Octubre 29, 2008 @ 4:29 pm
como puedo dejar una fila en blanco en una tabla de un pdf, hecha con las iTextSharp, porque siempre tengo que escribir algo y si no le paso ningun texto me la pone muy estrecha.
Agradeceria si alguien me pudioera ayudar con esto…
Saludos.
comentario por fila en blanco — Octubre 30, 2008 @ 3:22 am
Hola, mi problema es que cuando ejecuto la aplicación en la consola me sale el mensaje :
“…no se pueden cargar símbolos”
Eso que significa????
Ha alguno de ustedes le sucedió algo parecido??
Gracias
comentario por Mila — Diciembre 1, 2008 @ 6:40 am
Gracias estaba buscando estos aportes, meserviran de mucho
comentario por Erick — Enero 13, 2009 @ 2:16 pm
Necesito mostrar un archivo .PDF en una pagina web, existe algún control gratuito que me sirva??? lo que necesito es hacer clic en un link y que en alguna parte de la página se muestre un archivo pdf ubicado en la misma máquina como local.
gracias por la ayuda…
comentario por Alexander Murillo — Enero 27, 2009 @ 7:54 pm
Hola estoy empezando a descubrir esta clase y es lo que buscaba,,
a ver si me puedes ayudar,,,
necesito extraer un texto en concreto siempre en la misma posición de un PDF creado por otra aplicación y sustituir ese texto por un codigo de barras..
si puedes orientarme un poco te lo agradecería,, gracias de antemano…
comentario por frederick — Febrero 6, 2009 @ 8:48 am
Muy bueno el post, me ha servido de mucho, pero quisiera saber como dar formato al pdf resultante, necesito poner un titulo, luego la tabla que se genera mediante una consulta de sql server y luego un imagen… al combinar la tabla con la imagen la tabla se superpone con la imagen. ademas de como poder cambiar la fuente de la tabla para que sea mas peueña…
comentario por Rodrigo — Febrero 19, 2009 @ 6:04 pm
Hola, excelente aportación.
Existe la posibilidad de generar el pdf directamente desde ASP.NET?, es decir, colocar un botón y al clicar que se genere el pdf con el contenido de la página que se está mostrando? Me seria de muchísima utilidad, ya que tengo los listados programados y pasarlos a pdf no requeriria ningún esfuerzo.
Muchísimas gracias !!
comentario por Ramon Gelabert — Abril 29, 2009 @ 8:00 am
hola, tengo un problema al pasar el texto que tengo en un RichTextbox a el archivo .pdf, el tema es que cuando lo crea me pone todo en una linea, ejemplo:
‘texto que hay en el RichTextbox
este es
un documento
de prueba
‘Texto que se genera en el pdf
este es un documento de prueba
comentario por Nicolas — Abril 30, 2009 @ 9:54 am
Me ha funcionado excelente, el punto es cambie el tamaño de documento por un HALFLETTER, sin embargo la orientacion no la puedo cambiar es decir Horizontal o vertical.
Puedes ayudarme
Gracias por la aportacion
comentario por Galvan — Mayo 28, 2009 @ 2:47 pm
Cómo puedo hacer para que en lugar de grabarme directamente el pdf en C:\Comentario.pdf, me aparezca el cuadro de diálogo “Descarga de Archivo” ¿Desea abrir o guardar este archivo?.
Gracias.
comentario por Alicia — Septiembre 9, 2009 @ 3:35 am
@Alicia:
Hasta donde yo conozco no es posible enviar directamente el archivo PDF al cliente desde una web.
La alternativa es guardar un archivo temporal y luego ofrecer la descarga.
Algunas sugerencias con respecto al archivo temporal:
1) Generar un nombre aleatorio para el archivo. Recomiendo utilizar como prefijo el ID de Sesion (util para el punto 2) y luego un sufijo generado aleatoriamente. Algo asi
ID-SESION_CADENA-ALEATORIA.PDF.No te preocupes el nombre que se le ofrece al cliente puede ser distinto al del archivo fisico.
Te recomiendo este post como referencia para la transferencia del archivo.
2) Al finalizar la sesion eliminar los archivos que comiencen justamente con el ID de Sesion actual. Esto lo puedes hacer mediante
Global.asaxutilizando los eventosApplication_Erroren caso de error ySession_Endpara cuando finaliza la sesion de usuario.Saludos y gracias por comentar.
comentario por A l e x a n d e r — Septiembre 9, 2009 @ 10:05 am
Oigan una disculpa, alguien me podria ayudar???… lo que pasa es que necesito encontrar la forma de como buscar texto en un pdf… se los agradezco de antemano…
comentario por chagy — Septiembre 10, 2009 @ 2:26 pm
En mi actual proyecto me piden que de la posibilidad al usuario de recibir un reporte en excel y el pdf. Que como condiciones exista el mismo formato en los dos documentos, me han dado una plantilla del formato (reporte) que debe generarse, hasta ahora he conseguido generar el archivo de excel, y habia implementado la generacion del pdf utilizando las posibilidades que da oficce 2007 de hacer esa transformación. Pero me han dicho que no todos los equipos tienen la version de oficce 2007 asi que los pdf deben ser generados mediante otra forma. Mi pregunta en concreto seria como puedo generar un pdf a partir de una plantilla (hoja) de excel, es decir, darle el mismo formato al de excel como al de pdf. Con formato me refiero a que las celdas sean de un color determinado, agregar el logo de la empresa. ect. Gracias de antemano por su respuesta.
comentario por Christian — Septiembre 10, 2009 @ 2:55 pm
Si lo has conseguido te pido que me digas como por favor. Un saludo, gracias y larga vida a Mandark
comentario por Iokin — Octubre 26, 2009 @ 2:22 pm
Buenas, tengo una aplicación web que me crea un documento en pdf. La cuestión es que me abre el pdf en la misma página donde está el botón que lo genera.
¿Sabeis si se puede indicar que abra el pdf en una ventana nueva del navegador?
Mcuhas gracias,
Os paso el código que utilizo, por si os es de interés
Private Sub CrearPDF()
Dim objMemoryStream As MemoryStream = New MemoryStream
Dim DocumentoPDF As Document = New Document(com.lowagie.text.PageSize.A4, 40, 30, 25, 15)
Dim docPdfWriter As PdfWriter = PdfWriter.getInstance(DocumentoPDF, objMemoryStream)
Dim sb1 As New StringBuilder(“”)
Dim ref As String
Dim fic As String
sb1 = Session(“datos”)
ref = Session(“referencia”)
fic = “C:\” + ref + “.pdf”
DocumentoPDF.open()
Dim titulo As String = “SIMULACION SWIFT Ref.Crédito: ” + ref
Dim ck = New Chunk(titulo, New Font(com.lowagie.text.Font.COURIER, 14, com.lowagie.text.Font.UNDERLINE))
Dim par As New Paragraph()
par.add(ck)
DocumentoPDF.add(par)
Dim ck2 = New Chunk(sb1.ToString(), New Font(com.lowagie.text.Font.COURIER, 10, com.lowagie.text.Font.NORMAL))
Dim par2 As New Paragraph()
par2.add(ck2)
DocumentoPDF.add(par2)
DocumentoPDF.close()
HttpContext.Current.Response.ClearContent()
HttpContext.Current.Response.ClearHeaders()
HttpContext.Current.Response.ContentType = “application/pdf”
HttpContext.Current.Response.AddHeader(“Content-Disposition”, “attachment;filename=” & fic)
HttpContext.Current.Response.BinaryWrite(objMemoryStream.ToArray())
HttpContext.Current.Response.End()
End Sub
comentario por Alicia — Noviembre 3, 2009 @ 7:51 am