Read PDF interactive form fields in C# and VB.NET
GemBox.Pdf supports reading PDF interactive form fields.
An interactive form in GemBox.Pdf is represented by a PdfInteractiveForm
class and can be accessed via the Form property of the PdfDocument
class. The base class of all PDF fields is a PdfField
and can be accessed via the Fields property of the PdfInteractiveForm
class.
The following example shows how you can read all PDF interactive form fields, their type, name, value, and other properties, in a PDF document.

using System;
using System.Globalization;
using System.IO;
using System.Linq;
using GemBox.Pdf;
using GemBox.Pdf.Forms;
class Program
{
static void Main()
{
// If using the Professional version, put your serial key below.
ComponentInfo.SetLicense("FREE-LIMITED-KEY");
var writer = new StringWriter(CultureInfo.InvariantCulture);
string format = "{0,-16}|{1,20}|{2,-20}|{3,-20}|{4,-20}", separator = new string('-', 100);
// Write the header.
writer.WriteLine("Document contains the following form fields:");
writer.WriteLine();
writer.WriteLine(format,
"Type",
'"' + "Name" + '"',
"Value",
"ExportValue/Choice",
"Checked/Selected");
writer.WriteLine(separator);
PdfFieldType? fieldType;
string fieldName, fieldExportValueOrChoice;
object fieldValue;
bool? fieldCheckedOrSelected;
using (var document = PdfDocument.Load("%InputFileName%"))
// Group fields by name because all fields with the same name are actually different representations (widget annotations) of the same field.
// Radio button fields are usually grouped. Other field types are rarely grouped.
foreach (var fieldGroup in document.Form.Fields.GroupBy(field => field.Name))
{
var field = fieldGroup.First();
fieldType = field.FieldType;
fieldName = '"' + field.Name + '"';
fieldValue = field.Value;
foreach (var widgetField in fieldGroup)
{
switch (widgetField.FieldType)
{
case PdfFieldType.CheckBox:
case PdfFieldType.RadioButton:
// Check box and radio button are toggle button fields.
var toggleField = (PdfToggleButtonField)widgetField;
fieldExportValueOrChoice = toggleField.FieldType == PdfFieldType.CheckBox ?
((PdfCheckBoxField)toggleField).ExportValue :
((PdfRadioButtonField)toggleField).Choice;
fieldCheckedOrSelected = toggleField.Checked;
writer.WriteLine(format,
fieldType,
fieldName,
fieldValue,
fieldExportValueOrChoice,
fieldCheckedOrSelected);
break;
case PdfFieldType.ListBox:
case PdfFieldType.Dropdown:
// List box and drop-down are choice fields.
var choiceField = (PdfChoiceField)widgetField;
// List box can have multiple values if multiple selection is enabled.
if (fieldValue is string[] fieldValues)
fieldValue = string.Join(", ", fieldValues);
for (int itemIndex = 0; itemIndex < choiceField.Items.Count; ++itemIndex)
{
fieldExportValueOrChoice = choiceField.Items[itemIndex].ExportValue ?? choiceField.Items[itemIndex].Value;
fieldCheckedOrSelected = choiceField.FieldType == PdfFieldType.ListBox ?
((PdfListBoxField)choiceField).SelectedIndices.Contains(itemIndex) :
((PdfDropdownField)choiceField).SelectedIndex == itemIndex;
writer.WriteLine(format,
fieldType,
fieldName,
fieldValue,
fieldExportValueOrChoice,
fieldCheckedOrSelected);
// Write the field type, field name, and field value just once for a field group.
fieldType = null;
fieldName = null;
fieldValue = null;
}
break;
default:
// Text field may contain multiple lines of text, if enabled.
if (widgetField.FieldType == PdfFieldType.Text && ((PdfTextField)widgetField).MultiLine && fieldValue != null)
fieldValue = ((string)fieldValue).Replace("\r", "\\r");
fieldExportValueOrChoice = null;
fieldCheckedOrSelected = null;
writer.WriteLine(format,
fieldType,
fieldName,
fieldValue,
fieldExportValueOrChoice,
fieldCheckedOrSelected);
break;
}
// Write the field type, field name, and field value just once for a field group.
fieldType = null;
fieldName = null;
fieldValue = null;
}
writer.WriteLine(separator);
}
Console.Write(writer.ToString());
}
}
Imports System
Imports System.Globalization
Imports System.IO
Imports System.Linq
Imports GemBox.Pdf
Imports GemBox.Pdf.Forms
Module Program
Sub Main()
' If using the Professional version, put your serial key below.
ComponentInfo.SetLicense("FREE-LIMITED-KEY")
Dim writer = New StringWriter(CultureInfo.InvariantCulture)
Dim format As String = "{0,-16}|{1,20}|{2,-20}|{3,-20}|{4,-20}", separator As String = New String("-"c, 100)
' Write the header.
writer.WriteLine("Document contains the following form fields:")
writer.WriteLine()
writer.WriteLine(format,
"Type",
""""c & "Name" & """"c,
"Value",
"ExportValue/Choice",
"Checked/Selected")
writer.WriteLine(separator)
Dim fieldType As PdfFieldType?
Dim fieldName, fieldExportValueOrChoice As String
Dim fieldValue As Object
Dim fieldCheckedOrSelected As Boolean?
Using document = PdfDocument.Load("%InputFileName%")
' Group fields by name because all fields with the same name are actually different representations (widget annotations) of the same field.
' Radio button fields are usually grouped. Other field types are rarely grouped.
For Each fieldGroup In document.Form.Fields.GroupBy(Function(field) field.Name)
Dim field = fieldGroup.First()
fieldType = field.FieldType
fieldName = """"c + field.Name + """"c
fieldValue = field.Value
For Each widgetField In fieldGroup
Select Case widgetField.FieldType
Case PdfFieldType.CheckBox,
PdfFieldType.RadioButton
' Check box and radio button are toggle button fields.
Dim toggleField = CType(widgetField, PdfToggleButtonField)
fieldExportValueOrChoice = If(toggleField.FieldType = PdfFieldType.CheckBox,
CType(toggleField, PdfCheckBoxField).ExportValue,
CType(toggleField, PdfRadioButtonField).Choice)
fieldCheckedOrSelected = toggleField.Checked
writer.WriteLine(format,
fieldType,
fieldName,
fieldValue,
fieldExportValueOrChoice,
fieldCheckedOrSelected)
Case PdfFieldType.ListBox,
PdfFieldType.Dropdown
' List box and drop-down are choice fields.
Dim choiceField = CType(widgetField, PdfChoiceField)
' List box can have multiple values if multiple selection is enabled.
Dim fieldValues = TryCast(fieldValue, String())
If fieldValues IsNot Nothing Then fieldValue = String.Join(", ", fieldValues)
For itemIndex As Integer = 0 To choiceField.Items.Count - 1
fieldExportValueOrChoice = If(choiceField.Items(itemIndex).ExportValue, choiceField.Items(itemIndex).Value)
fieldCheckedOrSelected = If(choiceField.FieldType = PdfFieldType.ListBox,
CType(choiceField, PdfListBoxField).SelectedIndices.Contains(itemIndex),
CType(choiceField, PdfDropdownField).SelectedIndex = itemIndex)
writer.WriteLine(format,
fieldType,
fieldName,
fieldValue,
fieldExportValueOrChoice,
fieldCheckedOrSelected)
' Write the field type, field name, and field value just once for a field group.
fieldType = Nothing
fieldName = Nothing
fieldValue = Nothing
Next
Case Else
' Text field may contain multiple lines of text, if enabled.
If widgetField.FieldType = PdfFieldType.Text AndAlso (CType(widgetField, PdfTextField)).MultiLine AndAlso fieldValue IsNot Nothing Then fieldValue = (CStr(fieldValue)).Replace(vbCr, "\r")
fieldExportValueOrChoice = Nothing
fieldCheckedOrSelected = Nothing
writer.WriteLine(format,
fieldType,
fieldName,
fieldValue,
fieldExportValueOrChoice,
fieldCheckedOrSelected)
End Select
' Write the field type, field name, and field value just once for a field group.
fieldType = Nothing
fieldName = Nothing
fieldValue = Nothing
Next
writer.WriteLine(separator)
Next
End Using
Console.Write(writer.ToString())
End Sub
End Module
See also
Next steps
Published: February 19, 2019 | Modified: September 8, 2021 | Author: Stipo Rubić