PDF annotation actions support

A PDF action is similar to a web hyperlink, but it’s much more flexible. Nutrient Web SDK implements common actions as defined in Adobe’s PDF Reference (page 417ff).

Action Nutrient class Use case
GoTo GoToAction Go to a destination (page) in the current document.
URI URIAction Resolve a Uniform Resource Identifier (web link).
SubmitForm SubmitFormAction Send data to a Uniform Resource Locator.
ResetForm ResetFormAction Set fields to their default values.
JavaScript JavaScriptAction Execute a script.

GoToAction

A GoTo action can define a different pageIndex in the same document. Clicking on it updates the scroll position to make the page visible, but it doesn’t update the zoom level.

URIAction

A URI action contains a URI. When executing this annotation, Nutrient uses window.open to create a new browser tab, which also clears the opener as a security measurement to avoid allowing the target page to have access to your PDF state:

let newWindow = window.open(action.uri, "_blank");
newWindow.opener = null;
var newWindow = window.open(action.uri, "_blank");
newWindow.opener = null;

JavaScriptAction

Information

Working with PDF JavaScript is available when using the Web SDK in standalone operational mode.

This is a PDF action for running arbitrary JavaScript. Actions are executed on a click. WidgetAnnotation and form fields can also define an additionalActions field, which is a dictionary of event name and action pairs. For more information about the additional actions of WidgetAnnotations and FormFields, refer to the API documentation.

You can learn more about the security problems when using _blank in this article from JitBit.

Refer to an individual browser’s documentation for a list of supported URI protocols. The most used protocols (http, https, and mailto) are supported in all major browsers.

Here’s an example showing how to run JavaScript code when a WidgetAnnotation is focused. This is done using the additionalActions field:

const widget = new PSPDFKit.Annotations.WidgetAnnotation({
  id: PSPDFKit.generateInstantId(),
  pageIndex: 0,
  formFieldName: "MyFormField",
  boundingBox: new PSPDFKit.Geometry.Rect({
    left: 100,
    top: 75,
    width: 200,
    height: 80
  }),
  additionalActions: {
    onFocus: new PSPDFKit.Actions.JavaScriptAction({
      script: "alert('onFocus')"
    })
  }
});

const formField = new PSPDFKit.FormFields.TextFormField({
  name: "MyFormField",
  annotationIds: new PSPDFKit.Immutable.List([widget.id]),
  value: "Text shown in the form field"
});

instance.create([widget, formField]);