'''' This code is part of Document Solutions for PDF .NET demos.'' Copyright (c) MESCIUS inc. All rights reserved.''ImportsSystem.IOImportsSystem.DrawingImportsGrapeCity.Documents.PdfImportsGrapeCity.Documents.Pdf.AcroFormsImportsGrapeCity.Documents.Pdf.GraphicsImportsGrapeCity.Documents.TextImportsSystem.Security.Cryptography.X509CertificatesImports GCDRAW = GrapeCity.Documents.Drawing '' This sample demonstrates how to create and sign a PDF with a .pfx file,'' specifying a custom AppearanceStream to represent the signature.'' This sample is similar to SignDoc, except that it adds the AppearanceStream.PublicClassSignatureAppearanceFunctionCreatePDF(ByVal stream AsStream) AsIntegerDim doc = NewGcPdfDocument()Dim page = doc.NewPage()Dim tf = NewTextFormat() With {.Font = StandardFonts.Times, .FontSize = 14} page.Graphics.DrawString("Hello, World!" + vbLf +"Signed by DsPdfWeb SignatureAppearance sample.", tf, NewPointF(72, 72)) '' Init a test certificate:Dim pfxPath = Path.Combine("Resources", "Misc", "DsPdfTest.pfx")Dim cert = NewX509Certificate2(File.ReadAllBytes(pfxPath), "qq",X509KeyStorageFlags.MachineKeySetOrX509KeyStorageFlags.PersistKeySetOrX509KeyStorageFlags.Exportable)Dim sp = NewSignatureProperties() With { .SignatureBuilder = NewPkcs7SignatureBuilder() With { .CertificateChain = NewX509Certificate2() {cert} }, .Location = "DsPdfWeb Demo Browser", .SignerName = "DsPdfWeb", .SigningDateTime = Util.TimeNow() } '' Create a signature field to hold the signature:Dim sf = NewSignatureField()'' Add the signature field to the document: doc.AcroForm.Fields.Add(sf)'' Connect the signature field and signature props: sp.SignatureField = sf '' Set up the signature field: sf.Widget.Rect = NewRectangleF(page.Size.Width - 72 * 4, 72 * 2, 72 * 3, 72) sf.Widget.Page = page'' Widget visual props will be overridden by sf.Widget.AppearanceStreams.Normal.Default set below: sf.Widget.BackColor = Color.PeachPuff sf.Widget.Border = NewGrapeCity.Documents.Pdf.Annotations.Border() With { .Color = Color.SaddleBrown, .Width = 3 } sf.Widget.ButtonAppearance.Caption = $"Signer: {sp.SignerName}{vbLf}Location: {sp.Location}"'' Create custom signature appearance stream:Dim rc = NewRectangleF(PointF.Empty, sf.Widget.Rect.Size)Dim fxo = NewFormXObject(doc, rc) rc.Inflate(-4, -4) fxo.Graphics.FillEllipse(rc, Color.CornflowerBlue) fxo.Graphics.DrawEllipse(rc, NewGCDRAW.Pen(Color.RoyalBlue, 3)) rc.Inflate(-5, -5) fxo.Graphics.DrawEllipse(rc, NewGCDRAW.Pen(Color.LightSteelBlue, 1)) fxo.Graphics.DrawString($"Signed by {sp.SignerName}{vbLf}on {Util.TimeNow():yyyy-MM-dd}.",NewTextFormat() With { .FontName = "Times New Roman", .FontSize = 14, .FontItalic = True, .ForeColor = Color.Navy }, fxo.Bounds,TextAlignment.Center, ParagraphAlignment.Center, False) sf.Widget.AppearanceStreams.Normal.Default = fxo '' Reset signature appearance so that the widget appearance stream is used: sp.SignatureAppearance = Nothing '' 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) '' Done (the generated and signed docment has already been saved to 'stream').Return doc.Pages.CountEndFunctionEndClass