lunes, 15 de febrero de 2010

Crear PDF con Visual Studio 2005

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

No hay comentarios:

Publicar un comentario