SignatureAppearance.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' Copyright (c) GrapeCity inc. All rights reserved.
'' 
Imports System.IO
Imports System.Drawing
Imports GrapeCity.Documents.Drawing
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.AcroForms
Imports GrapeCity.Documents.Pdf.Graphics
Imports GrapeCity.Documents.Text
Imports System.Security.Cryptography.X509Certificates
Imports GCTEXT = GrapeCity.Documents.Text
Imports GCDRAW = GrapeCity.Documents.Drawing

'' このサンプルは、PDF を作成し、.pfx ファイルを使用して署名して、
'' 署名を表すカスタム AppearanceStream を指定する方法を示します。
'' このサンプルは、AppearanceStream を追加することを除き、 SignDoc と類似しています。
Public Class SignatureAppearance
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()
        Dim tf = New TextFormat() With {.Font = Util.getFont(), .FontSize = 12}
        page.Graphics.DrawString(
            "デジタル署名のサンプルです" + vbLf +
            "このテキストの下の位置で署名されています。" + vbLf +
            "注意:ブラウザのビルトインビューワによっては署名が表示されない場合があります。" + vbLf +
            "署名に使用している証明書はテスト用です。",
            tf, New PointF(72, 72))

        '' テスト証明書を初期化します。
        Dim pfxPath = Path.Combine("Resources", "Misc", "GcPdfTest.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 = "DioDocs for PDF サンプル",
            .SignerName = "DioDocs"
        }

        '' 署名を保持する署名フィールドを初期化します。
        Dim sf = New SignatureField()
        '' 文書に署名フィールドを追加します。
        doc.AcroForm.Fields.Add(sf)
        '' 署名フィールドと署名プロパティを結びつけます。
        sp.SignatureField = sf

        '' 署名フィールドを設定します。
        sf.Widget.Rect = New RectangleF(page.Size.Width - 72 * 4, 72 * 2, 72 * 3, 72)
        sf.Widget.Page = page
        '' ウィジェットのビジュアルプロパティは、以下で設定された sf.Widget.AppearanceStreams.Normal.Default によってオーバーライドされます。
        sf.Widget.BackColor = Color.PeachPuff
        sf.Widget.Border = New GrapeCity.Documents.Pdf.Annotations.Border() With
            {
                .Color = Color.SaddleBrown,
                .Width = 3
            }
        '' カスタム署名の外観ストリームを作成します。
        Dim rc = New RectangleF(PointF.Empty, sf.Widget.Rect.Size)
        Dim fxo = New FormXObject(doc, rc)
        rc.Inflate(-4, -4)
        fxo.Graphics.FillEllipse(rc, Color.CornflowerBlue)
        fxo.Graphics.DrawEllipse(rc, New GCDRAW.Pen(Color.RoyalBlue, 3))
        rc.Inflate(-5, -5)
        fxo.Graphics.DrawEllipse(rc, New GCDRAW.Pen(Color.LightSteelBlue, 1))
        fxo.Graphics.DrawString($"{sp.SignerName} によって署名されました{vbLf}{DateTime.Now.ToShortDateString()}",
            New TextFormat() With
            {
                .Font = Util.getFont(),
                .FontSize = 12,
                .FontItalic = True,
                .ForeColor = Color.Navy
            },
            fxo.Bounds,
            TextAlignment.Center, ParagraphAlignment.Center, False)
        sf.Widget.AppearanceStreams.Normal.Default = fxo

        '' ウィジェットの外観ストリームが使用されるように署名の外観をリセットします。
        sp.SignatureAppearance = Nothing

        '' 署名して文書を保存します。
        '' 注意:
        '' - 署名と保存は一連の操作であり、2つは分離できません。
        '' - Sign() メソッドに渡されたストリームは読み込み可能でなければなりません。
        doc.Sign(sp, stream)

        '' 終了(生成および署名された文書はすでに 'stream' に保存されています)。
        Return doc.Pages.Count
    End Function
End Class