PDF: Edit interactive fields of PDF document in WinForms
 
            
                In This Topic
            
            
            
            		The 
PdfAnnotationTool class allows to edit the interactive fields of PDF page in WinForms image viewer. The class edits the interactive fields in two modes 'Markup' and 'Edit'.
		
		
		In 'Markup' mode the 
PdfAnnotationTool class:
		
			- Allows to 'view' PDF annotations, 'change' markup annotations and 'fill' PDF interactive fields.
 
			- Raises and processes events (Activate, MouseDown, Keystoke, etc) of annotations and interactive fields.
 
			- Can copy and paste markup annotations.
 
			- Uses PdfMarkupAnnotationView.MarkupTransformer as an interaction controller for markup annotation and PdfAnnotationView.ViewTransformer as an interaction controller for non-markup annotation and interactive field.
 
		
		
		In 'Edit' mode the 
PdfAnnotationTool class:
		
			- Allows to 'view' and 'edit' PDF annotations and PDF interactive fields.
 
			- Does NOT raise and process events (Activate, MouseDown, Keystoke, etc) of annotations and interactive fields.
 
			- Can copy and paste any annotation and interactive field.
 
			- Can select multiple annotations and interactive fields, selected annotations can be moved as a group.
 
			- Shows all (not hidden and hidden) annotations and interactive fields.
 
			- Can use special highlighting of fields.
 
			- Uses PdfAnnotationView.EditTransformer as an interaction controller.
 
		
		
		Here is C#/VB.NET code that demonstrates how to create a visual tool for displaying and interaction with annotations and fields of PDF interactive form:
		
		
    
	
	    
	    
/// <summary>
/// Creates the PDF annotation tool with JavaScript support.
/// </summary>
/// <param name="viewer">The image viewer.</param>
public static Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationTool CreatePdfAnnotationToolWithJavaScriptSupport(Vintasoft.Imaging.UI.ImageViewer viewer)
{
    // create PDF JavaScript application
    Vintasoft.Imaging.Pdf.UI.JavaScript.WinFormsPdfJsApp jsApp = 
        new Vintasoft.Imaging.Pdf.UI.JavaScript.WinFormsPdfJsApp();
    // add PDF documents, which are associated with images in viewer,
    // to the document set of PDF JavaScript application
    jsApp.RegisterImageViewer(viewer);
    // create PdfJavaScriptActionExecutor for PDF JavaScript application
    jsApp.ActionExecutor = new Vintasoft.Imaging.Pdf.JavaScript.PdfJavaScriptActionExecutor(
        jsApp, new Vintasoft.Imaging.Pdf.JavaScriptApi.PdfJsConsole());
    // create Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationTool
    Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationTool annotationTool = 
        new Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationTool(jsApp, true);
    annotationTool.InteractionMode = Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationInteractionMode.Markup;
    // create an application action executor
    Vintasoft.Imaging.Pdf.PdfActionCompositeExecutor applicationActionExecutor = 
        new Vintasoft.Imaging.Pdf.PdfActionCompositeExecutor();
    // add executor for PdfJavaScriptAction to the application action executor
    applicationActionExecutor.Items.Add(jsApp.ActionExecutor);
    // add executor for PdfGotoAction to the application action executor
    applicationActionExecutor.Items.Add(new Vintasoft.Imaging.Pdf.UI.PdfGotoActionExecutor(viewer));
    // add executor for PdfNamedAction to the application action executor
    applicationActionExecutor.Items.Add(new Vintasoft.Imaging.Pdf.UI.PdfNamedActionExecutor(viewer));
    // add executor for PdfResetFormAction to the application action executor
    applicationActionExecutor.Items.Add(
        new Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationToolResetFormActionExecutor(annotationTool));
    // add executor for PdfAnnotationHideAction to the application action executor
    applicationActionExecutor.Items.Add(
        new Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationToolAnnotationHideActionExecutor(annotationTool));
    // add executor for PdfUriAction to the application action executor,
    // executor is located in WpfPdfDemosCommonCode
    //applicationActionExecutor.Items.Add(new PdfUriActionExecutor());
    // add executor for PdfLaunchAction to the application action executor,
    // executor is located in WpfPdfDemosCommonCode
    //applicationActionExecutor.Items.Add(new PdfLaunchActionExecutor());
    // add executor for PdfSubmitFormAction to the application action executor,
    // executor is located in WpfPdfDemosCommonCode
    //applicationActionExecutor.Items.Add(new PdfSubmitActionExecutor(viewer));
    // add the default executor (for PdfResetFormAction and PdfAnnotationHideAction)
    // to the application action executor
    applicationActionExecutor.Items.Add(new Vintasoft.Imaging.Pdf.PdfActionExecutor());
    // set the application action executor as action executor of PDF annotation tool
    annotationTool.ActionExecutor = applicationActionExecutor;
    // create a document-level actions executor
    Vintasoft.Imaging.Pdf.PdfDocumentLevelActionsExecutor documentLevelActionsExecutor =
       new Vintasoft.Imaging.Pdf.PdfDocumentLevelActionsExecutor(jsApp);
    // set the application action executor as action executor of the document-level actions executor
    documentLevelActionsExecutor.ActionExecutor = applicationActionExecutor;
    return annotationTool;
}
	     
	 
 
    
	
	    
	    
