Document Permissions

The PDF specification defines a series of flags that can be set on a document to determine what a user can do with a document. These permissions are represented as a bitmask at the PDF level. When a permission bit is not present at its defined position, the permission is considered not granted.

PSPDFKit honors the permissions set on a document and enables or disables certain platform features based on the permission configuration. For instance, if a PDF that does not explicitly define the printing permission as loaded, PSPDFKit won’t enable the printing option in the UI.

PDF permissions are defined below. By default, most documents will have all features enabled.

  • Printing: Print the document.
  • High-Quality Printing: Print the document in high fidelity.
  • Copying Content: Copy or otherwise extract text and graphics from the document.
  • Document Assembling: Insert, rotate, or delete pages and create document outline items or thumbnail images.
  • Editing Annotations and Forms: Add or modify text annotations and fill in interactive form fields.
  • Filling Forms: Fill in existing interactive form fields (including signature fields).
  • Modifying Content: Any other modifications not covered by previous permission flags.

PSPDFKit has support for the above permissions on a per-platform basis. This is ongoing work, and support for more permissions is being worked on to reach feature parity across platforms. PDFs have distinct user and owner passwords, and document permissions are only enforced when the PDF is unlocked with the user password. For this reason, we recommend separate passwords for both types of passwords.

On iOS, the document permissions are defined in the PSPDFDocumentPermissions enumeration.

Below you can find a detailed breakdown of the permissions that can be set in a document.

Printing and High-Quality Printing

These permissions are defined by the PSPDFDocumentPermissionsPrinting and PSPDFDocumentPermissionsPrintHighQuality flags. Currently, PSPDFKit for iOS only honors the PSPDFDocumentPermissionsPrinting permission, since iOS only offers a single printing pipeline.

Text Extraction

When this permission is not given, users are not allowed to select text in a document. This permission is defined by the PSPDFDocumentPermissionsExtract flag. PSPDFDocumentPermissionsExtractAccessibility is currently not supported.

Document Assembling

This permission is defined by the PSPDFDocumentPermissionsAssemble flag, but currently it is not honored by PSPDFKit for iOS.

Forms and Annotations

This permission is defined by the PSPDFDocumentPermissionsAnnotationsAndForms flag, but currently it is not honored by PSPDFKit for iOS.

Content Modification

This is defined by the PSPDFDocumentPermissionsModification flag. If it’s not granted, bookmarks are not able to be saved into a document, and a document cannot be redacted.

Getting and Setting Permissions

Modifying a document’s permissions requires PSPDFKit to be instantiated with a license that includes the Document Editor component.

It’s worth noting that if you wish to modify the default document permissions with PSPDFKit, you’ll be required to protect the document with a password.

You can retrieve the current permissions of a document via the PSPDFDocument.permissions property. This property is read-only and will only return the permissions out of the first file when the document is comprised of multiple underlying files.

Document Permissions can be set using the PSPDFDocumentSecurityOptions class when interacting with the document processor. After you define your desired security options, you instantiate a PSPDFProcessor object with it:

Copy
1
2
3
4
5
6
PSPDFDocumentSecurityOptions *securityOptions = [[PSPDFDocumentSecurityOptions alloc] initWithOwnerPassword:password userPassword:password keyLength:PSPDFDocumentSecurityOptionsKeyLengthAutomatic permissions:PSPDFDocumentPermissionsAnnotationsAndForms error:&error];
PSPDFProcessorConfiguration *processorConfiguration = [[PSPDFProcessorConfiguration alloc] initWithDocument:document];

// Create a processor and write the file with the permissions applied.
PSPDFProcessor *processor = [[PSPDFProcessor alloc] initWithConfiguration:processorConfiguration securityOptions:securityOptions];
[processor writeToFileURL:outputFileURL error:&error];
Copy
1
2
3
4
5
6
7
8
9
let securityOptions = try? PSPDFDocumentSecurityOptions(ownerPassword: password, userPassword: password, keyLength: PSPDFDocumentSecurityOptionsKeyLengthAutomatic, permissions: [.annotationsAndForms])

guard let processorConfiguration = PSPDFProcessorConfiguration(document: document) else {
  return
}

// Create a processor and write the file with the permissions applied.
let processor = PSPDFProcessor(configuration: processorConfiguration, securityOptions: securityOptions)
try? processor.write(toFileURL: outputFileURL)

Users can also customize the permissions directly from the UI via PSPDFDocumentSecurityViewController.