Fill and Sign PDF Forms Using JavaScript

PSPDFKit For Web allows you to fill and sign forms in a PDF document both programmatically and manually through the UI.

Launch Demo

Filling In Fields

For standard fields such as text boxes and radio buttons, you can set their values using the pspdfkit.instance#setFormFieldValues method.

In the example below, the value of all text fields is updated:

const formFields = await instance.getFormFields();

// Update the value of all text form fields.
const updatedFormFieldValues = formFields
  .filter((formField) => formField instanceof PSPDFKit.FormFields.TextFormField)
  .reduce((o, formField) => (o[formField.name] = "New Value"), {});

instance.setFormFieldValues(updatedFormFieldValues);

Signing

When a user clicks on an unsigned signature form field, the signature UI pops up, allowing them to create an ink, image, or typed signature. Once this is created, it’s overlaid and fit in the same location as the signature field.

It’s possible to do this programmatically by creating and positioning the ink annotation yourself. This example shows how to do so:

// The name of the field you want.
//
const formFieldName = "signature";

// First get all `FormFields` in the `Document`.
//
const formFields = await instance.getFormFields();

// Get a signature form with the specific name you want.
//
const field = formFields.find(
  (formField) =>
    formField.name === formFieldName &&
    formField instanceof PSPDFKit.FormFields.SignatureFormField
);

// In this example, assume the widget you need is on the first page.
//
const annotations = await instance.getAnnotations(0);

// Find that widget.
//
const widget = annotations.find(
  (annotation) =>
    annotation instanceof PSPDFKit.Annotations.WidgetAnnotation &&
    annotation.formFieldName === field.name
);

// Make a new ink annotation.
//
const annotation = new PSPDFKit.Annotations.InkAnnotation({
  pageIndex: 0,
  lines: PSPDFKit.Immutable.List([
    PSPDFKit.Immutable.List([
      new PSPDFKit.Geometry.DrawingPoint({
        x: widget.boundingBox.left + 5,
        y: widget.boundingBox.top + 5
      }),
      new PSPDFKit.Geometry.DrawingPoint({
        x: widget.boundingBox.left + widget.boundingBox.width - 10,
        y: widget.boundingBox.top + widget.boundingBox.height - 10
      })
    ]),
    PSPDFKit.Immutable.List([
      new PSPDFKit.Geometry.DrawingPoint({
        x: widget.boundingBox.left + widget.boundingBox.width - 10,
        y: widget.boundingBox.top + 5
      }),
      new PSPDFKit.Geometry.DrawingPoint({
        x: widget.boundingBox.left + 5,
        y: widget.boundingBox.top + widget.boundingBox.height - 10
      })
    ])
  ]),
  boundingBox: widget.boundingBox,
  isSignature: true
});

instance.create(annotation);