PageFormXObject.vb
'' '' This code is part of Document Solutions for PDF demos. '' Copyright (c) MESCIUS inc. All rights reserved. '' Imports System.IO Imports System.Drawing Imports System.Numerics Imports System.Collections.Generic Imports System.Linq Imports GrapeCity.Documents.Text Imports GrapeCity.Documents.Drawing Imports GrapeCity.Documents.Pdf Imports GrapeCity.Documents.Pdf.Annotations Imports GrapeCity.Documents.Pdf.Graphics '' This sample shows how to create FormXObject representing a page '' from a PDF loaded into a temporary GcPdfDocument, and render that '' object into the current document. Public Class PageFormXObject Function CreatePDF(ByVal stream As Stream) As Integer Dim doc = New GcPdfDocument() Dim page = doc.NewPage() Dim g = page.Graphics Dim rc = Util.AddNote( "The thumbnails below are pages from an existing document. " + "We load an arbitrary PDF into a temporary GcPdfDocument, " + "then create a FormXObject representing each of its pages, " + "and render those objects as thumbnails into the current document. " + "To show that the same FormXObject can be used more than once, " + "we also render each thumbnail a second time applying a mirror transform.", page) '' Layout params: Dim margin = rc.Left Dim pad = 36 Dim side = (page.Size.Width - margin * 2 - pad) / 2 Dim ip = New PointF(margin, rc.Bottom + pad) '' Mirror transform: Dim tr = Matrix3x2.CreateScale(-1, 1) * Matrix3x2.CreateTranslation(page.Size.Width, 0) '' Text format for the overlaid page captions: Dim clr = Color.DarkRed Dim tf = New TextFormat() With { .Font = StandardFonts.HelveticaBold, .FontSize = 16, .ForeColor = Color.FromArgb(128, clr) } '' Open an arbitrary PDF, load it into a temp document and loop over its pages, '' drawing each into the current document: Using fs = New FileStream(Path.Combine("Resources", "PDFs", "Wetlands.pdf"), FileMode.Open, FileAccess.Read) Dim doc1 = New GcPdfDocument() doc1.Load(fs) '' Create a list of FormXObject for the pages of the loaded PDF: Dim fxos = New List(Of FormXObject)() doc1.Pages.ToList().ForEach(Sub(p_) fxos.Add(New FormXObject(doc, p_))) '' Render the thumbnails into the current document: For i = 0 To fxos.Count - 1 If (ip.Y + side > page.Size.Height - margin) Then page = doc.NewPage() g = page.Graphics ip = New PointF(margin, margin) End If Dim rcfx = New RectangleF(ip.X, ip.Y, side, side) '' Draw direct: g.DrawForm(fxos(i), rcfx, Nothing, ImageAlign.ScaleImage) g.DrawRectangle(rcfx, clr) g.DrawString($"Page {i + 1}", tf, rcfx, TextAlignment.Center, ParagraphAlignment.Center, False) '' Draw reversed: g.Transform = tr g.DrawForm(fxos(i), rcfx, Nothing, ImageAlign.ScaleImage) g.DrawRectangle(rcfx, clr) g.Transform = Matrix3x2.Identity rcfx.Offset(side + pad, 0) g.DrawString($"Reversed page {i + 1}", tf, rcfx, TextAlignment.Center, ParagraphAlignment.Center, False) '' ip.Y += side + pad Next End Using '' Done: doc.Save(stream) Return doc.Pages.Count End Function End Class