FillForm.vb
''
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' © MESCIUS 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.Checked}', ")
cfld.Checked = Not cfld.Checked
sb.AppendLine($" ⇒ ⇒ '{cfld.Checked}'.")
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 = Util.getFont(), .FontSize = 10})
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