Build with PDF-SDK
One editor engine, shipped as a drop-in editor for the browser, iOS, iPadOS, Mac Catalyst and Android — and for Flutter and React Native through them — with a document API that does every edit from code. Pick your platform to integrate it in a few minutes.
Pick your platform
- WebA
<canvas>and one class,PDFEditor, running the engine as WebAssembly. - iOS, iPadOS & Mac CatalystSwiftUI and UIKit views for iPhone, iPad and the Mac. Swift Package Manager.
- AndroidA Jetpack Compose screen or a classic
View. One Maven dependency. - FlutterOne Dart call opens the native iOS or Android editor and returns the edited file.
- React NativeThe same call from JavaScript, over the same native editors.
How it works
Every platform runs the same engine. It reads, renders and writes the document, and the editing logic — layout, hit-testing, selection, text editing, undo, forms, signing — lives in the engine, not in the platform wrapper. So a document edits the same way on every platform, and a fix reaches all of them at once.
| Platform | You add | You get |
|---|---|---|
| Web | @pdfsdk/editor + the wasm/ folder | PDFEditor over a canvas you provide; you build the chrome |
| iOS · iPadOS · Catalyst | Swift package, product PDFEditorUI | PDFEditorView / PDFEditorViewController — the complete editor UI |
| Android | com.pdfsdk:pdfeditor | PdfEditorScreen (Compose) / PdfEditorView — the complete editor UI |
| Flutter | the pdf_editor plugin | PdfEditor.open(…) — the native editor, full screen, and the edited file back |
| React Native | @pdfsdk/react-native-pdf-editor | PdfEditor.open(…) — the same, from JavaScript |
Integration in three steps
- Add the package for your platform. Access to the packages comes with your license.
- Set your license key once at startup — the key issued for your domain, bundle identifier or package name. Without a valid key the editor does not open documents. See License keys.
- Open a PDF and receive the edited document when the user saves — the bytes on iOS, Android and the web, a file path in Flutter and React Native.
What the editor does
- Edit the text already in the file — retype, restyle (bold, italic, underline, strike, colour, size, font), move and resize it in the document's own fonts, with every script shaped correctly.
- Every object is a layer — select, move, resize, rotate, recolour, duplicate and delete text, images and vector paths; group and multi-select.
- Markup and drawing — highlight, underline, strikeout, squiggly; freehand ink, rectangles, ellipses, lines and arrows; notes, stamps, links, and sounds on the web.
- Forms — fill AcroForm fields, author new ones (text, check box, radio, list, dropdown; not on Mac Catalyst), flatten.
- Pages — insert, duplicate, rotate, reorder and delete.
- Signatures — draw a signature, or apply a real PKCS#7 digital signature and verify existing ones.
- Undo everything — a per-page history, with structural page operations included.
- Encrypted documents open with their password and are saved encrypted with the same one.
Output is a real vector PDF — edits are written back as PDF objects, never as a flattened picture.
All of this is in the iOS, Android and web editors, and in Flutter and React Native through them. On the Mac (Mac Catalyst) the editor has everything except the Form Editor mode.
Customize the editor
One configuration shapes the editor, and it means the same thing on iOS, Android, Flutter and React Native: which modes and tools appear and in what order, their names and icons, the colour scheme, selection and search colours, handle shape and size, your fonts in the font picker, the first-use style of each markup tool and the pen, the zoom range, haptics and first-run hints. iOS and Android also take your own tools and menu items, which call your code with the document as it stands. On the web your page draws the toolbar, so the same choices are calls on the editor. Every option narrows or restyles; leave it out and the editor stays as it ships.
| Platform | Where |
|---|---|
| iOS & Mac Catalyst | PDFEditorConfiguration — iOS guide |
| Android | PdfEditorConfiguration — Android guide |
| Web | Calls on PDFEditor — Look and feel, coming from iOS or Android |
| Flutter | PdfEditorConfiguration — Flutter guide |
| React Native | The configuration option — React Native guide |
Edit documents from code
Everything a user can do in the editor can be done from code. Open a PDF with no UI — a templating, translation or form-filling job — or reach the document an editor is showing, where each change appears at once and undoes like an edit by hand.
- Read every layer of a page — text, image, note, signature, drawing, sound, shape, vector — with its frame, rotation, opacity, stacking, link, and for text its font, size, style and colour; the page's text; search matches; form fields; metadata.
- Change a text layer's text in any script (the font, size, colour and position stay; the system's fonts fill in letters the layer's font lacks; it can shrink to fit), its font and style, any layer's colour, stroke, opacity, frame, rotation, stacking, link or picture; mark text up; delete, duplicate or copy layers.
- Create text, images (a photo, signature, drawing or stamp), shapes and form fields.
- Pages and documents — insert, delete, move, duplicate and rotate pages, import pages from another PDF, extract pages into a new one, render a page, undo and redo, save.
A layer is addressed by its page and an id that keeps naming it while other layers change, are added or are removed. Geometry is in page points from the top-left corner.
| Platform | Headless | The document an editor shows |
|---|---|---|
| iOS & Mac Catalyst | PDFDocumentEditor(data:) | onDocumentReady — guide |
| Android | PdfDocumentEditor(bytes) | onDocumentReady — guide |
| Web | PDFDocumentEditor.open(bytes) | editor.document — guide |
| Flutter | PdfDocument.open(bytes) | PdfEditor.open(onDocumentReady:) — guide |
| React Native | PdfDocument.open(base64) | PdfEditor.open({ onDocumentReady }) — guide |
Localize the editor
Every word the editor shows has a key, the same on every platform, with English as its built-in text. Give text for the keys you want translated — a dictionary, or on iOS and Android a lookup function — and the rest stay English. With nothing set, the editor uses your app's own translations in its current language. Right-to-left languages mirror the editor. See iOS, Android, Flutter and React Native; the web SDK draws no words of its own beyond a new text box's starting text.
API reference
Every public type and member, generated from each SDK's sources:
| Platform | Reference |
|---|---|
| Web | Web API reference — PDFEditor, the document API, digital signatures |
| iOS, iPadOS & Mac Catalyst | iOS API reference — module PDFEditorUI |
| Android | Android API reference — package com.pdfsdk.editor |
| Flutter | Flutter API reference — package pdf_editor |
| React Native | React Native API reference — @pdfsdk/react-native-pdf-editor |
Requirements
| Platform | Minimum | Notes |
|---|---|---|
| iOS / iPadOS | 15 | Swift 6 toolchain; built and tested with Xcode 27 |
| Mac Catalyst | 15 | Apple silicon and Intel |
| Android | API 26 (Android 8.0) | arm64-v8a; 16 KB page-size compatible |
| Web | WebAssembly, WebGL2, SharedArrayBuffer | Served over HTTPS with COOP + COEP — see Hosting |
Browsers, devices and toolchains in detail: System requirements.
Getting help
Questions about licensing, pricing or a trial key go to sales. Integration questions come with your support plan — see Pricing.