FormDataSubmit.vb
'' 
'' このコードは、DioDocs for PDF のサンプルの一部として提供されています。
'' © MESCIUS inc. All rights reserved.
'' 
Imports System.Drawing
Imports System.IO
Imports System.Linq
Imports System.Xml
Imports System.Text
Imports System.Collections.Generic
Imports GrapeCity.Documents.Pdf
Imports GrapeCity.Documents.Pdf.AcroForms
Imports GrapeCity.Documents.Pdf.Actions
Imports GrapeCity.Documents.Pdf.Annotations
Imports GrapeCity.Documents.Text

'' このサンプルは、サーバーに送信できる AcroForm PDF を作成します。
'' 次に、サーバーは(DsPdf v3 の新機能である)
'' GcPdfDocument.ImportFormDataFromCollection() メソッドを使用
'' して送信されたデータを同様の構造のPDFフォームを含むPDFにインポートし、
'' ユーザーが入力したデータで満たされたフォームをクライアントに送り返します。
'' 
'' 生成されたフォームフィールドのある PDF は、クライアントブラウザのデフォルトの
'' PDF ビューワに表示されることに注意してください。
'' 
'' このサンプルは現在廃止されている FormSubmitXml サンプルに似て
'' いますが、サーバー側は、クライアントフォームからデータが送信される方法に
'' 非常に類似したデータ構造を受け入れる新しい ImportFormDataFromCollection()
'' メソッドを使用するため、 そのデータを操作するためのコードは必要ありません。
'' FormSubmit サンプルも参照してください。
Public Class FormDataSubmit
    Function CreatePDF(ByVal stream As Stream) As Integer
        Dim doc = New GcPdfDocument()
        Dim page = doc.NewPage()

        Dim rc = Util.AddNote(
                "フォームのフィールドに入力し、「送信」をクリックしてサーバーに送り返します。" +
                "サンプルサーバーは GcPdfDocument.ImportFormDataFromCollection()" +
                "メソッドを使用して、送信されたデータを別の互換性のあるPDFフォームにインポートし、" +
                "入力されたフォームをブラウザに送り返します。" +
                "記入されたフォームはブラウザのデフォルトのPDFビューワで開かれ、「送信」および" +
                "「リセット」ボタンがないことに注意してください。",
                page)

        Dim g = page.Graphics
        Dim tf = New TextFormat() With {.Font = StandardFonts.Times, .FontSize = 14}
        Dim ip = New PointF(72, rc.Bottom + 36)
        Dim fldOffset = 72 * 2 + 46
        Dim fldHeight = tf.FontSize * 1.2F
        Dim dY = 32

        '' テキストフィールド。
        g.DrawString("First name:", tf, ip)
        Dim fldFirstName = New TextField() With {.Name = "FirstName", .Value = "John"}
        fldFirstName.Widget.Page = page
        fldFirstName.Widget.Rect = New RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight)
        fldFirstName.Widget.DefaultAppearance.Font = tf.Font
        fldFirstName.Widget.DefaultAppearance.FontSize = tf.FontSize
        doc.AcroForm.Fields.Add(fldFirstName)
        ip.Y += dY

        '' テキストフィールド。
        g.DrawString("Last name:", tf, ip)
        Dim fldLastName = New TextField() With {.Name = "LastName", .Value = "Smith"}
        fldLastName.Widget.Page = page
        fldLastName.Widget.Rect = New RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight)
        fldLastName.Widget.DefaultAppearance.Font = tf.Font
        fldLastName.Widget.DefaultAppearance.FontSize = tf.FontSize
        doc.AcroForm.Fields.Add(fldLastName)
        ip.Y += dY

        '' チェックボックス。
        g.DrawString("Subscribe to Mailing List:", tf, ip)
        Dim fldCheckbox = New CheckBoxField() With {.Name = "Subscribe", .Checked = True}
        fldCheckbox.Widget.Page = page
        fldCheckbox.Widget.Rect = New RectangleF(ip.X + fldOffset, ip.Y, fldHeight, fldHeight)
        doc.AcroForm.Fields.Add(fldCheckbox)
        ip.Y += dY

        '' 複数行テキストボックス。
        g.DrawString("Additional information:", tf, ip)
        Dim fldAdditionalInfo = New TextField() With {.Name = "AdditionalInfo", .Multiline = True}
        fldAdditionalInfo.Widget.Page = page
        fldAdditionalInfo.Widget.Rect = New RectangleF(ip.X + fldOffset, ip.Y, 72 * 3, fldHeight * 2)
        fldAdditionalInfo.Widget.DefaultAppearance.Font = tf.Font
        fldAdditionalInfo.Widget.DefaultAppearance.FontSize = tf.FontSize
        doc.AcroForm.Fields.Add(fldAdditionalInfo)
        ip.Y += dY * 2

        '' フォーム送信ボタン。
        Dim btnSubmit = New PushButtonField()
        btnSubmit.Widget.Rect = New RectangleF(ip.X + fldOffset, ip.Y, 72, fldHeight)
        btnSubmit.Widget.ButtonAppearance.Caption = "Submit"
        btnSubmit.Widget.Highlighting = HighlightingMode.Invert
        btnSubmit.Widget.Page = page

        '' 送信先 URL。
        btnSubmit.Widget.Activate = New ActionSubmitForm("/Samples/HandleFormDataSubmit")
        doc.AcroForm.Fields.Add(btnSubmit)

        '' フォームリセットボタン。
        Dim btnReset = New PushButtonField()
        btnReset.Widget.Rect = New RectangleF(ip.X + fldOffset + 72 * 1.5F, ip.Y, 72, fldHeight)
        btnReset.Widget.ButtonAppearance.Caption = "Reset"
        btnReset.Widget.Highlighting = HighlightingMode.Invert
        btnReset.Widget.Page = page
        btnReset.Widget.Activate = New ActionResetForm()
        doc.AcroForm.Fields.Add(btnReset)
        ip.Y += dY

        '' PDF ドキュメントを保存します。
        doc.Save(stream)
        Return doc.Pages.Count
    End Function

    '' 
    '' メモ:以下のコードは、このサンプルで準備されたフォームが送信されるときに Web サンプルブラウザ
    '' コントローラーによって使用され、CreatePDF() メソッドによって直接呼び出されることはありません。
    '' 

    '' 
    '' GcPdfDocument を作成し、AcroForm PDF をロードして、
    '' GcPdfDocument.ImportFormDataFromCollection() メソッドを使用してデータを入力します。
    '' 
    '' このメソッドは、このサンプルで準備されたフォームがユーザーによって送信されると、
    '' サンプルコントローラーによって呼び出されます。コントローラーメソッドは、受け取った
    '' IFormCollection を配列またはキー値のペアに変換します。キーはフィールド名であり、
    '' 値は文字列値のリストです。このメソッドを呼び出して、互換性のある ImportFormXML.pdf
    '' PDF フォームに値をインポートします。そのフォームはクライアントに送り返されます。
    '' 
    '' このメソッドを呼び出すコントローラーコードは次のようになります:
    '' 
    '' Public Function HandleFormDataSubmit(ByVal fields As IFormCollection) As IActionResult
    ''   Dim values = fields.ToList()
    ''   Dim fieldValues = values.Select(Function(kvp_) New KeyValuePair(Of String, IList(Of String))(kvp_.Key, kvp_.Value.ToArray())).ToArray()
    ''   Dim ms = Samples.FormDataSubmit.ImportFormData(fieldValues)
    ''   Dim result = New FileStreamResult(ms, "application/pdf")
    ''   Return result
    '' End Function
    ''     
    Shared Function ImportFormData(ByVal fieldValues As KeyValuePair(Of String, IList(Of String))()) As Stream
        Dim pdf = New GcPdfDocument()
        Using fs = New FileStream(Path.Combine("Resources", "PDFs", "ImportFormFromCollection.pdf"), FileMode.Open, FileAccess.Read)
            '' 互換性のある空のフォームをロードします。
            pdf.Load(fs)
            '' 送信されたデータをインポートします。
            pdf.ImportFormDataFromCollection(fieldValues)
            '' PDF ドキュメントを保存します。
            Dim outMs = New MemoryStream()
            pdf.Save(outMs)
            outMs.Seek(0, SeekOrigin.Begin)
            Return outMs
        End Using
    End Function
End Class