''' <summary>
''' Creates the PDF annotation tool with JavaScript support.
''' </summary>
''' <param name="viewer">The image viewer.</param>
Public Shared Function CreatePdfAnnotationToolWithJavaScriptSupport(viewer As Vintasoft.Imaging.UI.ImageViewer) As Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationTool
    ' create PDF JavaScript application
    Dim jsApp As New Vintasoft.Imaging.Pdf.UI.JavaScript.WinFormsPdfJsApp()
    ' add PDF documents, which are associated with images in viewer,
    ' to the document set of PDF JavaScript application
    jsApp.RegisterImageViewer(viewer)
    ' create PdfJavaScriptActionExecutor for PDF JavaScript application
    jsApp.ActionExecutor = New Vintasoft.Imaging.Pdf.JavaScript.PdfJavaScriptActionExecutor(jsApp, New Vintasoft.Imaging.Pdf.JavaScriptApi.PdfJsConsole())
    ' create Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationTool
    Dim annotationTool As New Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationTool(jsApp, True)
    annotationTool.InteractionMode = Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationInteractionMode.Markup
    ' create an application action executor
    Dim applicationActionExecutor As New Vintasoft.Imaging.Pdf.PdfActionCompositeExecutor()
    ' add executor for PdfJavaScriptAction to the application action executor
    applicationActionExecutor.Items.Add(jsApp.ActionExecutor)
    ' add executor for PdfGotoAction to the application action executor
    applicationActionExecutor.Items.Add(New Vintasoft.Imaging.Pdf.UI.PdfGotoActionExecutor(viewer))
    ' add executor for PdfNamedAction to the application action executor
    applicationActionExecutor.Items.Add(New Vintasoft.Imaging.Pdf.UI.PdfNamedActionExecutor(viewer))
    ' add executor for PdfResetFormAction to the application action executor
    applicationActionExecutor.Items.Add(New Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationToolResetFormActionExecutor(annotationTool))
    ' add executor for PdfAnnotationHideAction to the application action executor
    applicationActionExecutor.Items.Add(New Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationToolAnnotationHideActionExecutor(annotationTool))
    ' add executor for PdfUriAction to the application action executor,
    ' executor is located in WpfPdfDemosCommonCode
    'applicationActionExecutor.Items.Add(new PdfUriActionExecutor());
    ' add executor for PdfLaunchAction to the application action executor,
    ' executor is located in WpfPdfDemosCommonCode
    'applicationActionExecutor.Items.Add(new PdfLaunchActionExecutor());
    ' add executor for PdfSubmitFormAction to the application action executor,
    ' executor is located in WpfPdfDemosCommonCode
    'applicationActionExecutor.Items.Add(new PdfSubmitActionExecutor(viewer));
    ' add the default executor (for PdfResetFormAction and PdfAnnotationHideAction)
    ' to the application action executor
    applicationActionExecutor.Items.Add(New Vintasoft.Imaging.Pdf.PdfActionExecutor())
    ' set the application action executor as action executor of PDF annotation tool
    annotationTool.ActionExecutor = applicationActionExecutor
    ' create a document-level actions executor
    Dim documentLevelActionsExecutor As New Vintasoft.Imaging.Pdf.PdfDocumentLevelActionsExecutor(jsApp)
    ' set the application action executor as action executor of the document-level actions executor
    documentLevelActionsExecutor.ActionExecutor = applicationActionExecutor
    Return annotationTool
End Function
	     
	 
 
		
		
		Here is C#/VB.NET code that demonstrates how to start the building of interactive field of PDF document:
		
		
    
	
	    
	    
