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

'' FormFieldsサンプルで作成されたフォームを読み込み、
'' そのファイルにあるすべてのフォームフィールドをループし、
'' 入力フィールドの値を変更します。
'' 実行ログ(古い値と新しい値の記録)がフォームページに追加されます。
Public Class FillForm
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()

        '' 読み込んだ PDF を操作している間は、元のファイルストリームを開いたままにしておく必要があります。詳しくは、LoadPDF を参照してください。
        Using fs As New FileStream(Path.Combine("Resources", "PDFs", "FormFields.pdf"), FileMode.Open, FileAccess.Read)
            doc.Load(fs)
            Dim page = doc.Pages.Last
            Dim sb = New StringBuilder()
            sb.AppendLine("サンプルコードで行われた更新のログ:" + vbCrLf)

            For Each fld In doc.AcroForm.Fields
                If TypeOf fld Is CombTextField Then
                    Dim ctfld = DirectCast(fld, CombTextField)
                    sb.Append($"マス目フィールド  :  '{ctfld.Value}', ")
                    ctfld.Value = "新しいマス目フィールド"
                    sb.AppendLine($" ⇒ ⇒  '{ctfld.Value}'.")
                ElseIf TypeOf fld Is TextField Then
                    Dim tfld = DirectCast(fld, TextField)
                    sb.Append($"テキストフィールド  :  '{tfld.Value}', ")
                    tfld.Value = $"更新日時 : {DateTime.Now}"
                    sb.AppendLine($" ⇒ ⇒  '{tfld.Value}'.")
                ElseIf TypeOf fld Is CheckBoxField Then
                    Dim cfld = DirectCast(fld, CheckBoxField)
                    sb.Append($"チェックボックス  :  '{cfld.Value}', ")
                    cfld.Value = Not cfld.Value
                    sb.AppendLine($" ⇒ ⇒  '{cfld.Value}'.")
                ElseIf TypeOf fld Is RadioButtonField Then
                    Dim rbfld = DirectCast(fld, RadioButtonField)
                    sb.Append($"ラジオボタン  :  '{rbfld.Value}', ")
                    rbfld.Value = rbfld.Widgets.Count - 1
                    sb.AppendLine($" ⇒ ⇒  '{rbfld.Value}'.")
                ElseIf TypeOf fld Is ComboBoxField Then
                    Dim cmbfld = DirectCast(fld, ComboBoxField)
                    sb.Append($"コンボボックスフィールドの選択  :  '{cmbfld.Items(cmbfld.SelectedIndex).Text}', ")
                    cmbfld.SelectedIndex = cmbfld.Items.Count - 1
                    sb.AppendLine($" ⇒ ⇒  '{cmbfld.Items(cmbfld.SelectedIndex).Text}'.")
                ElseIf TypeOf fld Is ListBoxField Then
                    Dim lbfld = DirectCast(fld, ListBoxField)
                    sb.Append($"リストボックスフィールドの選択  :  '{lbfld.Items(lbfld.SelectedIndex).Text}', ")
                    lbfld.SelectedIndex = lbfld.Items.Count - 1
                    sb.AppendLine($" ⇒ ⇒  '{lbfld.Items(lbfld.SelectedIndex).Text}'.")
                ElseIf TypeOf fld Is SignatureField Then
                    Dim sfld = DirectCast(fld, SignatureField)
                    sb.AppendLine("署名フィールドが存在")
                ElseIf TypeOf fld Is PushButtonField Then
                    Dim btnfld = DirectCast(fld, PushButtonField)
                    sb.AppendLine($"ボタンフィールドが存在 '{btnfld.Widget.ButtonAppearance.Caption}' " )
                Else
                    sb.AppendLine($"その他 '{fld}' が存在/")
                End If
            Next
            '' ページの一番下に到達したことのログを追加します。
            Dim tl = New TextLayout(72) With {
                .MaxWidth = page.Size.Width,
                .MaxHeight = page.Size.Height,
                .MarginLeft = 80,
                .MarginRight = 80,
                .MarginBottom = 80,
                .ParagraphAlignment = ParagraphAlignment.Far
            }
            tl.Append(sb.ToString(), New TextFormat() With {.Font = StandardFonts.Times, .FontSize = 12})
            tl.PerformLayout(True)
            Dim rc = tl.ContentRectangle
            rc.Inflate(8, 8)
            page.Graphics.FillRectangle(rc, Color.LightYellow)
            page.Graphics.DrawRectangle(rc, Color.Orange)
            page.Graphics.DrawTextLayout(tl, PointF.Empty)
            '' PDF ドキュメントを保存します。
            doc.Save(stream)
        End Using
        ''
        Return doc.Pages.Count
    End Function
End Class