Some test text!

UI componentskeyboard_arrow_down

Customize a document view controller on iOS

This article explains how to customize the document viewer classes PTDocumentViewController and PTTabbedDocumentViewController.

Because the document viewer classes are part of the open source Tools UI framework, it is possible to achieve virtually any required modification. That said, it is usually faster and more convenient to configure the viewers via APIs, which this guide describes.



The image on the left indicates areas that are controllable via the PTDocumentViewController's API. Information on customizing these is available directly below.

The image on the right indicates a number of default buttons that create and present new controls. Information on where to look to customize these presented controls can be found in the component controls table.

link1: Left bar button item

When presented in a UINavigationController, the PTDocumentViewController's left bar button item will display the name of the previous view controller's navigation item's title (or, if set, its backBarButtonItem). When presented as a UINavigationController's root controller, the space will be empty.

The PTDocumentViewController's left bar button item can be added or replaced as follows:

let title = NSLocalizedString("Documents", comment: "Go back to the document picker.")
documentViewController.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "title, style: .plain, target: self, action: #selector(self.pressedLeft(_:)))"

@objc func pressedLeft(_ item: UIBarButtonItem)
    // handle bar button item action

link2: Right bar button items

These buttons, which are contained in the rightBarButtonItems array, are completely customizable. It is possible to

linkRemove buttons

Default buttons can be removed ("hidden") using built-in properties. From left-to-right:

For example to hide the share and viewer settings buttons:

documentViewController.shareButtonHidden = true
documentViewController.viewerSettingsButtonHidden = true

linkAdd buttons

Buttons can be added by accessing the appropriate BarButtonItem array and adding a button:

Adds a button to the top navigation bar:

// add a button to the top bar
let plusButtonTop = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(self.writeButtonName(_:)))

if let rightItems = documentViewController.navigationItem.rightBarButtonItems {
    documentViewController.navigationItem.rightBarButtonItems = rightItems + [plusButtonTop]

// add a button to the right of the page slider
let refreshButtonBottom = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(self.writeButtonName(_:)))

if let bottomItems = documentViewController.thumbnailSliderController.trailingToolbarItems{
    documentViewController.thumbnailSliderController.trailingToolbarItems = bottomItems + [refreshButtonBottom]

linkMove buttons

The default buttons are all accessible via properties, making it easy to rearrange or move them. The following code swaps the position of the search button and navigation lists button:

var rightItems = documentViewController.navigationItem.rightBarButtonItems
rightItems?.removeAll(where: { element in element == documentViewController.searchButtonItem })

var bottomRightItems:[UIBarButtonItem]? = documentViewController.thumbnailSliderController.trailingToolbarItems
bottomRightItems?.removeAll(where: { element in element as NSObject == documentViewController.navigationListsButtonItem })

documentViewController.navigationItem.rightBarButtonItems = rightItems
documentViewController.thumbnailSliderController.trailingToolbarItems = bottomRightItems

linkChange icons

The icons of existing buttons may be changed by creating new UIBarButtonItems that have the same target and action as an existing item, and replacing the existing item with the new item:

// new share UIBarButtonItem
let newShareItem = UIBarButtonItem(barButtonSystemItem: .action, target:, action: documentViewController.shareButtonItem.action)

// replace old share UIBarButtonItem with new share UIBarButtonItem
var rightItems = documentViewController.navigationItem.rightBarButtonItems
var index: Int? = (rightItems as NSArray?)?.index(of: documentViewController.shareButtonItem)
rightItems?.removeAll(where: { element in element == documentViewController.shareButtonItem })
rightItems?.insert(newShareItem, at: index ?? 0)

// new search UIBarButtonItem
let newSearchItem = UIBarButtonItem(barButtonSystemItem: .search, target:, action: documentViewController.searchButtonItem.action)

// replace old search UIBarButtonItem with new search UIBarButtonItem
index = (rightItems as NSArray?)?.index(of: documentViewController.searchButtonItem)
rightItems?.removeAll(where: { element in element == documentViewController.searchButtonItem })
rightItems?.insert(newSearchItem, at: index ?? 0)

// update the icons
documentViewController.navigationItem.rightBarButtonItems = rightItems

link3: PDFViewCtrl

The PTPDFViewCtrl is a UIView that displays the PDF. It is customizable via is properties/methods and delegate methods.

For an overview see the PTPDFViewCtrl Guide, or the detailed API documentation.

Note that all PDF "interaction" (annotations, form filling, text selection, link following, etc.) is supplementary to the PDFViewCtrl, and is implemented in the open source tools.framework.

link4: Page number indicator

The page indicator can be enabled/disabled via the pageIndicatorEnabled property.

link5: Thumbnail slider controller

The thumbnail slider can be enabled/disabled via the bottomToolbarEnabled property.

The default buttons presented to the right and left of the slider are easily hidden through the convenience properties thumbnailBrowserButtonHidden and navigationListsButtonHidden on the PTDocumentViewController:

documentViewController.thumbnailBrowserButtonHidden = true

link6-12: Controls Presented by a PTDocumentViewController

To customize the controls that are presented by the PTDocumentViewController's default buttons, please see the corresponding guide or API:

Image numberControl


The tabbed document view controller displays a collection of document viewer controllers in tabs.

linkTab Settings

Tabs can be disabled using the tabsEnabled property, and the maximum number of allowed tabs can be set using maximumTabCount.

linkAccess to child PTDocumentViewControllers

The current document view controller can be accessed via selectedViewController, and others via documentViewController(at:)

To configure a document view controller before it is displayed, conform to and implement the PTTabbedDocumentViewControllerDelegate method tabbedDocumentViewController(_:willAdd:). Note that it is permissible to assign the internal PTDocumentViewController's delegate to an external object.

func tabbedDocumentViewController(_ tabbedDocumentViewController: PTTabbedDocumentViewController, willAdd documentViewController: PTDocumentViewController) {
        documentViewController.delegate = self
        // customize documentViewController


tabsEnabledEnables/disables tabs.
maximumTabCountControls the maximum number of concurrent tabs.
selectedViewControllerThe current PTDocumentViewController.
documentViewController(at:)The PTDocumentViewController at the given index.
tabbedDocumentViewController(_:willAdd:)Access to a PTDocumentViewController that is about to be displayed.

Get the answers you need: Support


Free Trial

Get unlimited trial usage of PDFTron SDK to bring accurate, reliable, and fast document processing capabilities to any application or workflow.

Select a platform to get started with your free trial.

Unlimited usage. No email address required.

Join our live demo to learn about use cases & capabilities for WebViewer

Learn more