Colabora
 

Crear un PDF al vuelo

Usando la librería PdfSharp

 

Fecha: 17/Abr/2008 (01-04-08)
Autor: Carlos Alberto Rivera Lara

 


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í:

Formulario de Muestra

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

 



Compromiso del autor del artículo con el sitio del Guille:

Lo comentado en este artículo está probado (y funciona) con la siguiente configuración:

El autor se compromete personalmente de que lo expuesto en este artículo es cierto y lo ha comprobado usando la configuración indicada anteriormente.

En cualquier caso, el Guille no se responsabiliza del contenido de este artículo.

Si encuentras alguna errata o fallo en algún link (enlace), por favor comunícalo usando este link:

Gracias.


Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: crivera_creapdf.zip - 47.80 KB

MD5 checksum: 21E0BBCE08F494CBF80340F49CB270AE

 


Ir al índice principal de el Guille