Es por este motivo que surge este post: para facilitarle la vida a los desarrolladores que necesitan crear un documento con imágenes y enlaces en un archivo PDF.
Para la generación del PDF vamos a usar la ya reconocida librería iTextSharp.
Algo más, el archivo se generará al vuelo, osea en el momento que el usuario solicite el archivo… esto tiene la ventaja de que el pdf siempre estará actualizado… dado que suponemos que el pdf se generará con información guardada en la base de datos, pero nosotros en este post obviaremos ese paso para simplificar el post.
Para solicitar el archivo pdf, tendremos un hyperlink en cual tiene un parámetro querystring con el id del documento a solicitar… y este hyperlink, hará el llamado a un manejador genérico o handler, quien finalmente será quien genere el pdf.
Algo como esto:
<asp:HyperLink ID="hplDownload" NavigateUrl="~/PdfGenerator.ashx?did=5" runat="server">Descargar...</asp:HyperLink>
Como pueden observar, el enlace del hyperlink llama a un manejador de peticiones, el cual recibe el id del documento.
Bueno, ya hemos dicho a grandes rasgos en que consiste este post, ahora vamos al código:
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Generar documento pdf al vuelo con imagenes y enlaces</title> </head> <body> <form id="form1" runat="server"> <p> Haga click en el enlace para descargar el archivo pdf <br /> <asp:HyperLink ID="hplDownload" NavigateUrl="~/PdfGenerator.ashx?did=5" runat="server">Descargar...</asp:HyperLink> </p> </form> </body> </html>
Este es un extracto del código que va en el manejador de peticiones web:
Imports System.Web Imports System.IO Imports iTextSharp.text Imports iTextSharp.text.pdf Public Class PdfGenerator Implements IHttpHandler Sub ProcessRequest(ByVal ctx As HttpContext) Implements IHttpHandler.ProcessRequest Dim did As String = ctx.Request.QueryString("did") If IsNumeric(did) Then CreatePDFDocument(did) End Sub Private Sub CreatePDFDocument(ByVal did As Integer) Dim MStream As New MemoryStream() Dim document As New Document(PageSize.A4, 80, 50, 30, 65) Dim writer As PdfWriter = PdfWriter.GetInstance(document, MStream) writer.CloseStream = False document.Open() 'header.................... Dim logo As Image = Image.GetInstance(GetApplicationPhysicalPath() & "images\header.jpg") Dim cell As New Cell(logo) cell.BorderWidth = 0 Dim TableHead As New Table(1, 1) TableHead.Width = 100 TableHead.Border = 0 TableHead.Cellpadding = 10 TableHead.BorderColor = iTextSharp.text.Color.WHITE TableHead.AddCell(cell) document.Add(TableHead) 'content................... Dim TableContent As New Table(2, 4) TableContent.Width = 100 TableContent.Cellpadding = 2 TableContent.Border = 0 TableContent.BorderColor = iTextSharp.text.Color.WHITE 'first row '----------------------------------------------- Dim image0 As Image = Image.GetInstance(GetApplicationPhysicalPath() & "images\" & "image0.jpg") cell = New Cell() cell.BorderWidth = 0 cell.SetWidth("30%") cell.AddElement(image0) TableContent.AddCell(cell) Dim pMarca As New Phrase("Marca:", New Font(Font.BOLD)) Dim m As String = "Este es otro título" & vbCr Dim pMarcaContent As New Phrase(m) Dim pLinea As New Phrase("Línea:") Dim l As String = "Comics" & vbCr Dim pLineaContent As New Phrase(l) Dim pNombre As New Phrase("Nombre:") Dim n As String = "La historia del Comic" & vbCr Dim pNombreContent As New Phrase(n) Dim pCodigo As New Phrase("Código:") Dim c As String = "1234567890" Dim pCodigoContent As New Phrase(c) cell = New Cell() cell.BorderWidth = 0 cell.SetWidth("70%") cell.AddElement(pMarca) cell.AddElement(pMarcaContent) cell.AddElement(pLinea) cell.AddElement(pLineaContent) cell.AddElement(pNombre) cell.AddElement(pNombreContent) cell.AddElement(pCodigo) cell.AddElement(pCodigoContent) TableContent.AddCell(cell) 'second row '----------------------------------------------- Dim pDescripcion As New Phrase(String.Format("Descripción General:{0}", vbCr)) Dim desc As String = "Al hablar de los antecesores de la historieta, es inevitable " & _ "nombrar a los antiguos egipcios, que representaban muchos de sus mitos en dibujos y " & _ "jeroglíficos que realizaban sobre hojas de papiro, y también hacían murales en forma de tira, " & _ "que incluían imagen y texto. Otros ejemplos son las cristaleras, el tapiz de Bayeux, las bandas que " & _ "rodean las columnas romanas conmemorativas (como la Trajana o la de Marco Aurelio), los retablos " & _ "medievales (con los que, mediante imágenes, se explicaban al pueblo historias, crímenes y sucesos " & _ "en general), los dibujos de las civilizaciones precolombinas (como los códices, pintados por los mayas y " & _ "los aztecas) e incluso las primitivas pinturas rupestres. A estos ejemplos citados se pueden agregar algunas " & _ "obras pictóricas de Hyeronnimus Bosh, Brueghel o Goya, las cuales adquieren un carácter narrativo." Dim pDescripcionContent As New Phrase(desc) cell = New Cell() cell.BorderWidth = 0 cell.Colspan = 2 cell.AddElement(pDescripcion) cell.AddElement(pDescripcionContent) TableContent.AddCell(cell) 'third row '----------------------------------------------- Dim pInformacion As New Phrase(String.Format("Información:{0}", vbCr)) Dim inf As String = "Pero quizás los antecedentes más cercanos a la historietas sean las Aucas y Aleluyas, " & _ "destinadas fundamentalmente a satisfacer las necesidades de instrucción de niños y adolescentes. " & _ "Estas publicaciones, que comenzaron a editarse en Francia a partir de 1820, se caracterizaban por narrar " & _ "pequeños cuentos y aventuras mediante ilustraciones, aunque, a diferencia de la historieta, los textos no " & _ "se integraban orgánicamente dentro de los dibujos, sino que se adicionaban a modo de explicación " & _ "complementaria al pie de los grabados. Sin embargo, la historia del cómic se relaciona más correctamente " & _ "con la de la imprenta y la caricatura. " Dim pInformacionContent As New Phrase(inf) cell = New Cell() cell.BorderWidth = 0 cell.Colspan = 2 cell.AddElement(pInformacion) cell.AddElement(pInformacionContent) TableContent.AddCell(cell) 'fourth row '----------------------------------------------- Dim miniTable As New Table(2, 1) miniTable.Width = 50 miniTable.Alignment = Table.ALIGN_LEFT miniTable.Border = 0 miniTable.BorderColor = iTextSharp.text.Color.WHITE Dim miniCell As New Cell() Dim image2 As Image = Image.GetInstance(GetApplicationPhysicalPath() & "images\" & "image2.jpg") miniCell.BorderWidth = 0 miniCell.AddElement(image2) miniTable.AddCell(miniCell) Dim image3 As Image = Image.GetInstance(GetApplicationPhysicalPath() & "images\" & "image3.gif") miniCell = New Cell() miniCell.BorderWidth = 0 miniCell.AddElement(image3) miniTable.AddCell(miniCell) cell = New Cell() cell.Colspan = 2 cell.BorderWidth = 0 cell.Add(miniTable) TableContent.AddCell(cell) document.Add(TableContent) Dim TableLine As New Table(1, 1) TableLine.Width = 100 TableLine.Border = 0 TableLine.Cellpadding = 10 TableLine.BorderColor = iTextSharp.text.Color.WHITE Dim Line As Image = Image.GetInstance(GetApplicationPhysicalPath() & "images\Line.png") cell = New Cell() cell.BorderWidth = 0 cell.AddElement(Line) TableLine.AddCell(cell) document.Add(TableLine) Dim ph As New Phrase("Contáctenos en: ") Dim a As Anchor = New Anchor("Neuronasoft", FontFactory.GetFont(FontFactory.HELVETICA, 12, Font.UNDERLINE, New Color(0, 0, 255))) a.Reference = "http://www.neuronasoft.net" document.Add(ph) document.Add(a) document.Close() HttpContext.Current.Response.ContentType = "application/pdf" HttpContext.Current.Response.Buffer = True HttpContext.Current.Response.ClearContent() HttpContext.Current.Response.ClearHeaders() HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=Comics_virtual.pdf") HttpContext.Current.Response.BinaryWrite(MStream.GetBuffer()) HttpContext.Current.Response.End() End Sub Private Function GetApplicationPhysicalPath() As String Return System.Web.HttpContext.Current.Request.PhysicalApplicationPath End Function ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return False End Get End Property End Class
Estoy adjuntando el proyecto completo, para que hagan las pruebas con un ejemplo funcionando.
Es todo, espero que les sea de utilidad
No hay comentarios.:
Publicar un comentario