Xojo 2020r1: ¡Documentos PDF desde código!

Xojo 2020r1 supone la primera iteración de una de las características más demandadas por los usuarios durante años: la capacidad de crear documentos PDF directamente desde código… y hacerlo utilizando los mismos métodos y propiedades que ya conoces de la clase Graphics. En concreto, podrás crear documentos compatibles con el estándar PDF 1.4.

Y aunque somos conscientes de que aun quedan muchas características por incorporar (entre ellas Object2D, o el soporte tipográfico Unicode, por ejemplo), estas irán viendo la luz en sucesivas revisiones de Xojo.

Sin embargo, estamos convencidos de que las capacidades actuales permiten cubrir gran parte de las necesidades que puedes tener a la hora de crear tus documentos PDF, tanto en Desktop como en Web y aplicaciones de Consola (el soporte para iOS llegará más adelante, una vez que esté implementado el soporte de la API 2.0 en dicha plataforma).

Adicionalmente, tanto el texto como las formas geométricas que incorpores a tus documentos PDF lo harán de forma vectorial (excepto a la hora de generar documentos PDF a partir de reportes, por el momento generados como mapas de bits y que se modificará próximamente). Esto significa que tanto el texto se verá perfectamente a cualquier nivel de ampliación del PDF; además de que cualquier visor de documento PDF podrá realizar búsquedas sobre textos y también detectar tipos de datos concretos como números telefónicos o direcciones, por ejemplo (tal y como es el caso en macOS).

Crear nuestro primer PDF

Como en cualquier otra clase del Framework, todo empieza creando una nueva instancia del documento. Para ello, puedes utilizar:

Var MyPDF As New PDFDocument

En cuyo caso se utilizará el constructor por omisión generando un documento con una página en blanco con un tamaño Letter.

Si quieres utilizar cualquier otro tamaño de página, puedes utilizar cualquiera de los valores de Enumeración disponibles, como por ejemplo:

Var MyPDF As New PDFDocument(PDFDocument.PageSizes.A4)

O bien crear un documento con cualquier tamaño arbitrario:

Var MyPDF As New PDFDocument(500, 500)

De modo que en este caso se creará un documento con un tamaño de 500 píxeles de ancho por 500 píxeles de altura.

Dibujar en la página del documento

Actualmente puedes incorporar en tus documentos PDF tanto texto como imágenes y algunas de las formas geométricas más comunes: líneas, rectángulos y círculos (estos dos últimos en sus variantes rellenas o de contorno). Para ello, puedes utilizar los mismos métodos y propiedades tal y como venías utilizando a la hora de dibujar sobre la clase Graphics.

Por ejemplo, el siguiente fragmento de código dibujará un círculo centrado sobre la página:

Var g As Graphics = MyPDF.Graphics

g.DrawingColor = &C00ff00

Var X, Y As Integer

Var size As Integer = 200
Var offset As Integer = size/2
x = MyPDF.Graphics.Width/2
y = MyPDF.Graphics.Height/2

g.FillOval(x-offset,y-offset,size,size)

Y el siguiente fragmento incorporará el texto “Hello PDF World” centrado sobre la página y sobre el círculo dibujado previamente:

Var HelloWorld As String = "Hello PDF World"

g.FontUnit = FontUnits.Pixel
g.FontSize = 20
g.Bold = True
g.DrawingColor = &cffffff

Var textWidth As Integer = g.TextWidth(HelloWorld) / 2
Var textHeight As Integer = (g.TextHeight / 2) - g.FontAscent

g.DrawText(helloworld, x-textWidth, y-textHeight)

Añadir nuevas páginas al documento

Para añadir una nueva página al documento PDF sólo has de llamar al método Next sobre el contexto gráfico:

g.NextPage

Lo que significa que todo el dibujado que se realice a partir de ese momento se hará sobre la nueva página. Por ejemplo, utilicemos un texto largo para que aparezca centrado sobre la página (el típico “Lorem Ipsum”, indicado en este caso por la constante kLoremIpsun):

Var textWrap As Integer = 200

x = g.Width/2 - textWrap/2
g.FontSize = 10
g.Bold = False
g.DrawingColor = &c000000
g.DrawText(kLoremIpsum,x, 20, 200)

En este punto, el documento PDF tendrá el aspecto mostrado en la siguiente imagen:

Añadir Imágenes

Digamos que hemos añadido la imagen “Trees” a nuestro proyecto; de modo que podremos dibujarla sobre la página de nuestro documento en la posición deseada y con un tamaño de 50 x 50 píxeles utilizando la siguiente sintaxis:

g.DrawPicture(Arboles, 20, 20, 50, 50)
g.drawpicture(Arboles, g.width-70, 20, 50,50)

Metadatos

Como en cualquier otro documento PDF, también podrás definir una serie de metadatos a los documentos generados. Por ejemplo:

MyPDF.Author = "Xojo Developer"
MyPDF.Creator = "My Fancy App"
MyPDF.Title = "PDF Document"
MyPDF.Subject = "My First PDF Document"
MyPDF.Keywords = "Xojo, PDF, Code, Multiplatform”

Una vez hayas guardado el documento a disco, esta información será visible como parte de las propiedades del PDF, en este caso utilizando la aplicación Vista Previa en macOS.

Guardar el documento PDF

Para guardar los documentos creados en Xojo, sólo necesitarás contar con una instancia válida a un FolderItem y llamar posteriormente al método Save sobre la instancia de tu documento PDF pasando el FolderItem como parámetro. Por ejemplo:

Var f As FolderItem = SpecialFolder.Desktop.Child("MyPDF.pdf")
MyPDF.Save(f)

f.Open

En este caso, la última línea se encargará de abrir el documento PDF guardado a disco mediante la aplicación definida por omisión en el sistema operativo para abrir este tipo de documentos.

Ejemplos Incluidos

Si bien estos son sólo algunos aspectos básicos, te animo a que eches un vistazo dentro de la carpeta Examples > PDF en la distribución de Xojo. Aquí encontrarás, por ejemplo, como puedes generar documentos PDF que muestren el mismo aspecto tanto en un contexto gráfico normal como en el PDF generado a partir de los contenidos en una base de datos (Eddies Electronics) tanto en Desktop como en Web, o bien tomando como fuente de datos el proporcionado por tu propia aplicación; así como las capacidades para generar diseños de página donde el texto y las imágenes sean los principales elementos.

Como muestra, estas son algunas de las imágenes correspondientes a los documentos PDF generados por algunos de estos ejemplos:

El futuro

Como indicaba al principio, llegarán más características en próximas releases… ¡y también sabemos todas las posibilidades que ofrecen los documentos PDF! Por tanto, ten paciencia y próximamente verás como todas ellas se irán incorporando, la capacidad de cifrar los documentos PDF generados, soporte de enlaces y marcadores, ¡y mucho más!

Un comentario en “Xojo 2020r1: ¡Documentos PDF desde código!

  1. Hernan janeiro

    Hola muy bueno puedo crear el pdf me soluciona un monton de cosas, solo no me funciona la linea
    f.open
    wpTest.btnPDF.Pressed, line 41
    Type “FolderItem” has no member named “open”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *