This HTML page is not optimized for LLM or AI agent consumption. Fetch the Markdown version instead: /guides/ios/samples/pdf-page-scaling.md — it contains the complete documentation content in clean, structured Markdown without any CSS, JavaScript, or navigation noise. PDF page scale and resize using Swift for iOS

UsePSPDFProcessor to scale (resize) document pages. Get additional resources by visiting our guide on scaling or resizing PDFs in iOS.


//
// Copyright © 2016-2026 PSPDFKit GmbH. All rights reserved.
//
// The Nutrient sample applications are licensed with a modified BSD license.
// Please see License for details. This notice may not be removed from this file.
//
import PSPDFKit
import PSPDFKitUI
/// Shows how to scale pages with `PSPDFProcessor`.
final class PageScalingExample: Example {
// MARK: Lifecycle
override init() {
super.init()
contentDescription = "Shows how to scale pages with PSPDFProcessor"
category = .documentProcessing
priority = 13
}
override func invoke(with delegate: ExampleRunnerDelegate) -> UIViewController {
let document = AssetLoader.document(for: .welcome)
return PageScalingPDFViewController(document: document)
}
}
/// Scales pages of it's document.
private final class PageScalingPDFViewController: PDFViewController {
// MARK: Lifecycle
override func commonInit(with document: Document?, configuration: PDFConfiguration) {
super.commonInit(with: document, configuration: configuration)
let actions = [("Page Size", #selector(showPageSize)), ("Scale", #selector(scale))]
let barButtonItems = actions.map { title, selector in
UIBarButtonItem(title: title, style: .plain, target: self, action: selector)
}
navigationItem.setRightBarButtonItems(barButtonItems.reversed(), for: .document, animated: false)
}
// MARK: Bar Button Item Actions
/// Scales all pages of the current document.
///
/// - Parameter sender: Action sender.
@objc
private func scale(_ sender: UIBarButtonItem) {
guard let document else {
print("Processor configuration needs a valid document")
return
}
guard let configuration = Processor.Configuration(document: document) else { return }
// We want to scale down every page to half it's size.
let newPageSizes: [(PageIndex, CGSize)] = pageSizes!.map { ($0.0, CGSize(width: $0.1!.width / 2, height: $0.1!.height / 2)) }
for (page, pageSize) in newPageSizes {
configuration.scalePage(page, to: pageSize)
}
let scaledDocumentURL = FileHelper.temporaryPDFFileURL(prefix: "scaled")
do {
// Process annotations.
// `PSPDFProcessor` doesn't modify the document, but creates an output file instead.
let processor = Processor(configuration: configuration, securityOptions: nil)
processor.delegate = self
try processor.write(toFileURL: scaledDocumentURL)
} catch {
print("Error while processing document: \(error)")
return
}
presentProcessedDocument(scaledDocumentURL)
}
/// Shows the current page size as an alert.
///
/// - Parameter sender: Action sender.
@objc
private func showPageSize(_ sender: UIBarButtonItem) {
let pageSize = pageSizeForPage(at: pageIndex)!
let message = "Height: \(pageSize.height)\nWidth: \(pageSize.width)"
let alertController = UIAlertController(title: "Page Size", message: message, preferredStyle: .alert)
let alertAction = UIAlertAction(title: "Dismiss", style: .default)
alertController.addAction(alertAction)
present(alertController, animated: true, completion: nil)
}
// MARK: Helper
/// Page sizes of the document.
///
/// - Returns: Array of tuples (page number, page size)
private var pageSizes: [(PageIndex, CGSize?)]? {
guard let document else { return nil }
return (0..<document.pageCount).flatMap { [($0, self.pageSizeForPage(at: $0))] }
}
/// Gets a page's size.
///
/// - Parameter page: Page to get size from.
/// - Returns: Page size.
private func pageSizeForPage(at index: PageIndex) -> CGSize? {
let pageInfo = document?.pageInfoForPage(at: index)
return pageInfo?.size
}
/// Presents a processed document.
///
/// - Parameter processedDocumentURL: `URL` of processed document.
private func presentProcessedDocument(_ processedDocumentURL: URL) {
let processedDocument = Document(url: processedDocumentURL)
let pdfController = PageScalingPDFViewController(document: processedDocument)
let rightBarButtonItems = Array(pdfController.navigationItem.rightBarButtonItems(for: .document)!.dropFirst())
pdfController.navigationItem.setRightBarButtonItems(rightBarButtonItems, for: .document, animated: false)
let navigationController = UINavigationController(rootViewController: pdfController)
present(navigationController, animated: true, completion: nil)
}
}
extension PageScalingPDFViewController: ProcessorDelegate {
nonisolated func processor(_ processor: Processor, didProcessPage currentPage: UInt, totalPages: UInt) {
print("Progress: \(currentPage + 1) of \(totalPages)")
}
}

This code sample is an example that illustrates how to use our SDK. Please adapt it to your specific use case.