---
title: "How to edit PDFs in an iOS application using a PDF library"
canonical_url: "https://www.nutrient.io/blog/how-to-edit-pdfs-using-ios-pdf-library/"
md_url: "https://www.nutrient.io/blog/how-to-edit-pdfs-using-ios-pdf-library.md"
last_updated: "2026-07-07T19:27:48.813Z"
description: "Learn how to edit PDFs in your iOS app using Nutrient’s iOS PDF library — crop, rotate, watermark, rearrange, and attach files to PDFs."
---

**TL;DR**

Nutrient iOS SDK lets you edit PDFs programmatically and through a built-in UI:

- Use the `Processor` class to rotate, crop, move, remove, and add pages, as well as to apply permanent watermarks.

- Switch the `PDFViewController` to content editing mode to edit text directly.

- Attach embedded files to a page with a `FileAnnotation`.

In this post, you’ll learn how to edit PDFs using Nutrient iOS SDK. More specifically, you’ll learn how to perform the following editing operations on a PDF document in your iOS application:

- [Rotate pages](https://www.nutrient.io/guides/ios/editor/page-manipulation/rotate.md)

- [Crop pages](https://www.nutrient.io/guides/ios/editor/page-manipulation/crop.md)

- [Rearrange (move) pages](https://www.nutrient.io/guides/ios/editor/page-manipulation/move-or-copy.md)

- [Remove pages](https://www.nutrient.io/guides/ios/editor/page-manipulation/remove.md)

- [Add new pages](https://www.nutrient.io/guides/ios/editor/add-page.md)

- [Edit text](https://www.nutrient.io/guides/ios/editor/edit-text.md)

- [Attach files](https://www.nutrient.io/guides/ios/editor/attach-a-file.md)

- [Add watermarks](https://www.nutrient.io/guides/ios/editor/watermark.md)

iOS ships with Apple’s PDFKit for displaying PDFs, but editing them — rearranging pages, editing text, adding signatures or watermarks — goes beyond what the native framework covers. This post uses Nutrient’s iOS PDF library for those operations; the comparison near the end covers when PDFKit is enough and when a dedicated library earns its place.

## Requirements

To get started, you’ll need:

- A computer running macOS

- The [latest stable version of Xcode](https://apps.apple.com/us/app/xcode/id497799835?mt=12)

## Getting started

To follow along, create a fresh Xcode project and add the Nutrient Swift package to your project. For step-by-step instructions, follow our [Getting Started on iOS guide](https://www.nutrient.io/sdk/ios/getting-started.md).

## Rotating PDF pages using the Processor class

The [`Processor`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor) class provides APIs for document editing operations. Many [`Processor`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor) operations involve producing an output that’s the result of performing editing operations on an input document.

Use `Processor` when you want to build an automated document processing operation.

1. Load the document you want to edit:

   ```swift

   let fileURL = Bundle.main.url(forResource: "YOUR-DOCUMENT", withExtension: "pdf")!
   let document = Document(url: fileURL)
   ```

2. Configure the page rotation parameters on a [`Processor.Configuration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor/configuration) instance:

   ```swift

    guard let configuration = Processor.Configuration(document: document) else {
           print("Could not create a processor configuration. The document might be locked or invalid.")
           return
       }

   configuration.rotatePage(0, by: 90)
   ```

3. Construct a URL to write the modified document:

   ```swift

   let editedDocumentURl = URL(filePath: NSTemporaryDirectory() + "/document-rotated.pdf")
   ```

4. Apply the configuration and write the edited document:

   ```swift

   let processor = Processor(configuration: configuration, securityOptions: nil)
   do {
       try processor.write(toFileURL: editedDocumentURl)
   } catch {
       print(error)
   }
   ```

5. Load the edited document and present the PDF view controller:

   ```swift

   let editedDocument = Document(url: editedDocumentURl)

   let pdfController = PDFViewController(document: editedDocument)

   present(UINavigationController(rootViewController: pdfController), animated: true)
   ```

For a working example, replace the contents of `ViewController.swift` with the following:

```swift

import UIKit
import PSPDFKit
import PSPDFKitUI

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        let fileURL = Bundle.main.url(forResource: "YOUR-DOCUMENT", withExtension: "pdf")!
        let document = Document(url: fileURL)

        guard let configuration = Processor.Configuration(document: document) else {
            print("Could not create a processor configuration. The document might be locked or invalid.")
            return
        }

        // Rotate the first page 90 degrees clockwise.
        configuration.rotatePage(0, by: 90)

        let editedDocumentURL = URL(filePath: NSTemporaryDirectory() + "/document-rotated.pdf")

        let processor = Processor(configuration: configuration, securityOptions: nil)
        do {
            // Write the modified document. `editedDocumentURL` can be used
            // to initialize and present the edited document.
            try processor.write(toFileURL: editedDocumentURL)
        } catch {
            print(error)
        }

        let editedDocument = Document(url: editedDocumentURL)

        let pdfController = PDFViewController(document: editedDocument)

        // Present the PDF view controller within a `UINavigationController` to show built-in toolbar buttons.
        present(UINavigationController(rootViewController: pdfController), animated: true)

    }
}

```

Remember to replace `YOUR-DOCUMENT` with the document you want to edit.![Rotating the first page of a PDF 90 degrees in the iOS Simulator](@/assets/images/blog/2023/how-to-edit-pdfs-using-ios-pdf-library/rotate.gif)

## Cropping PDF pages using the Processor class

To crop a page of your document using [`Processor`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor), configure the page cropping parameters on a [`Processor.Configuration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor/configuration) instance:

```swift

// Crop the page to 200×200 pt.
configuration.changeCropBoxForPage(at: 0, to: CGRect(x: 0, y: 0, width: 200, height: 200))

```

For a working example, replace the contents of `ViewController.swift` with the following:

```swift

import UIKit
import PSPDFKit
import PSPDFKitUI

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        let fileURL = Bundle.main.url(forResource: "YOUR-DOCUMENT", withExtension: "pdf")!
        let document = Document(url: fileURL)

        guard let configuration = Processor.Configuration(document: document) else {
            print("Could not create a processor configuration. The document might be locked or invalid.")
            return
        }

        // Crop the page to 200×200 pt.
        configuration.changeCropBoxForPage(at: 0, to: CGRect(x: 0, y: 0, width: 200, height: 200))

        let editedDocumentURL = URL(filePath: NSTemporaryDirectory() + "/document-cropped.pdf")

        let processor = Processor(configuration: configuration, securityOptions: nil)
        do {
            // Write the modified document. `editedDocumentURL` can be used
            // to initialize and present the edited document.
            try processor.write(toFileURL: editedDocumentURL)
        } catch {
            print(error)
        }

        let editedDocument = Document(url: editedDocumentURL)

        // The configuration closure is optional and allows additional customization.
        let pdfController = PDFViewController(document: editedDocument)

        // Present the PDF view controller within a `UINavigationController` to show built-in toolbar buttons.
        present(UINavigationController(rootViewController: pdfController), animated: true)

    }
}

```

Make sure that the file path used in `editedDocumentURL` is unique in the containing directory so that existing documents aren’t overwritten.![Cropping a PDF page to a 200×200 pt box in the iOS Simulator](@/assets/images/blog/2023/how-to-edit-pdfs-using-ios-pdf-library/crop.gif)

## Moving PDF pages using the Processor class

To move pages via the [`Processor`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor) API, configure the page move parameters on a [`Processor.Configuration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor/configuration) instance:

```swift

// Move the first page to the end of the document.
configuration.movePages(IndexSet(integer: 0), toDestinationIndex: document.pageCount)

```![Moving the first PDF page to the end of the document in the iOS Simulator](@/assets/images/blog/2023/how-to-edit-pdfs-using-ios-pdf-library/move.gif)

## Removing pages using the Processor class

To remove pages via the [`Processor`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor) API, configure the page removal parameters on a [`Processor.Configuration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor/configuration) instance:

```swift

// Remove the first page. This API can be used to remove multiple pages at the same time.
configuration.removePages(IndexSet(integer: 0))

```![Removing the first page from a PDF in the iOS Simulator](@/assets/images/blog/2023/how-to-edit-pdfs-using-ios-pdf-library/remove_page.gif)

## Adding new pages using the Processor class

For this example, you’ll add a blank page to your document using the [`Processor`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor) API. You can add a blank page to a document using the [`.blank`](https://www.nutrient.io/guides/ios/editor/add-page/) template document.

1. Create a blank page template:

   ```swift

   let pageTemplate = PageTemplate(pageType:.emptyPage, identifier:.blank)
   ```

2. Create a new page configuration:

   ```swift

   let newPageConfiguration = PDFNewPageConfiguration(pageTemplate: pageTemplate, builderBlock: nil)
   ```

3. Configure the add new page parameters:

   ```swift

   configuration.addNewPage(at: 1, configuration: newPageConfiguration)
   ```

You’ll have the following in your `ViewController.swift`:

```swift

import UIKit
import PSPDFKit
import PSPDFKitUI

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        let fileURL = Bundle.main.url(forResource: "YOUR-DOCUMENT", withExtension: "pdf")!
        let document = Document(url: fileURL)

        guard let configuration = Processor.Configuration(document: document) else {
            print("Could not create a processor configuration. The document might be locked or invalid.")
            return
        }

        // Create a blank page template.
        let pageTemplate = PageTemplate(pageType:.emptyPage, identifier:.blank)
        // Create a new page configuration.
        let newPageConfiguration = PDFNewPageConfiguration(pageTemplate: pageTemplate, builderBlock: nil)
        // Add the blank page at index 1.
        configuration.addNewPage(at: 1, configuration: newPageConfiguration)

        let editedDocumentURl = URL(filePath: NSTemporaryDirectory() + "/document-new-page.pdf")

        let processor = Processor(configuration: configuration, securityOptions: nil)
        do {
            // Write the modified document. `editedDocumentURL` can be used
            // to initialize and present the edited document.
            try processor.write(toFileURL: editedDocumentURl)
        } catch {
            print(error)
        }

        let editedDocument = Document(url: editedDocumentURl)

        // The configuration closure is optional and allows additional customization.
        let pdfController = PDFViewController(document: editedDocument)

        // Present the PDF view controller within a `UINavigationController` to show built-in toolbar buttons.
        present(UINavigationController(rootViewController: pdfController), animated: true)

    }
}

```![Adding a blank page at index 1 of a PDF in the iOS Simulator](@/assets/images/blog/2023/how-to-edit-pdfs-using-ios-pdf-library/new_page.gif)

## Editing text in PDFs

Nutrient enables you to edit text directly in PDF documents using the built-in user interface via Content Editor. You can change the text color, the font type, and the font size, and you can move and resize text boxes. Content Editor is a separately licensed component — [reach out](https://www.nutrient.io/contact-sales/?=sdk) to add it to your license.

To enable content editing programmatically after loading a document, set the [view mode](https://www.nutrient.io/api/ios/documentation/pspdfkitui/viewmode) to [`.contentEditing`](https://www.nutrient.io/api/ios/documentation/pspdfkitui/viewmode/contentediting):

```swift

let controller = PDFViewController(document: document)
controller.setViewMode(.contentEditing, animated: true)

```

For a working example, replace the contents of `ViewController.swift` with the following:

```swift

import UIKit
import PSPDFKit
import PSPDFKitUI

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
       super.viewDidAppear(animated)

       // Update to use your document name.
       let fileURL = Bundle.main.url(forResource: "YOUR-DOCUMENT", withExtension: "pdf")!
       let document = Document(url: fileURL)

       let controller = PDFViewController(document: document)
       controller.setViewMode(.contentEditing, animated: true)
       present(UINavigationController(rootViewController: controller), animated: true)

   }
}

```![Editing PDF text in content-editing mode in the iOS Simulator](@/assets/images/blog/2023/how-to-edit-pdfs-using-ios-pdf-library/text_editing.png)

## Attaching files to PDFs

You can programmatically attach embedded files to a [`FileAnnotation`](https://www.nutrient.io/api/ios/documentation/pspdfkit/fileannotation) object. You can create a file annotation with an embedded file using the URL of any file.

A working example looks like this:

```swift

import UIKit
import PSPDFKit
import PSPDFKitUI

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        // Update to use your document name.
        let fileURL = Bundle.main.url(forResource: "YOUR-DOCUMENT", withExtension: "pdf")!
        let document = Document(url: fileURL)

        // Create a new file annotation and set its properties.
        let fileAnnotation = FileAnnotation()
        fileAnnotation.pageIndex = 0
        fileAnnotation.iconName =.graph
        fileAnnotation.color =.blue
        fileAnnotation.boundingBox = CGRect(x: 500, y: 250, width: 32, height: 32)

        let embeddedFileURL = Bundle.main.url(forResource: "DOCUMENT-TO-EMBED", withExtension: "pdf")!
        let embeddedFile = EmbeddedFile(fileURL: embeddedFileURL, fileDescription: "Sample Document")
        fileAnnotation.embeddedFile = embeddedFile

        document.add(annotations: [fileAnnotation])

        // The configuration closure is optional and allows additional customization.
        let pdfController = PDFViewController(document: document)

        // Present the PDF view controller within a `UINavigationController` to show built-in toolbar buttons.
        present(UINavigationController(rootViewController: pdfController), animated: true)

    }
}

```![Attaching an embedded file to a PDF page with a file annotation in the iOS Simulator](@/assets/images/blog/2023/how-to-edit-pdfs-using-ios-pdf-library/attact_files.gif)

## Adding watermarks to PDFs using the Processor class

Nutrient enables you to draw a permanent watermark on all pages of a document using the [`Processor`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor) API. The resulting PDF file will have a permanent watermark on all of its pages, even when opened in other PDF editors:

```swift

configuration.drawOnAllCurrentPages { context, pageIndex, pageRect, renderOptions in
    // Careful. This code is executed on background threads. Only use thread-safe drawing methods.
    let text = "Nutrient Live Watermark On Page \(pageIndex + 1)"
    let stringDrawingContext = NSStringDrawingContext()
    stringDrawingContext.minimumScaleFactor = 0.1

    // Add text over the diagonal of the page.
    context.translateBy(x: 0, y: pageRect.size.height / 2)
    context.rotate(by: -.pi / 4)
    let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.boldSystemFont(ofSize: 30),.foregroundColor: UIColor.red.withAlphaComponent(0.5)
    ]
    text.draw(with: pageRect, options:.usesLineFragmentOrigin, attributes: attributes, context: stringDrawingContext)
}

```

For a working example, replace the contents of `ViewController.swift` with the following:

```swift

import UIKit
import PSPDFKit
import PSPDFKitUI

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
       super.viewDidAppear(animated)

       // Update to use your document name.
       let fileURL = Bundle.main.url(forResource: "document-ios", withExtension: "pdf")!
       let document = Document(url: fileURL)

       guard let configuration = Processor.Configuration(document: document) else {
           print("Could not create a processor configuration. The document might be locked or invalid.")
           return
       }

       configuration.drawOnAllCurrentPages { context, pageIndex, pageRect, renderOptions in
           // Careful. This code is executed on background threads. Only use thread-safe drawing methods.
           let text = "Nutrient Live Watermark On Page \(pageIndex + 1)"
           let stringDrawingContext = NSStringDrawingContext()
           stringDrawingContext.minimumScaleFactor = 0.1

           // Add text over the diagonal of the page.
           context.translateBy(x: 0, y: pageRect.size.height / 2)
           context.rotate(by: -.pi / 4)
           let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.boldSystemFont(ofSize: 30),.foregroundColor: UIColor.red.withAlphaComponent(0.5)
           ]
           text.draw(with: pageRect, options:.usesLineFragmentOrigin, attributes: attributes, context: stringDrawingContext)
       }

        let editedDocumentURl = URL(filePath: NSTemporaryDirectory() + "/document-watermark.pdf")

       let processor = Processor(configuration: configuration, securityOptions: nil)
       do {
           // Write the modified document. `editedDocumentURL` can be used
           // to initialize and present the edited document.
           try processor.write(toFileURL: editedDocumentURl)
       } catch {
           print(error)
       }

       let editedDocument = Document(url: editedDocumentURl)

       // The configuration closure is optional and allows additional customization.
       let pdfController = PDFViewController(document: editedDocument)

       // Present the PDF view controller within a `UINavigationController` to show built-in toolbar buttons.
       present(UINavigationController(rootViewController: pdfController), animated: true)

   }

}

```![Drawing a permanent diagonal watermark on every PDF page in the iOS Simulator](@/assets/images/blog/2023/how-to-edit-pdfs-using-ios-pdf-library/watermark.gif)

## Apple PDFKit vs. Nutrient

iOS includes Apple’s PDFKit, a system framework that’s easy to integrate and a solid starting point for displaying PDFs. It provides a viewer (`PDFView`), thumbnails, text selection and extraction, the document outline, and basic annotations.

Where a dedicated library earns its place is the editing and document work beyond viewing. Compared to PDFKit, Nutrient iOS SDK adds:

- A configurable UI that supports most PDF features

- Every annotation type in the PDF specification, with import and export in JSON and XFDF

- Programmatic form filling

- Electronic and digital signatures

- Page editing — add, remove, duplicate, rotate, and extract pages

- Permanent watermarks and access to embedded files

- Indexed full-text search with near-instant results

- First-class support from our engineers

If you only need to display PDFs and add the occasional basic annotation, PDFKit may be enough. If your app needs to edit, annotate, fill, sign, or search documents, that’s where Nutrient fits. To move an existing PDFKit integration over, the [migrating from Apple PDFKit guide](https://www.nutrient.io/guides/ios/migration-guides/migrating-from-apple-pdfkit.md) maps the APIs across.

## Conclusion

In this post, you learned how to edit a PDF document using Nutrient’s iOS PDF editor library. If you hit any snags while trying to implement any of the steps, reach out to our [Support team](https://www.nutrient.io/support/request) for help. If you want to learn more about how you can use Nutrient’s iOS library in your projects, you can [reach out](https://www.nutrient.io/contact-sales/?=sdk) to our team.
---

## Related pages

- [The business case for accessibility: Five ways it drives enterprise value](/blog/5-ways-accessibility-drives-enterprise-value.md)
- [Accessibility Untangled Why It Matters Guide](/blog/accessibility-untangled-why-it-matters-guide.md)
- [Advanced Techniques For React Native Ui Components](/blog/advanced-techniques-for-react-native-ui-components.md)
- [`vector_store` holds your indexed documents (see the multimodal RAG post](/blog/agentic-rag.md)
- [Ai Document Automation Extraction To Action](/blog/ai-document-automation-extraction-to-action.md)
- [Ai Legal Assistant Document Authoring](/blog/ai-legal-assistant-document-authoring.md)
- [Angular File Viewer Pdf Image Office Files](/blog/angular-file-viewer-pdf-image-office-files.md)
- [Auto Tagging And Document Accessibility In Dotnet Sdk](/blog/auto-tagging-and-document-accessibility-in-dotnet-sdk.md)
- [Best Document Viewers](/blog/best-document-viewers.md)
- [The CEO’s AI playbook: Why decision architecture beats model selection](/blog/ceo-ai-playbook-decision-architecture.md)
- [1. Extract and chunk the PDF.](/blog/chat-with-pdf.md)
- [Complete Guide To Pdfjs](/blog/complete-guide-to-pdfjs.md)
- [Construction Document Data Extraction](/blog/construction-document-data-extraction.md)
- [Convert One Drive Files To Pdf In Sharepoint](/blog/convert-one-drive-files-to-pdf-in-sharepoint.md)
- [Create And Edit Pdfs In Flutter](/blog/create-and-edit-pdfs-in-flutter.md)
- [Create Pdfs With React](/blog/create-pdfs-with-react.md)
- [Creating A Document Scanner With Ocr In Python](/blog/creating-a-document-scanner-with-ocr-in-python.md)
- [Creating And Filling Pdf Forms Programmatically In Javascript](/blog/creating-and-filling-pdf-forms-programmatically-in-javascript.md)
- [The CTO’s AI playbook: Why accountability architecture beats orchestration](/blog/cto-ai-playbook-accountability-architecture.md)
- [Digital Signatures](/blog/digital-signatures.md)
- [Digital Workflow Automation](/blog/digital-workflow-automation.md)
- [Document Ai Vs Ocr](/blog/document-ai-vs-ocr.md)
- [Document Viewer](/blog/document-viewer.md)
- [Document Watermarking](/blog/document-watermarking.md)
- [Emerging threats: Your logging system may be an agentic threat vector](/blog/emerging-threats-your-logging-system.md)
- [app.py](/blog/extract-text-from-pdf-using-python.md)
- [How To Add Digital Signature To Pdf Using React](/blog/how-to-add-digital-signature-to-pdf-using-react.md)
- [How To Build A Dotnet Maui Pdf Viewer](/blog/how-to-build-a-dotnet-maui-pdf-viewer.md)
- [How To Build A Flutter Pdf Viewer](/blog/how-to-build-a-flutter-pdf-viewer.md)
- [or](/blog/how-to-build-a-javascript-pdf-viewer-with-pdfjs.md)
- [How To Build A Javascript Pdf Viewer](/blog/how-to-build-a-javascript-pdf-viewer.md)
- [or](/blog/how-to-build-a-nextjs-pdf-viewer.md)
- [How To Build A Powerpoint Viewer Using Javascript](/blog/how-to-build-a-powerpoint-viewer-using-javascript.md)
- [Using Yarn](/blog/how-to-build-a-react-excel-viewer.md)
- [How To Build A React Native Pdf Viewer](/blog/how-to-build-a-react-native-pdf-viewer.md)
- [How To Build A React Powerpoint Viewer](/blog/how-to-build-a-react-powerpoint-viewer.md)
- [How To Build A Reactjs File Viewer](/blog/how-to-build-a-reactjs-file-viewer.md)
- [or](/blog/how-to-build-a-reactjs-pdf-viewer-with-react-pdf.md)
- [or](/blog/how-to-build-a-reactjs-pdf-viewer.md)
- [How To Build A Reactjs Viewer With Pdfjs](/blog/how-to-build-a-reactjs-viewer-with-pdfjs.md)
- [How To Build A Vuejs Pdf Viewer With Pdfjs](/blog/how-to-build-a-vuejs-pdf-viewer-with-pdfjs.md)
- [How To Build A Vuejs Pdf Viewer](/blog/how-to-build-a-vuejs-pdf-viewer.md)
- [How To Build An Android Pdf Viewer](/blog/how-to-build-an-android-pdf-viewer.md)
- [How To Build An Angular Pdf Viewer With Ng2 Pdf Viewer](/blog/how-to-build-an-angular-pdf-viewer-with-ng2-pdf-viewer.md)
- [How To Build An Angular Pdf Viewer With Pdfjs](/blog/how-to-build-an-angular-pdf-viewer-with-pdfjs.md)
- [How To Convert Docx To Pdf Using Javascript](/blog/how-to-convert-docx-to-pdf-using-javascript.md)
- [How To Convert Docx To Pdf Using Python](/blog/how-to-convert-docx-to-pdf-using-python.md)
- [How To Convert Html To Pdf Using Html2pdf](/blog/how-to-convert-html-to-pdf-using-html2pdf.md)
- [or](/blog/how-to-convert-html-to-pdf-using-react.md)
- [or](/blog/how-to-convert-html-to-pdf-using-wkhtmltopdf-and-python.md)
- [How To Convert Word To Pdf In Nodejs](/blog/how-to-convert-word-to-pdf-in-nodejs.md)
- [or](/blog/how-to-create-a-react-js-signature-pad.md)
- [How To Create Pdfs With React To Pdf](/blog/how-to-create-pdfs-with-react-to-pdf.md)
- [How To Embed A Pdf Viewer In Your Website](/blog/how-to-embed-a-pdf-viewer-in-your-website.md)
- [How To Generate Pdf From Html With Nodejs](/blog/how-to-generate-pdf-from-html-with-nodejs.md)
- [base_url tells WeasyPrint where to resolve relative asset paths](/blog/how-to-generate-pdf-reports-from-html-in-python.md)
- [Open an image.](/blog/how-to-use-tesseract-ocr-in-python.md)
- [From an HTML string.](/blog/html-in-pdf-format.md)
- [Javascript Pdf Libraries](/blog/javascript-pdf-libraries.md)
- [Linearized Pdf](/blog/linearized-pdf.md)
- [Swift Package Manager](/blog/mobile-pdf-sdk.md)
- [`elements` come from your document parser — each has a type and content.](/blog/multimodal-rag.md)
- [Nutrient Vs Conga Composer](/blog/nutrient-vs-conga-composer.md)
- [Online Document Viewer](/blog/online-document-viewer.md)
- [Open Pdf In Your Web App](/blog/open-pdf-in-your-web-app.md)
- [Pdf Extraction Benchmark Opendataloader Bench](/blog/pdf-extraction-benchmark-opendataloader-bench.md)
- [Pdf Page Labels](/blog/pdf-page-labels.md)
- [Pdf Sdk Compliance Security Checklist](/blog/pdf-sdk-compliance-security-checklist.md)
- [Pdf Sdk Performance Benchmark](/blog/pdf-sdk-performance-benchmark.md)
- [Pdf Ua Compliance Guide](/blog/pdf-ua-compliance-guide.md)
- [Pdfjs Annotation Editor Layer](/blog/pdfjs-annotation-editor-layer.md)
- [Pdfjs Area Annotations Canvas Capture](/blog/pdfjs-area-annotations-canvas-capture.md)
- [Pdfjs Coordinate Systems Pdf To Screen](/blog/pdfjs-coordinate-systems-pdf-to-screen.md)
- [Pdfjs Eventbus Guide](/blog/pdfjs-eventbus-guide.md)
- [Pdfjs Limitations Commercial Upgrade](/blog/pdfjs-limitations-commercial-upgrade.md)
- [Pdfjs Native Annotation Layer Forms](/blog/pdfjs-native-annotation-layer-forms.md)
- [Pdfjs Navigation Zoom Rotation](/blog/pdfjs-navigation-zoom-rotation.md)
- [Pdfjs Pdf Page Manipulation Pdf Lib](/blog/pdfjs-pdf-page-manipulation-pdf-lib.md)
- [Pdfjs React Viewer Setup](/blog/pdfjs-react-viewer-setup.md)
- [Pdfjs Rendering Overlays React Portals](/blog/pdfjs-rendering-overlays-react-portals.md)
- [Pdfjs Server Side Text Extraction](/blog/pdfjs-server-side-text-extraction.md)
- [Pdfjs Sticky Note Annotations](/blog/pdfjs-sticky-note-annotations.md)
- [Pdfjs Text Highlight Annotations](/blog/pdfjs-text-highlight-annotations.md)
- [Pdfjs Text Search Pdffindcontroller](/blog/pdfjs-text-search-pdffindcontroller.md)
- [Pdfjs Thumbnail Sidebar](/blog/pdfjs-thumbnail-sidebar.md)
- [Process Flows](/blog/process-flows.md)
- [React Native Pdf Annotation](/blog/react-native-pdf-annotation.md)
- [or](/blog/sample-blog-updated.md)
- [Add DWS MCP Server to your Claude Code project.](/blog/teaching-llms-to-read-pdfs.md)
- [Open an image file.](/blog/tesseract-python-guide.md)
- [Top 5 Javascript Pdf Viewers](/blog/top-5-javascript-pdf-viewers.md)
- [Convert an HTML file to PDF.](/blog/top-ten-ways-to-convert-html-to-pdf.md)
- [Vector Pdf](/blog/vector-pdf.md)
- [Wcag2 Accessibility Requirements Documents](/blog/wcag2-accessibility-requirements-documents.md)
- [Web Sdk Is Now Headless](/blog/web-sdk-is-now-headless.md)
- [What Are Annotations](/blog/what-are-annotations.md)
- [What Is A Vpat](/blog/what-is-a-vpat.md)
- [What Is Pdf Ua](/blog/what-is-pdf-ua.md)
- [Why Pdfium Is A Trusted Platform For Pdf Rendering](/blog/why-pdfium-is-a-trusted-platform-for-pdf-rendering.md)
- [Why Your Ai Agent Hallucinates Pdf Table Data](/blog/why-your-ai-agent-hallucinates-pdf-table-data.md)

