Xojo 2021r2: Novedades en PDFDocument

El lanzamiento de Xojo 2021r2 llega con nuevas mejoras, correcciones de errores y nuevas características en la clase PDFDocument; siendo por ejemplo la más destacable la capacidad de crear documentos PDF también en dispositivos iOS.

En este sentido, la principal limitación por el momento estriba en el manejo de fuentes, puesto que se recomienda restringir el uso al conjunto de tipos definidos bajo el PDF Standard 14: Times, Helvetica, Courier, ZapfDingbats y Symbols.

De esta forma se garantiza que, a la hora de compartir con otras plataformas los documentos PDF generados en iOS, estos podrán visualizarse correctamente sin que se produzcan grandes variaciones o sustituciones de las fuentes empleadas en su creación por otras.

Rotar, Escalar y Desplazar

También se ha añadido al contexto gráfico de PDFDocument los métodos que permiten rotar, escalar y desplazar tanto textos como formas. Para ello se utilizan los mismos métodos Rotate, Scale y Translate disponibles en la clase Graphics.

Por ejemplo, el siguiente fragmento de código crea un documento PDF con texto escalado, rotado y trasladado, así como una imagen (incorporada al proyecto) sobre la cual se han aplicado diferentes valores de escala y rotación:

Var d As New PDFDocument
Var g As Graphics = d.Graphics

Var p As Picture = Picture.Open(SpecialFolder.Desktop.Child("r2d2.png"))

If p <> Nil Then

g.Translate(10,20)
g.Scale(2.5,2.5)
g.Rotate(-1.57)

g.FontSize = 30
g.DrawText("Sample Text", 30, (30+g.TextWidth("Sample Text")*2.5))

g.Rotate(-1.4)

g.Scale(0.5,0.5)
g.DrawPicture(p,200+p.Width,100,138,200,0,0,p.Width,p.Height)

g.Rotate(3.14)
g.Scale(0.5,1)
g.DrawPicture(p,220,0,138,138,0,0,p.Width,p.Height)

Var f As FolderItem = SpecialFolder.Desktop.Child("RotateScaleTranslate.pdf")
d.Save(f)
f.Open

End If

Añadir Anotaciones…

Otra de las nuevas capacidades disponibles es la que nos permite ahora añadir tantas anotaciones como deseemos en la página en curso del documento PDF, utilizando para ello el método AddAnnotation.

Por ejemplo, el siguiente fragmento de código añadirá un total de cinco anotaciones de forma aleatoria en un documento PDF:

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

Var d As New PDFDocument
Var g As Graphics = d.Graphics

g.FontSize = 24
g.Bold = True

Const tHL As String = "PDFAnnotations Demo"

g.DrawText(tHL,10,40)
g.DrawLine(10,45,g.TextWidth(tHL)+10,45)

Const tBD As String = "This demo adds a total of five annotations to the PDF Document " + _
"at random positions in the page."

g.FontSize = 12
g.Bold = False

g.DrawText(tBD, 10, 80)

Var Rnd As New Random

For n As Integer = 0 To 4

d.AddAnnotation("Some example text for Annotation #" + Integer(n+1).tostring + ".", _
rnd.InRange(10,d.PageWidth), rnd.InRange(10,d.PageHeight))

Next n

Try
d.Save(f)
f.Open
Catch e As IOException
System.DebugLog(e.Message)
End Try

…y añadir Enlaces

Ahora también es posible definir tantas áreas de enlace como deseemos en la página en curso del documento PDF, utilizando para ello el método AddLinkArea. El primer parámetro se corresponderá con el enlace que se ejecutará cuando el usuario haga clic en el área activa definida; pudiendo utilizarse por ejemplo protocolos como “HTTP://”, “HTTPS://”, “mailto://”, “ftp://”, “sftp://” o incluso URIs personalizadas como puede ser el caso de las utilizadas en la aplicación Xojo Feedback: “feedback://”.

En todos los casos, cuando el usuario haga clic sobre cualquiera de las áreas activas definidas mediante AddLinkArea, se abrirá la aplicación por omisión definida por el usuario para responder a cada protocolo: navegador web, cliente de correo electrónico, cliente de FTP, etc.

Por ejemplo, el siguiente fragmento de código crea un documento PDF diferentes tipos de enlaces:

Var d As New PDFDocument
Var g As Graphics = d.Graphics

Var f As FolderItem = SpecialFolder.Desktop.Child("PDFLink Demo.pdf")

g.FontSize = 24
g.Bold = True

Const tHL As String = "PDF Links Demo"

g.DrawText(tHL,10,40)
g.DrawLine(10,45,g.TextWidth(tHL)+10,45)

Const tBD As String = "This demo adds several links to fragments (text) in the PDF page. Move the mouse pointer over the following entries:"

g.FontSize = 12
g.Bold = False

