StampImage.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 GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.Annotations
Imports GrapeCity.Documents.Pdf.Graphics
Imports GrapeCity.Documents.Drawing
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing

'' This sample demonstrates how to add a custom appearance stream
'' to an annotation using a FormXObject.
'' In the sample, an existing PDF is loaded, and then we loop over
'' the document's pages. On each page, a StampAnnotation is created, and a FormXObject
'' which is assigned to the annotation's normal default appearance stream.
'' A semi-transparent PNG image is then drawn on the FormXObject's
'' Graphics using regular GcGraphics features (Transform and DrawImage).
Public Class StampImage
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()

        '' Load an existing PDF to which we will add a stamp annotation
        '' (see LoadPDF for details on loading documents):
        Dim jsFile = Path.Combine("Resources", "PDFs", "The-Rich-History-of-JavaScript.pdf")
        Using fs = New FileStream(jsFile, FileMode.Open, FileAccess.Read)
            doc.Load(fs)
            Dim rect = New RectangleF(PointF.Empty, doc.Pages(0).Size)

            '' Create a FormXObject to use as the stamp appearance:
            Dim fxo = New FormXObject(doc, rect)
            '' Get an image from the resources, and draw it on the FormXObject's graphics
            '' (see Transformations for details on using GcGraphics.Transform):
            Dim img = GCDRAW.Image.FromFile(Path.Combine("Resources", "ImagesBis", "draft-copy-450x72.png"))
            Dim center = New Vector2(fxo.Bounds.Width / 2, fxo.Bounds.Height / 2)
            fxo.Graphics.Transform =
                Matrix3x2.CreateRotation((-55 * Math.PI) / 180.0F, center) *
                Matrix3x2.CreateScale(6, center)
            fxo.Graphics.DrawImage(img, fxo.Bounds, Nothing, ImageAlign.CenterImage)

            '' Loop over pages, add a stamp to each page:
            For Each page In doc.Pages
                '' Create a StampAnnotation over the whole page:
                Dim stamp = New StampAnnotation() With
                    {
                        .Icon = StampAnnotationIcon.Draft.ToString(),
                        .Name = "draft",
                        .page = page,
                        .rect = rect,
                        .UserName = "Jaime Smith"
                    }
                '' Re-use the same FormXObject on all pages:
                stamp.AppearanceStreams.Normal.Default = fxo
            Next
            ''
            doc.Save(stream)
        End Using
        '' Done:
        Return doc.Pages.Count
    End Function
End Class