SignDoc.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 GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.AcroForms
Imports GrapeCity.Documents.Text
Imports System.Security.Cryptography.X509Certificates

'' This sample demonstrates how to sign the created PDF with a .pfx file,
'' using a SignatureField.
'' The sample then loads the signed file back into another GcPdfDocument instance
'' and verifies the signature.
Public Class SignDoc
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim tf = New TextFormat() With {.Font = StandardFonts.Times, .FontSize = 14}
        page.Graphics.DrawString("Hello, World!" + vbLf +
            "Signed by DsPdfWeb SignDoc sample.",
                tf, New PointF(72, 72))

        '' Init a test certificate:
        Dim pfxPath = Path.Combine("Resources", "Misc", "DsPdfTest.pfx")
        Dim cert = New X509Certificate2(File.ReadAllBytes(pfxPath), "qq",
            X509KeyStorageFlags.MachineKeySet Or X509KeyStorageFlags.PersistKeySet Or X509KeyStorageFlags.Exportable)
        Dim sp = New SignatureProperties() With {
            .SignatureBuilder = New Pkcs7SignatureBuilder() With {.CertificateChain = New X509Certificate2() {cert}},
            .Location = "DsPdfWeb Demo Browser",
            .SignerName = "DsPdfWeb",
            .SigningDateTime = Util.TimeNow()
        }

        '' Init a signature field to hold the signature:
        Dim sf = New SignatureField()
        sf.Widget.Rect = New RectangleF(72, 72 * 2, 72 * 4, 36)
        sf.Widget.Page = page
        sf.Widget.BackColor = Color.LightSeaGreen
        sf.Widget.DefaultAppearance.Font = StandardFonts.Helvetica
        sf.Widget.ButtonAppearance.Caption = $"Signer: {sp.SignerName}{vbCrLf}Location: {sp.Location}"
        '' Add the signature field to the document:
        doc.AcroForm.Fields.Add(sf)

        '' Connect the signature field and signature props:
        sp.SignatureField = sf

        '' Sign and save the document:
        '' NOTES:
        '' - Signing and saving is an atomic operation, the two cannot be separated.
        '' - The stream passed to the Sign() method must be readable.
        doc.Sign(sp, stream)

        '' Rewind the stream to read the document just created
        '' into another GcPdfDocument and verify the signature:
        stream.Seek(0, SeekOrigin.Begin)
        Dim doc2 = New GcPdfDocument()
        doc2.Load(stream)
        Dim sf2 = DirectCast(doc2.AcroForm.Fields(0), SignatureField)
        If Not sf2.Value.VerifySignatureValue() Then
            Throw New Exception("Failed to verify the signature")
        End If
        ''
        '' Done (the generated and signed document has already been saved to 'stream').
        Return doc.Pages.Count
    End Function
End Class