g.DrawText(tBD, 10, 70,400)

Const kFirstLinkText As String = "• Click to go to the Xojo website."
Const kSecondLinkText As String = "• Click to go to Xojo's Documentation website."
Const kThirdLinkText As String = "• Click to go to Xojo's YouTube channel."
Const kFourthLinkText As String = "• Click to send an email to hello@xojo.com."
Const kFifthLinkText As String = "• Click to open a case on Feedback app."
Const kSixthLinkText As String = "• Click here to download a file from FTP server. If asked, use 'anonymous' as the password and any password you want."

g.DrawingColor = Color.Blue

Var tHeight As Double = g.TextHeight

g.DrawText(kFirstLinkText,10,120)
// Let's add the first Link, setting the area to surround the text of the "kFirstLinkText"
d.AddLinkArea("https://www.xojo.com",10,110,g.TextWidth(kFirstLinkText), tHeight)

g.DrawText(kSecondLinkText,10,140)
// Let's add the second Link, setting the area to surround the text of the "kSecondLinkText"
d.AddLinkArea("https://docs.xojo.com",10,130,g.TextWidth(kSecondLinkText), tHeight)

g.DrawText(kThirdLinkText,10,160)
// Let's add the third Link, setting the area to surround the text of the "kThirdLinkText"
d.AddLinkArea("https://www.youtube.com/c/XojoInc",10,150,g.TextWidth(kThirdLinkText), tHeight)

g.DrawText(kFourthLinkText,10,180)
// Let's add the fourth Link, setting the area to surround the text of the "kFourthLinkText"
d.AddLinkArea("mailto:helo@xojo.com",10,170,g.TextWidth(kFourthLinkText), tHeight)

g.DrawText(kFifthLinkText,10,200)
// Let's add the fourth Link, setting the area to surround the text of the "kFifthLinkText"
d.AddLinkArea("feedback://showreport?report_id=64876",10,190,g.TextWidth(kFifthLinkText), tHeight)

g.DrawText(kSixthLinkText,10,220,400)
// Let's add the fifth Link, setting the area to surround the text of the "kSixthLinkText"
d.AddLinkArea("ftp://speedtest.tele2.net/1KB.zip",10,210, 400, tHeight*2)

Try
d.Save(f)
f.Open
Catch e As IOException
System.DebugLog(e.Message)
End Try

Cambiar a una página determinada

Del mismo modo que podemos añadir áreas de enlace, ahora también es posible crear una área activa que, una vez pulsada por el usuario en la aplicación de visor, salte a la página del documento que le indiquemos. Para ello se utiliza el método AddGotoPage.

El siguiente fragmento de código crea un documento PDF compuesto por tres páginas. Cuando el usuario hace clic sobre el elemento activo de la primera página, el visor “saltará” para mostrar la tercera página:

Var d As New PDFDocument
Var g As Graphics = d.Graphics

g.DrawText("Hello World",40,40)

d.AddGoToPageArea(3,40,40-g.TextHeight,100,40-g.TextHeight,300,400) // First parameter sets the page of the document to jump to.

g.NextPage

g.DrawText("Hello from the Second Page", 40, 40)

g.NextPage

g.DrawText("Hello from the Third Page", 40, 40)

Var f As FolderItem = SpecialFolder.Desktop.Child("JumpToPage.PDF")

d.Save(f)
f.Open

Ajustes del Visor PDF

Otra de las incorporaciones en PDFDocument es la capacidad que tenemos ahora para definir algunos de los atributos que aplicará la aplicación de visualización de documentos PDF cuando se abra el documento. Por ejemplo, podemos indicar que se abra el documento en modo de presentación (a pantalla completa, sin mostrar otros elementos de interfaz de usuario), que lo haga mostrando una o dos páginas, así como si deseamos que se muestren los previos de página del documento o bien el índice de contenidos (TOC).

No obstante, conviene indicar que dichos ajustes indicados en el documento pueden ser aplicados o no en función del visor de documentos PDF utilizado. Por ejemplo, el gratuito Acrobat Reader soporta todos los atributos que se hayan definido, mientras que otras aplicaciones puede que sólo apliquen algunos de los ajustes parcialmente.

Como ejemplo, el siguiente fragmento de código indica que se abra el documento PDF en modo de pantalla completa. Una vez se salga de dicho modo, el documento mostrará dos páginas de forma simultánea en la vista, ocultando varios de los elementos de interfaz de usuario:

Var d as New PDFDocument

Var vp As New pdf.PDFViewerOptions

vp.ToolbarVisible = False
vp.MenubarVisible = False
vp.WindowControlsVisible = True
vp.FitWindowToPage = False
vp.FullScreen = True
vp.Layout = PDFDocument.Layouts.FaceLeft
d.ViewerOptions = vp
Deja un comentario

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