Form Submission

Form submission is an action performed on a form element from a PDF document, and it’s usually triggered by a submit button. It is a method of taking user input from a form described in a PDF and sending it as data to a given location. This data can be all the form fields in the form or just a subset of them.

See our PDF Actions guide for more details about PDF actions.

Submission Method

PSPDFKit supports default submission types — for example, GET and POST HTML requests. The chosen method will depend on the given PDF document and the flags applied in the form submit action. The URL used for this submission is also embedded in the form submit action information. The data will be passed in the body of the request in the format required (this will be covered in the following section).

If a custom submission method is required, it is possible to retrieve the values of the form fields and use the submission action delegate explained in the following sections to catch a submit button press.

Format

It’s possible to send data in a variety of formats in order to allow the recipient to parse the data in a known format. This format is provided by the action flags within the PDF document. PSPDFKit will parse these and choose the format based on this selection.

FDF

This is the default format for form submissions, and it’s described as a subset of PDF. The structure of FDF is essentially the same as a PDF document, although only the form elements are present. This format can be used to import the data back into the PDF at a later date. Adobe also provides an FDF Toolkit, which can be used to parse the FDF format on the server side or elsewhere.

The following shows an example of the FDF format. filePath will reflect the path where the file was sent from. Here you can also see Fields with the given key (TextField1) and value (TestText):

Copy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%FDF-1.2
1 0 obj
<<
	/FDF <<
		/F <<
			/F(${filePath})/Type/Filespec/UF(${filePath})
		>>
		/Fields [<</T(TextField1)/V(TestText)>>]
	>>
>>
endobj

trailer
<</Root 1 0 R>>
%%EOF

HTML

The HTML format can be chosen to create a GET or POST request to supply to a particular server. The form fields will be converted to key-value pairs, with the name being the ID of the form field and the value being the user input. This format abides by the HTML 4.01 Specification.

The body of the HTML request will hold the values sent from the form. The following shows how two form fields will be generated — note that it is delimited by an ampersand. This can be easily parsed by most web server technologies:

1
TextField1=TestText&TextField2=TestText2

XFDF

XFDF is similar to FDF, but it’s represented in an XML-like format. This is a standard provided by Adobe and therefore supported by Adobe Acrobat and various other third-party products. See the XFDF Overview from Adobe for more details.

XFDF will output a file with XML notation. It will hold a collection of fields, each of which can have a collection of values. Here you can see the form field TextField1 has a value element of TestText:

Copy
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xml:space="preserve" xmlns="http://ns.adobe.com/xfdf/">
	<fields>
		<field name="TextField1">
			<value>TestText</value>
		</field>
	</fields>
</xfdf>

PDF

It is also possible to submit an entire PDF document. This option is useful when the recipient has no reference to the original document. Seeing as the whole PDF is transmitted with this format, it is a highly wasteful process, especially when submitting complex and large documents.

Action Delegate

PDFViewController provides a PDFFormSubmissionDelegate to receive information about the ongoing form submission. This allows for customization of the submit action and also gives feedback on the ongoing HTML request.

When a form submission action is run, the delegate will be queried in this order:

  1. formSubmissionControllerShouldPresentResponseinWebView(_:): – Should the view controller push a web view with the response data? If yes, then the web view takes responsibility for the connection and the delegates from point 4 below will not be called.
  2. formSubmissionController(_:shouldSubmitFormRequest:): – If no, then the operation is canceled.
  3. formSubmissionController(_:willSubmitFormValues:): – The submission is going ahead.
    • formSubmissionController(_:didReceiveResponseData:): – The submission has completed successfully.
    • formSubmissionController(_:didFailWithError:): – The submission has failed.