'''' This code is part of Document Solutions for PDF .NET demos.'' Copyright (c) MESCIUS inc. All rights reserved.''ImportsSystem.DrawingImportsSystem.IOImportsSystem.LinqImportsSystem.XmlImportsSystem.TextImportsSystem.Collections.GenericImportsGrapeCity.Documents.PdfImportsGrapeCity.Documents.Pdf.AcroFormsImportsGrapeCity.Documents.Pdf.ActionsImportsGrapeCity.Documents.Pdf.AnnotationsImportsGrapeCity.Documents.Text '' This sample creates an AcroForm PDF that can be submitted to the server.'' The server then uses the (New in DsPdf v3) GcPdfDocument.ImportFormDataFromCollection()'' method to import the submitted data into a PDF that contains a similarly structured'' PDF form, And sends the form filled with user provided data back to the client.'''' Note that the produced PDF with filled form fields'' Is shown in the client browser's default PDF viewer.'''' This sample Is similar to the now obsolete FormSubmitXml sample,'' but the server side Is much simpler as it uses the New ImportFormDataFromCollection()'' method that accepts a data structure very similar to how data Is sent from the client form,'' so almost no code Is needed to manipulate that data.'' See also the FormSubmit sample.PublicClassFormDataSubmitFunctionCreatePDF(ByVal stream AsStream) AsIntegerDim doc = NewGcPdfDocument()Dim page = doc.NewPage() Dim rc = Util.AddNote("Fill the fields in the form and click 'Submit' to send it back to the server. " +"The sample server will use the GcPdfDocument.ImportFormDataFromCollection() method " +"to import the submitted data into a different but compatible PDF form, " +"and the filled form will be sent back to your browser. " +"Note that the filled form is opened in the browser's default PDF viewer, " +"and does not have the 'Submit' and 'Reset' buttons.", page) Dim g = page.GraphicsDim tf = NewTextFormat() With {.Font = StandardFonts.Times, .FontSize = 14}Dim ip = NewPointF(72, rc.Bottom + 36)Dim fldOffset = 72 * 2 + 46Dim fldHeight = tf.FontSize * 1.2FDim dY = 32 '' Text field g.DrawString("First name:", tf, ip)Dim fldFirstName = NewTextField() With {.Name = "FirstName", .Value = "John"} fldFirstName.Widget.Page = page fldFirstName.Widget.Rect = NewRectangleF(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 '' Text field g.DrawString("Last name:", tf, ip)Dim fldLastName = NewTextField() With {.Name = "LastName", .Value = "Smith"} fldLastName.Widget.Page = page fldLastName.Widget.Rect = NewRectangleF(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 '' Checkbox g.DrawString("Subscribe to Mailing List:", tf, ip)Dim fldCheckbox = NewCheckBoxField() With {.Name = "Subscribe", .Checked = True} fldCheckbox.Widget.Page = page fldCheckbox.Widget.Rect = NewRectangleF(ip.X + fldOffset, ip.Y, fldHeight, fldHeight) doc.AcroForm.Fields.Add(fldCheckbox) ip.Y += dY '' Multiline TextBox g.DrawString("Additional information:", tf, ip)Dim fldAdditionalInfo = NewTextField() With {.Name = "AdditionalInfo", .Multiline = True} fldAdditionalInfo.Widget.Page = page fldAdditionalInfo.Widget.Rect = NewRectangleF(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 '' Submit form button:Dim btnSubmit = NewPushButtonField() btnSubmit.Widget.Rect = NewRectangleF(ip.X + fldOffset, ip.Y, 72, fldHeight) btnSubmit.Widget.ButtonAppearance.Caption = "Submit" btnSubmit.Widget.Highlighting = HighlightingMode.Invert btnSubmit.Widget.Page = page '' The URL for the submission btnSubmit.Widget.Activate = NewActionSubmitForm("/Samples/HandleFormDataSubmit") doc.AcroForm.Fields.Add(btnSubmit) '' Reset form button:Dim btnReset = NewPushButtonField() btnReset.Widget.Rect = NewRectangleF(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 = NewActionResetForm() doc.AcroForm.Fields.Add(btnReset) ip.Y += dY '' Done doc.Save(stream)Return doc.Pages.CountEndFunction '''' NOTE: the code below Is used by the web sample browser controller When the form'' prepared by this sample Is submitted, it Is Not directly called by the CreatePDF() method.'' '' Creates a GcPdfDocument, loads an AcroForm PDF into it, And fills it with data'' using the GcPdfDocument.ImportFormDataFromCollection() method.'''' This method Is called by the samples controller when the form prepared by this sample'' Is submitted by the user. The controller method converts the IFormCollection that it'' receives to an array Or key value pairs, where keys are field names And values are'' lists of string values, then calls this method to import the values into the'' compatible ImportFormXML.pdf PDF form. That form Is then sent back to the client.'''' The controller code that calls this method looks Like this:'''' 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 FunctionSharedFunctionImportFormData(ByVal fieldValues AsKeyValuePair(OfString, IList(OfString))()) AsStreamDim pdf = NewGcPdfDocument()Using fs = NewFileStream(Path.Combine("Resources", "PDFs", "ImportFormFromCollection.pdf"), FileMode.Open, FileAccess.Read)'' Load compatible empty form: pdf.Load(fs)'' Import submitted data: pdf.ImportFormDataFromCollection(fieldValues)'' Done:Dim outMs = NewMemoryStream() pdf.Save(outMs) outMs.Seek(0, SeekOrigin.Begin)Return outMsEndUsingEndFunctionEndClass