Some test text!

Discord Logo

Chat with us

PDFTron is now Apryse, learn more here.

PDF page labels in Swift

More languages

More languages
Java (Android)
C++
C#
C# (.NET Core)
Go
Java
Kotlin
Obj-C
JS (Node.js)
PHP
Python
Ruby
Swift
C# (UWP)
VB
C# (Xamarin)

Sample Swift code for using PDFTron SDK to work with PDF page labels. PDF page labels can be used to describe a page, which is used to allow for non-sequential page numbering or the addition of arbitrary labels for a page (such as the inclusion of Roman numerals at the beginning of a book). Learn more about our Swift PDF Library and PDF Editing & Manipulation Library.

Get Started Samples Download

To run this sample, get started with a free trial of Apryse SDK.

//---------------------------------------------------------------------------------------
// Copyright (c) 2001-2019 by PDFTron Systems Inc. All Rights Reserved.
// Consult legal.txt regarding legal and license information.
//---------------------------------------------------------------------------------------

import PDFNet
import Foundation

//-----------------------------------------------------------------------------------
// The sample illustrates how to work with PDF page labels.
//
// PDF page labels can be used to describe a page. This is used to
// allow for non-sequential page numbering or the addition of arbitrary
// labels for a page (such as the inclusion of Roman numerals at the
// beginning of a book). PDFNet PTPageLabel object can be used to specify
// the numbering style to use (for example, upper- or lower-case Roman,
// decimal, and so forth), the starting number for the first page,
// and an arbitrary prefix to be pre-appended to each number (for
// example, "A-" to generate "A-1", "A-2", "A-3", and so forth.)
//-----------------------------------------------------------------------------------
func runPageLabelsTest() -> Int {
    return autoreleasepool {
        var ret: Int = 0
        
        
        do {
            try PTPDFNet.catchException {
                //-----------------------------------------------------------
                // Example 1: Add page labels to an existing or newly created PDF
                // document.
                //-----------------------------------------------------------
                do {
                    let doc: PTPDFDoc = PTPDFDoc(filepath: Bundle.main.path(forResource: "newsletter", ofType: "pdf"))
                    doc.initSecurityHandler()
                    
                    // Create a page labeling scheme that starts with the first page in
                    // the document (page 1) and is using uppercase roman numbering
                    // style.
                    let L1 = PTPageLabel.create(doc.getSDFDoc(), style: e_ptroman_uppercase, prefix: "My Prefix ", start_at: 1)
                    doc.setPageLabel(1, label: L1)
                    
                    // Create a page labeling scheme that starts with the fourth page in
                    // the document and is using decimal Arabic numbering style.
                    // Also the numeric portion of the first label should start with number
                    // 4 (otherwise the first label would be "My Prefix 1").
                    let L2 = PTPageLabel.create(doc.getSDFDoc(), style: e_ptdecimal, prefix: "My Prefix ", start_at: 4)
                    doc.setPageLabel(4, label: L2)
                    
                    // Create a page labeling scheme that starts with the seventh page in
                    // the document and is using alphabetic numbering style. The numeric
                    // portion of the first label should start with number 1.
                    let L3 = PTPageLabel.create(doc.getSDFDoc(), style: e_ptalphabetic_uppercase, prefix: "My Prefix ", start_at: 1)
                    doc.setPageLabel(7, label: L3)
                    
                    doc.save(toFile: URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]).appendingPathComponent("newsletter_with_pagelabels.pdf").path, flags: e_ptlinearized.rawValue)
                    print("Done. Result saved in newsletter_with_pagelabels.pdf...")
                }
                
                //-----------------------------------------------------------
                // Example 2: Read page labels from an existing PDF document.
                //-----------------------------------------------------------
                do {
                    let doc: PTPDFDoc = PTPDFDoc(filepath: URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]).appendingPathComponent("newsletter_with_pagelabels.pdf").path)
                    doc.initSecurityHandler()
                    
                    let page_num = doc.getPageCount()
                    
                    for i in 1...page_num {
                        print("Page number: \(i)")
                        let label: PTPageLabel = doc.getPageLabel(i)
                        if label.isValid() {
                            print(" Label: \(String(describing: label.getTitle(i)))")
                        }
                        else {
                            print(" No Label.")
                        }
                    }
                }
                
                //-----------------------------------------------------------
                // Example 3: Modify page labels from an existing PDF document.
                //-----------------------------------------------------------
                do {
                    let doc: PTPDFDoc = PTPDFDoc(filepath: URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]).appendingPathComponent("newsletter_with_pagelabels.pdf").path)
                    doc.initSecurityHandler()
                    
                    // Remove the alphabetic labels from example 1.
                    doc.removePageLabel(7)
                    
                    // Replace the Prefix in the decimal labels (from example 1).
                    var label: PTPageLabel = doc.getPageLabel(4)
                    if label.isValid() {
                        label.setPrefix("A")
                        label.setStart(1)
                    }
                    
                    // Add a new label
                    let new_label = PTPageLabel.create(doc.getSDFDoc(), style: e_ptdecimal, prefix: "B", start_at: 1)
                    doc.setPageLabel(10, label: new_label)  // starting from page 10.
                    
                    doc.save(toFile: URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]).appendingPathComponent("newsletter_with_pagelabels_modified.pdf").path, flags: e_ptlinearized.rawValue)
                    print("Done. Result saved in newsletter_with_pagelabels_modified.pdf...")

                    let page_num = doc.getPageCount()
                    
                    for i in 1...page_num {
                        print("Page number: \(i)")
                        label = doc.getPageLabel(i)
                        if label.isValid() {
                            print(" Label: \(String(describing: label.getTitle(i)))")
                        }
                        else {
                            print(" No Label.")
                        }
                    }
                }
                
                //-----------------------------------------------------------
                // Example 4: Delete all page labels in an existing PDF document.
                //-----------------------------------------------------------
                do {
                    let doc: PTPDFDoc = PTPDFDoc(filepath: URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]).appendingPathComponent("newsletter_with_pagelabels.pdf").path)
                    doc.getRoot().eraseDictElement(withKey: "PageLabels")
                    
                    doc.save(toFile: URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]).appendingPathComponent("newsletter_with_pagelabels_removed.pdf").path, flags: e_ptlinearized.rawValue)
                    print("Done. Result saved in newsletter_with_pagelabels_removed.pdf...")
                }
            }
        } catch let e as NSError {
            print("\(e)")
            ret = 1
        }
        
        return ret
    }
}