Forms in PDFKit

Forms are an interactive feature of the PDF format. Forms make it possible to add form annotations such as text fields, combo boxes, buttons and actions. Before addings forms to a PDF you must call the document initForm() method.

Form Annotation Methods

Form annotations are added using the following document methods.

The above methods call the formAnnotation method with type set to one of text, pushButton, radioButton, combo or list.

name Parameter

Form annotations are each given a name that is used for identification. Field names are hierarchical using a period ('.') as a separaror (e.g. shipping.address.street). More than one form field can have the same name. When this happens, the fields will have the same value. There is more information on name in the Field Names section below.

options Parameter

Common Options

Form Annotation options that are common across all form annotation types are:

Some form annotations have color options. You can use an array of RGB values, a hex color, or a named CSS color value for that option.

Text Field Options

js doc.formText('leaf2', 10, 60, 200, 40, { multiline: true, align: 'right', format: { type: 'date', params: 'm/d' } });

Combo and List Field Options

js opts = { select: ['', 'github', 'bitbucket', 'gitlab'], value: '', defaultValue: '', align: 'left' }; doc.formCombo('ch1', 10, y, 100, 20, opts);

Button Field Options

js var opts = { backgroundColor: 'yellow', label: 'Test Button' }; doc.formPushButton('btn1', 10, 200, 100, 30, opts);

Text Field Formatting

When needing to format the text value of a Form Annotation, the following options are available. This will cause predefined document JavaScript actions to automatically format the text. Refer to the section Formatting scripts in Acrobat Forms Plugin of the Acrobat SDK documentation for more information.

Add a format dictionary to options. The dictionary must contain a type attribute.

When type is date, time, percent or number the format dictionary must contain additional parameters as described below.

Date format

js // Date text field formatting doc.formText('field.date', 10, 60, 200, 40, { align: 'center', format: { type: 'date', param: 'mmmm d, yyyy' } });

Time format

js // Time text field formatting doc.formText('field.time', 10, 60, 200, 40, { align: 'center', format: { type: 'time', param: 2 } });

Number and percent format

js // Currency text field formatting doc.formText('leaf2', 10, 60, 200, 40, { multiline: true, align: 'right', format: { type: 'number', nDec: 2, sepComma: true, negStyle: 'ParensRed', currency: '$', currencyPrepend: true } });

Field Names

Form Annotations are, by default, added to the root of the PDF document. A PDF form is organized in a name heirarchy, for example shipping.address.street. Capture this heirarchy either by setting the name of each form annotation with the full hierarchical name (e.g. shipping.address.street) or by creating a hierarchy of form fields and form annotations and refering to a form field or form annotations parent using options.parent.

A form field is an invisible node in the PDF form and is created using the document formField method. A form field must include the node's name (e.g. shipping) and may include other information such as the default font that is to be used by all child form annotations.

Using the formField method you might create a shipping field that is added to the root of the document, an address field that refers to the shipping field as it's parent, and a street Form Annotation that would refer to the address field as it's parent.

Create form fields using the document method:

-- Example PDF using field hierarchy, three text fields and a push button --

doc.font('Helvetica'); // establishes the default font
doc.initForm();

let rootField = doc.formField('rootField');
let child1Field = doc.formField('child1Field', { parent: rootField });
let child2Field = doc.formField('child2Field', { parent: rootField });

// Add text form annotation 'rootField.child1Field.leaf1'
doc.formText('leaf1', 10, 10, 200, 40, {
  parent: child1Field,
  multiline: true
});
// Add text form annotation 'rootField.child1Field.leaf2'
doc.formText('leaf2', 10, 60, 200, 40, {
  parent: child1Field,
  multiline: true
});
// Add text form annotation 'rootField.child2Field.leaf1'
doc.formText('leaf1', 10, 110, 200, 80, {
  parent: child2Field,
  multiline: true
});

// Add push button form annotation 'btn1'
var opts = {
  backgroundColor: 'yellow',
  label: 'Test Button'
};
doc.formPushButton('btn1', 10, 200, 100, 30, opts);

The output of this example looks like this.

Advanced Form Field Use

Forms can be quite complicated and your needs will likely grow to sometimes need to directly specify the attributes that will go into the Form Annotation or Field dictionaries. Consult the PDF Reference and set these attributes in the options object. Any options that are not listed above will be added directly to the corresponding PDF Object.

Font

The font used for a Form Annotation is set using the document.font method. Yes that's the same method as is used when setting the text font.

The font method must be called before initForm and may be called before formField or any of the form annotation methods.

js doc.font('Courier'); doc.formText('myfield', 10, 10, 200, 20);

Named JavaScript

In support of Form Annotations that execute JavaScript in PDF, you may use the following document method:

Limitations

It is recommended that you test your PDF form documents across all platforms and viewers that you wish to support.

Form Field Appearances

Form elements must each have an appearance set using the AP attribute of the annotation. If this attribute is not set, the form element's value may not be visible. Because appearances can be complex to generate, Adobe Acrobat has an option to build these apperances from form values and Form Annotation attributes when a PDF is first opened. To do this PDFKit always sets the Form dictionary's NeedAppearances attribute to true. This could mean that the PDF will be dirty upon open, meaning it will need to be saved.

The NeedAppearances flag may not be honored by all PDF viewers.

Some form documents may not need to generate appearances. This may be the case for text Form Annotations that initially have no value. This is not true for push button widget annotations. Please test

Document JavaScript

Many PDF Viewers, aside from Adobe Acrobat Reader, do not implement document JavaScript. Even Adobe Readers may not implement document JavaScript where it is not permitted by a device's app store terms of service (e.g. iOS devices).

Radio and Checkboxes

Support for radio and checkboxes requires a more advanced attention to their rendered appearances and are not supported in this initial forms release.