Introducción
Hola a todos, esta es mi primera contribución...., y espero que no sea la ultima,
además espero que sea de utilidad. En
muchas ocasiones se nos ha pedido que generemos algún reporte o informe
en formato pdf, pues bien aquí hay un pequeño ejemplo de lo que se
puede hacer con esta librería, que a decir verdad aunque no tiene
una buena documentación, si tiene una buena cantidad de ejemplos (en
c#), de los cuales me aproveche para hacer este ejercicio (je, je, je). Cabe decir que lo expuesto
aquí, es solo una mínima parte de lo que puede hacer esta librería. Generación del pdf
Antes que nada debemos descargar la librería PdfSharp, la pueden encontrar en sourceforge,
además debe registrarla en el proyecto. Nota:
Esta librería viene en un archivo comprimido, el cual trae la librería,
además de los ejemplos, por lo tanto no queda registrada en el GAC, así
que hay que registrarla manualmente.
Para este ejercicio crearemos un proyecto, y en formulario creamos 4 TextBox
así: Los nombres de los TextBox son: txTitulo txMarca txTexto txImagen Pero
como creo que es mejor la acción a las palabras (por no decir que soy
malo para hablar o escribir), entonces vamos a lo que vinimos.
El código:A continuación sigue código en Visual Basic. el
formulario de muestra
Imports System.IO
Imports PdfSharp Imports PdfSharp.Pdf Imports PdfSharp.Pdf.IO Imports PdfSharp.Drawing Imports PdfSharp.Drawing.Layout Public Partial Class MainForm Public Sub New() ' The Me.InitializeComponent call is required for Windows Forms designer support. Me.InitializeComponent() ' ' TODO : Add constructor code after InitializeComponents ' End Sub Sub MainFormLoad(ByVal sender As Object, ByVal e As EventArgs) txImagen.Text = application.StartupPath & "\imagen.jpg" End Sub Sub BtGenerarClick(ByVal sender As Object, ByVal e As EventArgs) If String.IsNullOrEmpty(txTitulo.Text) Then messagebox.Show("Digite un titulo para el archivo") Return End If If String.IsNullOrEmpty(txMarca.Text) Then messagebox.Show("Digite un texto para la marca de agua") Return End If If String.IsNullOrEmpty(txTexto.Text) Then messagebox.Show("digite un texto cualquiera") Return End if If String.IsNullOrEmpty(tximagen.Text) Then messagebox.Show("digite o seleccione un archivo de imagen") Return End If Dim Documento As PdfDocument = New PdfDocument ' Crea el documento Pdf Dim pagina As PdfPage = Documento.AddPage ' Crea una pagina vacia Dim FteNormal As XFont = New XFont("Arial", 10, XFontStyle.Regular) ' Crea la fuente Dim FteNegrilla as XFont = New XFont("Arial", 15, XFontStyle.Bold) ' Crea la fuente pagina.Size = PageSize.Letter pagina.Orientation = PageOrientation.Portrait Dim pgfx As XGraphics = XGraphics.FromPdfPage(pagina) ' Crea un Objeto XGraphics Dim tf As XTextFormatter ' Objeto para formatear texto Dim Archivo As String = Application.StartupPath & "Prueba.pdf" 'Escribimos el titulo Dim rect As New XRect(15,15,585,20) pgfx.DrawString(txTitulo.Text,FteNegrilla,xBrushes.Black,rect,XStringFormat.Center) 'escribimos el texto tf = New XTextFormatter(pgfx) tf.Alignment = XParagraphAlignment.Justify rect = New XRect(15,45,585,60) tf.DrawString(txTexto.Text,FteNormal,Xbrushes.Black,rect) 'Escribimos el "Hola Mundo" pgfx.DrawString("Hola Mundo! ....",FteNormal,XBrushes.Black,150,150) 'Insertamos un cuadro rect = New XRect(50,200,100,50) Dim pen As XPen = New XPen(XColor.FromArgb(0,0,0)) Dim elipse As XSize elipse.Height = 10 elipse.Width = 10 pgfx.DrawRoundedRectangle(pen,rect,elipse) 'Insertamos un cuadro con color interno rect = New XRect(200,200,100,50) pgfx.DrawRoundedRectangle(pen, Xbrushes.Aqua ,rect,elipse) 'Insertamos la imagen en una hoja nueva If File.Exists(txImagen.Text) Then pagina = Documento.AddPage pagina.Size = pagesize.Letter pgfx = XGraphics.FromPdfPage(pagina) Dim imagen As XImage = XImage.FromFile(txImagen.Text) pgfx.DrawImage(imagen, 50, 150, 500, 375) End If Try 'si el archivo esta abierto da error 'para que averiguen como saber si ela rchivo esta abierto y cerrarlo ' antes de grabar uno nuevo Documento.Save(Archivo) Catch ex As Exception End Try Dim rot(3) As Double rot(0) = 1.5 rot(1) = 2 rot(2) = 100 rot(3) = 8 PoneMarcaAgua(Archivo,txMarca.Text,rot) Process.Start(Archivo) End Sub Public Sub PoneMarcaAgua(ByVal FileName As String, ByVal Texto As String, byval rotacion() As Double) Dim watermark As String = Texto Const emSize As Integer = 75 ' Crea la fuente Dim font As New XFont("Times", emSize, XFontStyle.Italic) ' Abre el pdf existente Dim document As PdfDocument = PdfReader.Open(filename) ' fija la version a PDF 1.4 (Acrobat 5) ya que usamos transparencia If document.Version < 14 Then document.Version = 14 End If For idx As Integer = 0 To document.Pages.Count - 1 Dim page As PdfPage = document.Pages(idx) ' Crea el XGrafics para el dibujo Dim gfx As XGraphics = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Prepend) Dim size As XSize = gfx.MeasureString(watermark, font) gfx.TranslateTransform(gfx.PageSize.Width / rotacion(0), gfx.PageSize.Height / rotacion(1)) gfx.RotateTransform(-Math.Atan(gfx.PageSize.Height / gfx.PageSize.Width) * 180 / Math.PI) gfx.TranslateTransform(-gfx.PageSize.Width / rotacion(2), -gfx.PageSize.Height / rotacion(3))
Dim path As New XGraphicsPath() path.AddString(watermark, font.FontFamily, XFontStyle.Italic, 75, _ New XPoint((page.Width.Centimeter - size.Width) / 2, _ (page.Height.Centimeter - size.Height) / 2), _ XStringFormat.Default) Dim pen As New XPen(XColor.FromArgb(128, 255, 150, 150), 2) gfx.DrawPath(pen, path) Next document.Save(filename) End Sub End Class
Como se puede observar en el código, el objeto principal del pdf es
el XGraphics, el cual tiene los métodos DrawString, DrawImage,
Draw....., para insertar lo que se requiera en nuestro documento Nota: Hay
que aclarar el ide que uso es SharpDevelop en su versión 2.2.1.2648,
también lo compile con visual studio 2005 y funcionó igual
Espacios de nombres usados en el código de este artículo:
Imports System.IO System.Windows.Forms Imports PdfSharp Imports PdfSharp.Pdf Imports PdfSharp.Pdf.IO Imports PdfSharp.Drawing Imports PdfSharp.Drawing.Layout
|