Search PDF Annotations on iOS

PSPDFKit offers many different ways to search a document, including using a highly customizable UI component. The search functionality also supports searching for text contained in PDF annotations as comments, replies, and form fields (text fields, combo box fields, and list box fields).

Before reading this guide any further, please check out the text search guide to familiarize yourself with the text search APIs that form the basis of searching for annotation results.

Searching via PSPDFViewController

PSPDFKit will automatically search for text contained in annotations and form fields when using the built-in search UI via the provided search bar button item, or when displaying the search UI programmatically using search(for:options:sender:animated:). This behavior is controlled using the SearchViewController.searchableAnnotationTypes property, which defaults to all annotation types except links.

If you’d like to customize this behavior to limit searching to a different set of annotation types or to disable annotation search completely, you can use PSPDFKit’s class override system to subclass SearchViewController and override the property value.

The example below shows how to disable annotation search:

// Set the override when creating your PDF controller.
let controller = PDFViewController(document: document) {
    $0.overrideClass(SearchViewController.self, with: CustomSearchViewController.self)
}

// Overrides the class definition.
private class CustomSearchViewController: SearchViewController {
    override init(document: Document?) {
        super.init(document: document)
        // Disable annotation search.
        searchableAnnotationTypes = []
    }
}

Searching Manually

In contrast to the built-in UI, annotations and form fields won’t be searched by default when using the TextSearch class to search a PDF programmatically. You can change this behavior by setting the TextSearch.searchableAnnotationTypes property to a set of annotation types before triggering search, via calling search(for:). To receive search results, implement TextSearchDelegate on the receiving object and set the text search object’s delegate to your object.

The didUpdate(_:term:searchResults:pageIndex:) delegate will be notified of search results within annotations and form fields alongside text results from the page content. Both are received in the form of SearchResult objects, whereby annotation and form field results can be identified by having an annotation or form field reference associated with the SearchResult.annotation property.

❗ Important: You need to retain the text search object while the search is running. Otherwise, any running search will automatically be canceled, and your delegate won’t get called.