/// <summary>
/// Adds and builds a button form field.
/// </summary>
/// <param name="annotationTool">The PDF annotation tool, which will build a field.</param>
public static void AddAndBuildButtonField(Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationTool annotationTool)
{
    Vintasoft.Imaging.Pdf.Tree.PdfPage focusedPage = annotationTool.FocusedPage;
    if (focusedPage == null)
        throw new System.InvalidOperationException();
    // create a Button form field
    Vintasoft.Imaging.Pdf.Tree.InteractiveForms.PdfInteractiveFormPushButtonField field = 
        new Vintasoft.Imaging.Pdf.Tree.InteractiveForms.PdfInteractiveFormPushButtonField(
            focusedPage.Document,
            GetFieldName(focusedPage.Document, null, "Button{0}"),
            new System.Drawing.RectangleF(0, 0, 150, 22));
    // set the field appearance generator
    Vintasoft.Imaging.Pdf.Tree.InteractiveForms.AppearanceGenerators.PdfButton3DBorderFieldAppearanceGenerator appearanceGenerator =
        new Vintasoft.Imaging.Pdf.Tree.InteractiveForms.AppearanceGenerators.PdfButton3DBorderFieldAppearanceGenerator();
    field.Annotation.AppearanceGenerator = appearanceGenerator;
    appearanceGenerator.NormalCaption = "JavaScript 'Hello!'";
    appearanceGenerator.FontSize = 14;
    // if tool mode does not allow to build annotation
    if (annotationTool.InteractionMode != Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationInteractionMode.Edit)
        // change the tool mode
        annotationTool.InteractionMode = Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationInteractionMode.Edit;
    // set JavaScript action to Activate trigger event
    field.Annotation.ActivateAction =
        new Vintasoft.Imaging.Pdf.Tree.PdfJavaScriptAction(focusedPage.Document, "app.alert('Hello!', 3);");
    // add and build annotation
    annotationTool.AddAndBuildFormField(field);
}
/// <summary>
/// Returns the name of new field.
/// </summary>
/// <param name="document">PDF document.</param>
/// <param name="parentField">The parent interactive form field.</param>
/// <param name="fieldNameFormat">The format of field name.</param>
/// <returns>The name of new field.</returns>
private static string GetFieldName(
    Vintasoft.Imaging.Pdf.PdfDocument document,
    Vintasoft.Imaging.Pdf.Tree.InteractiveForms.PdfInteractiveFormField parentField,
    string fieldNameFormat)
{
    string format = fieldNameFormat;
    if (parentField != null)
        format = string.Format("{0}.{1}", parentField.FullyQualifiedName, fieldNameFormat);
    if (document.InteractiveForm == null)
        return string.Format(fieldNameFormat, 1);
    int i = 1;
    while (document.InteractiveForm.FindField(string.Format(format, i)) != null)
        i++;
    return string.Format(fieldNameFormat, i);
}
	     
	 
 
    
	
	    
	    
''' <summary>
''' Adds and builds a button form field.
''' </summary>
''' <param name="annotationTool">The PDF annotation tool, which will build a field.</param>
Public Shared Sub AddAndBuildButtonField(annotationTool As Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationTool)
    Dim focusedPage As Vintasoft.Imaging.Pdf.Tree.PdfPage = annotationTool.FocusedPage
    If focusedPage Is Nothing Then
        Throw New System.InvalidOperationException()
    End If
    ' create a Button form field
    Dim field As New Vintasoft.Imaging.Pdf.Tree.InteractiveForms.PdfInteractiveFormPushButtonField(focusedPage.Document, GetFieldName(focusedPage.Document, Nothing, "Button{0}"), New System.Drawing.RectangleF(0, 0, 150, 22))
    ' set the field appearance generator
    Dim appearanceGenerator As New Vintasoft.Imaging.Pdf.Tree.InteractiveForms.AppearanceGenerators.PdfButton3DBorderFieldAppearanceGenerator()
    field.Annotation.AppearanceGenerator = appearanceGenerator
    appearanceGenerator.NormalCaption = "JavaScript 'Hello!'"
    appearanceGenerator.FontSize = 14
    ' if tool mode does not allow to build annotation
    If annotationTool.InteractionMode <> Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationInteractionMode.Edit Then
        ' change the tool mode
        annotationTool.InteractionMode = Vintasoft.Imaging.Pdf.UI.Annotations.PdfAnnotationInteractionMode.Edit
    End If
    ' set JavaScript action to Activate trigger event
    field.Annotation.ActivateAction = New Vintasoft.Imaging.Pdf.Tree.PdfJavaScriptAction(focusedPage.Document, "app.alert('Hello!', 3);")
    ' add and build annotation
    annotationTool.AddAndBuildFormField(field)
End Sub
''' <summary>
''' Returns the name of new field.
''' </summary>
''' <param name="document">PDF document.</param>
''' <param name="parentField">The parent interactive form field.</param>
''' <param name="fieldNameFormat">The format of field name.</param>
''' <returns>The name of new field.</returns>
Private Shared Function GetFieldName(document As Vintasoft.Imaging.Pdf.PdfDocument, parentField As Vintasoft.Imaging.Pdf.Tree.InteractiveForms.PdfInteractiveFormField, fieldNameFormat As String) As String
    Dim format As String = fieldNameFormat
    If parentField IsNot Nothing Then
        format = String.Format("{0}.{1}", parentField.FullyQualifiedName, fieldNameFormat)
    End If
    If document.InteractiveForm Is Nothing Then
        Return String.Format(fieldNameFormat, 1)
    End If
    Dim i As Integer = 1
    While document.InteractiveForm.FindField(String.Format(format, i)) IsNot Nothing
        i += 1
    End While
    Return String.Format(fieldNameFormat, i)
End Function