SOFTWARE DEVELOPMENT KITS
PDF SDKs built by developers, for developers — to add high-performance viewing, editing, signing, redaction, and data extraction to any app. Powered by AI. Trusted across web, mobile, and server.
Build exactly where your users are — with full control, high performance, and deep integration across every platform.
Embed fast, full-featured document viewing into your web app — with support for React, Angular, Vue, and other modern frameworks.
Add scalable document processing to your backend — generate, convert, compress, extract, automate, and more with .NET or Node.js.
Deliver smooth, native PDF viewing on iOS, Android, and cross-platform apps — with high-fidelity rendering and a customizable UI.
Integrate document generation, editing, and signing into your app with cross-platform SDKs built by developers, for developers. Explore features, tweak the UI, and export working code in seconds.
Nutrient Web SDK
import PSPDFKit from "pspdfkit";
// Obtain a PSPDFKit document instance.const instance = await PSPDFKit.load({ container: "#pspdfkit", document: "<document-file-path>", licenseKey: "<license-key>"});
console.log("PSPDFKit for Web is ready!");console.log(instance);
Document Authoring Library
import DocAuth from '@pspdfkit/document-authoring';
const docAuthSystem = await DocAuth.createDocAuthSystem({ licenseKey: '<license-key>',});
const editor = await docAuthSystem.createEditor( document.getElementById('editor'), { document: await docAuthSystem.createDocumentFromPlaintext('Hi there!'), });
Nutrient iOS SDK
import PSPDFKitimport PSPDFKitUIimport SwiftUI
// A `Document` is the container for your PDF file.let document = Document(url: documentURL)
var body: some View { // A `PDFView` will present and manage the PSPDFKit UI. PDFView(document: document) .scrollDirection(.vertical) .pageTransition(.scrollContinuous) .pageMode(.single)}
- (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { // Set configuration to use the custom annotation toolbar when initializing the `PSPDFViewController`. // For more details, see `PSCCustomizeAnnotationToolbarExample.m` from PSPDFCatalog and our documentation here: https://pspdfkit.com/guides/ios/customizing-the-interface/customize-the-annotation-toolbar/ _pdfController = [[PSPDFViewController alloc] initWithDocument:nil configuration:[PSPDFConfiguration configurationWithBuilder:^(PSPDFConfigurationBuilder *builder) { [builder overrideClass:PSPDFAnnotationToolbar.class withClass:CustomButtonAnnotationToolbar.class]; }]];
_pdfController.delegate = self; _pdfController.annotationToolbarController.delegate = self; _closeButton = [[UIBarButtonItem alloc] initWithImage:[PSPDFKitGlobal imageNamed:@"x"] style:UIBarButtonItemStylePlain target:self action:@selector(closeButtonPressed:)];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(annotationChangedNotification:) name:PSPDFAnnotationChangedNotification object:nil]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(annotationChangedNotification:) name:PSPDFAnnotationsAddedNotification object:nil]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(annotationChangedNotification:) name:PSPDFAnnotationsRemovedNotification object:nil]; }
return self;}
Nutrient Android SDK
package com.your.package
import android.net.Uriimport android.os.Bundleimport androidx.appcompat.app.AppCompatActivityimport com.pspdfkit.ui.PdfActivityIntentBuilder
// We need to use a Compat activity for the PdfFragment.class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
// Get the document path from the application assets. val documentUri = Uri.parse("file:///android_asset/document.pdf")
// Build the `Intent` for launching the `PdfActivity`. val intent = PdfActivityIntentBuilder.fromUri(this, documentUri) .build() startActivity(intent) }}
package com.your.package;
import android.net.Uri;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;import com.pspdfkit.ui.PdfActivityIntentBuilder;
// We need to use a Compat activity for the PdfFragment.public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
// Get the document path from the application assets. Uri documentUri = Uri.parse("file:///android_asset/document.pdf");
// Build the Intent for launching the PdfActivity. Intent intent = PdfActivityIntentBuilder.fromUri(this, documentUri) .build(); startActivity(intent); }}
Nutrient Flutter SDK
import 'dart:io';
import 'package:flutter/material.dart';import 'package:path_provider/path_provider.dart';import 'package:pspdfkit_flutter/pspdfkit.dart';
const String DOCUMENT_PATH = 'PDFs/Document.pdf';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {@override_MyAppState createState() => _MyAppState();}
class _MyAppState extends State<MyApp> {void showDocument(BuildContext context) async { final bytes = await DefaultAssetBundle.of(context).load(DOCUMENT_PATH); final list = bytes.buffer.asUint8List();
final tempDir = await getTemporaryDirectory(); final tempDocumentPath = '${tempDir.path}/$DOCUMENT_PATH';
final file = await File(tempDocumentPath).create(recursive: true); file.writeAsBytesSync(list);
await Pspdfkit.present(tempDocumentPath);}
@overrideWidget build(BuildContext context) { final theme = Theme.of(context); return MaterialApp( home: Scaffold(body: Center( child: ElevatedButton( onPressed: () => showDocument(context), child: Text('Show Document'), ) ) ) );}}
Nutrient React Native SDK
import React, {Component} from 'react';import {Platform} from 'react-native';import PSPDFKitView from 'react-native-pspdfkit';
const DOCUMENT = Platform.OS === 'ios' ? 'Document.pdf' : 'file:///android_asset/Document.pdf';export default class PSPDFKitDemo extends Component<{}> { render() { return ( <PSPDFKitView document={DOCUMENT} configuration={{ showThumbnailBar: 'scrollable', pageTransition: 'scrollContinuous', scrollDirection: 'vertical', }} ref={this.pdfRef} fragmentTag="PDF1" style={{flex: 1}} /> ); }}
Nutrient for Cordova
// Install the plugin first:// cordova plugin add pspdfkit-cordova
document.addEventListener('deviceready', function() { // Open a PDF document PSPDFKit.present('document.pdf', { pageTransition: 'scrollContinuous', scrollDirection: 'vertical', backgroundColor: '#FFFFFF' });}, false);
Nutrient for Xamarin
using PSPDFKit.Model;using PSPDFKit.UI;using PSPDFKit.Instant;
var configuration = PSPDFConfiguration.FromConfigurationBuilder ((builder) => { builder.PageMode = PSPDFPageMode.Single; builder.PageTransition = PSPDFPageTransition.ScrollContinuous; builder.ScrollDirection = PSPDFScrollDirection.Vertical;}));
var document = new PSPDFDocument (NSUrl.FromFilename ("document.pdf"));var pdfViewController = new PSPDFViewController (document, configuration);
Nutrient for Ionic
import { Component } from '@angular/core';import { PSPDFKit } from '@ionic-native/pspdfkit/ngx';
@Component({ selector: 'app-pdf', templateUrl: 'pdf.page.html'})export class PdfPage { constructor(private pspdfkit: PSPDFKit) {}
openPDF() { this.pspdfkit.present('document.pdf', { pageTransition: 'scrollContinuous', scrollDirection: 'vertical' }); }}
Nutrient .NET SDK
using (GdPictureDocumentConverter oConverter = new GdPictureDocumentConverter()){ // Select the source document and its file format (DOCX, DOC, XLSX, XLS, PPTX, PPT). oConverter.LoadFromFile("input.docx", GdPicture14.DocumentFormat.DocumentFormatDOCX); // Convert the source document to PDF. oConverter.SaveAsPDF("output.pdf", PdfConformance.PDF);}
Using oConverter As GdPictureDocumentConverter = New GdPictureDocumentConverter() 'Select the source document and its file format (DOCX, DOC, XLSX, XLS, PPTX, PPT). oConverter.LoadFromFile("input.docx", GdPicture14.DocumentFormat.DocumentFormatDOCX) 'Convert the source document to PDF. oConverter.SaveAsPDF("output.pdf", PdfConformance.PDF)End Using
Document Engine
# You simply supply a list of document operations to apply.curl -F file=@Example.pdf \ -F operations='{"operations":[{"type": "flattenAnnotations"}]}' \ http://localhost:5000/process \ --output result.pdf
Nutrient Java SDK
// Initialize PSPDFKit with your activation key.PSPDFKit.initialize("YOUR_LICENSE_KEY_GOES_HERE");
// Open a document to work on.File file = new File("assets/default.pdf");PdfDocument document = new PdfDocument(new FileDataProvider(file));
// Add a new stamp annotation.JSONObject jsonObject = new JSONObject();jsonObject.put("bbox", new float[]{0, 0, 100, 50});jsonObject.put("pageIndex", 0);jsonObject.put("type", "pspdfkit/stamp");jsonObject.put("stampType", "Approved");jsonObject.put("opacity", 1);jsonObject.put("v", 1);document.getAnnotationProvider().addAnnotationJson(jsonObject);
// Export the changes to Instant Document JSON.File jsonFile = new File("out/instantOutput.json");if (jsonFile.createNewFile()) { document.exportDocumentJson(new FileDataProvider(jsonFile));}
// Render the first page and save to a PNG.BufferedImage image = document.getPage(0).renderPage();File pngfile = new File("out/test.png");boolean success = ImageIO.write(image, "png", pngfile);}
Managed Document Engine
# You simply supply a list of document operations to apply.curl -F file=@Example.pdf \ -F operations='{"operations":[{"type": "flattenAnnotations"}]}' \ http://localhost:5000/process \ --output result.pdf
Nutrient for Windows
// This loads a PDF from `Assets` as soon as the `PdfView` is ready.private async void PdfViewInitializationCompletedHandler(PdfView sender, Document args){ try { var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/document.pdf")); if (file == null) return;
await sender.OpenStorageFileAsync(file); } catch (Exception e) { var messageDialog = new MessageDialog(e.Message); await messageDialog.ShowAsync(); }}
// This loads a PDF from a file picked by the user in the UI.private async void Button_OpenPDF_Click(object sender, RoutedEventArgs e){ // Open a `Picker` so the user can choose a PDF. var picker = new FileOpenPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.DocumentsLibrary }; picker.FileTypeFilter.Add(".pdf");
var file = await picker.PickSingleFileAsync(); if (file == null) return;
// Open and display it in the PSPDFKit `PdfView`. var documentSource = DocumentSource.CreateFromStorageFile(file); await PdfView.Controller.ShowDocumentAsync(documentSource);}
Imports Windows.StorageImports Windows.Storage.PickersImports PSPDFKit.DocumentImports PSPDFKit.PdfImports PSPDFKit.UI
Public NotInheritable Class MainPageInherits Page
Private Async Sub PdfViewInitializationCompletedHandler(sender As PdfView, args As Document)Dim file As StorageFilefile = Await StorageFile.GetFileFromApplicationUriAsync(New Uri("ms-appx:///Assets/document.pdf"))
If file IsNot Nothing ThenAwait sender.OpenStorageFileAsync(file)End IfEnd Sub
Private Async Sub Button_OpenPDF_Click(sender As Object, e As RoutedEventArgs)Dim picker As New FileOpenPickerpicker.FileTypeFilter.Add(".pdf")
Dim file = Await picker.PickSingleFileAsyncIf file IsNot Nothing ThenDim documentSource As DocumentSourcedocumentSource = DocumentSource.CreateFromStorageFile(file)Await PdfView.Controller.ShowDocumentAsync(documentSource)End IfEnd SubEnd Class
// This loads a PDF from `Assets` as soon as the `PdfView` is ready.void MainPage::PdfViewInitializationCompletedHandler(UI::PdfView^ sender, Pdf::Document^ args){ const auto path = ref new Uri("ms-appx:///Assets/document.pdf");
create_task(StorageFile::GetFileFromApplicationUriAsync(path)) .then([this](StorageFile^ file) { if (file == nullptr) return;
PdfView->OpenStorageFileAsync(file); });}
// This loads a PDF from a file picked by the user in the UI.void MainPage::Button_OpenPDF_Click(Platform::Object^ sender, RoutedEventArgs^ e){ // Open a `Picker` so the user can choose a PDF. FileOpenPicker^ openPicker = ref new FileOpenPicker(); openPicker->ViewMode = PickerViewMode::Thumbnail; openPicker->SuggestedStartLocation = PickerLocationId::PicturesLibrary; openPicker->FileTypeFilter->Append(".pdf");
create_task(openPicker->PickSingleFileAsync()) .then([this](StorageFile^ file) { if (file == nullptr) return;
// Open and display it in the PSPDFKit `PdfView`. const auto documentSource = DocumentSource::CreateFromStorageFile(file); PdfView->Controller->ShowDocumentAsync(documentSource); });}
<Pagex:Class="BasicExample.MainPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="using:BasicExample"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:ui="using:PSPDFKit.UI"mc:Ignorable="d"Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Page.Resources> <x:String x:Key="license">YOUR LICENSE GOES HERE</x:String> </Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="52"/> </Grid.RowDefinitions> <ui:PdfView Grid.Row="0" Name="PdfView" License="{StaticResource license}" InitializationCompletedHandler="PdfViewInitializationCompletedHandler"/> <Button Content="Open PDF" HorizontalAlignment="Left" Margin="10" Grid.Row="1" Name="Button_OpenPDF" Click="Button_OpenPDF_Click"/> </Grid></Page>
Nutrient Mac Catalyst SDK
import PSPDFKitimport PSPDFKitUIimport SwiftUI
// A Document is the container for your PDF file.let document = Document(url: documentURL)
var body: some View { // A PDFView will present and manage the PSPDFKit UI. PDFView(document: document) .scrollDirection(.vertical) .pageTransition(.scrollContinuous) .pageMode(.single)}
Nutrient Electron SDK
const { app, BrowserWindow } = require('electron');const path = require('path');
function createWindow() { const mainWindow = new BrowserWindow({ width: 1200, height: 800, webPreferences: { nodeIntegration: true, contextIsolation: false } });
mainWindow.loadFile('index.html');}
app.whenReady().then(createWindow);
// In your renderer process (index.html):// <script>// import PSPDFKit from 'pspdfkit';//// PSPDFKit.load({// container: '#pspdfkit',// document: 'document.pdf',// licenseKey: '<license-key>'// });// </script>
PDF Generation API
curl -X POST https://api.pspdfkit.com/build -H "Authorization: Bearer your_api_key_here" -o result.pdf -F index.html=@index.html -F instructions='{ "parts": [ { "html": "index.html" } ] }'
PDF Conversion API
curl -X POST https://api.pspdfkit.com/build -H "Authorization: Bearer your_api_key_here" -o converted.pdf -F document=@Example1.docx -F instructions='{ "parts": [ { "file": "document" } ] }'
PDF Editor API
curl -X POST https://api.pspdfkit.com/build -H "Authorization: Bearer your_api_key_here" -o merged.pdf -F part1=@Example1.pdf -F part2=@Example2.pdf -F instructions='{ "parts": [ { "file": "part1" }, { "file": "part2" } ] }'
PDF OCR API
curl -X POST https://api.pspdfkit.com/build -H "Authorization: Bearer your_api_key_here" -o result.pdf -F document=@Example.pdf -F instructions='{ "parts": [ { "file": "document" } ], "actions": [{ "type": "ocr", "language": "english" }] }'
Ship faster with enterprise-grade SDKs built on years of R&D — so you can focus on features, not edge cases.
Skip PDF maintenance and brittle tools. Nutrient handles updates, rendering, and support — so your team can focus on what matters.
Power document workflows with built-in AI. Summarize, translate, redact, or build agentic flows — all in just a few lines of code.
Build exceptional user-facing document experiences — from fast PDF viewing to collaborative editing, markup, and forms — right inside your app.
Automate how documents are handled behind the scenes. Convert, classify, scan, and extract data with server-side SDKs or cloud APIs.
Handle approvals and secure delivery with integrated signing and redaction tools that ensure accuracy, auditability, and compliance.
Meet the strictest data protection and accessibility standards with built-in security, PDF/A support, audit trails, and WCAG-compliant rendering.
One intelligence across SDKs, cloud, low-code, and workflows. The same document-tuned AI engine powers every Nutrient product, adding real insight, automation, and compliance in a single drop-in.
Summaries, smart diffs, and chat answers in seconds.
Confidence-scored redaction with full audit trails.
Prompt-based data capture, no templates.
No-code workflows route documents and data wherever they’re needed.
Self-host, run on Nutrient-managed infrastructure, or use our cloud service — same AI engine, same results.
What is a PDF SDK?
A PDF SDK (software development kit) is a collection of tools, libraries, and documentation that enables developers to integrate PDF functionality directly into their applications. With a PDF SDK, you can add features like viewing, editing, annotating, form filling, digital signing, and document conversion without building these capabilities from scratch.
Can I use Nutrient PDF SDKs on multiple platforms?
Yes. Nutrient offers PDF SDKs for all major platforms — including Web (JavaScript), iOS, Android, React Native, Flutter, .NET, and Java. Our SDKs share a consistent API design across platforms, making it easier to maintain cross-platform applications with unified PDF functionality.
What file types and frameworks are supported by Nutrient’s PDF SDKs?
Nutrient SDKs support PDF as the primary format, along with images (PNG, JPEG, TIFF), Microsoft Office documents (Word, Excel, PowerPoint), and more through our conversion capabilities. We provide native integrations for popular frameworks like React, Vue, Angular, and Next.js, and support both client-side and server-side implementations.
Can I customize Nutrient’s PDF SDKs to match my app’s UI?
Absolutely. Nutrient SDKs offer extensive customization options, including theming, custom toolbars, branded UI components, and the ability to build completely custom interfaces using our APIs. You can match your brand colors, fonts, and design patterns while maintaining full PDF functionality.
Are Nutrient’s PDF SDKs secure?
Yes. Security is a top priority. Our SDKs support encryption, password protection, digital signatures, and redaction, and they comply with standards like PDF/A and PDF/UA. We offer both client-side processing for sensitive documents and secure server-side options. Our solutions are used in highly regulated industries, including healthcare, finance, and government.
How do Nutrient PDF SDKs ensure high-fidelity PDF rendering across different browsers and devices?
Nutrient uses advanced rendering engines optimized for each platform. Our Web SDK leverages WebAssembly for consistent rendering across all browsers, while native SDKs use platform-specific optimizations. This ensures accurate display of complex PDFs, including forms, annotations, embedded fonts, and special formatting — regardless of the viewing environment.
What resources are available for developers?
We provide comprehensive documentation, API references, integration guides, code samples, and video tutorials. Our GitHub repositories include example projects for various frameworks. You also get access to dedicated support channels, regular webinars, and a responsive technical support team to help with implementation.
Why choose a PDF SDK over a third-party general document solution?
A dedicated PDF SDK gives you complete control over the user experience, data security, and feature set. Unlike third-party viewers, you own the implementation, avoid vendor lock-in, and can customize every aspect. PDF SDKs also eliminate external dependencies, reduce latency, and ensure your sensitive documents never leave your infrastructure.
How do I get started with Nutrient’s PDF SDK?
Getting started is easy: Sign up for a free trial, choose your platform, and follow our getting started guides. Most developers have a working PDF viewer in less than 15 minutes. Our SDKs include npm packages, CocoaPods, Maven repositories, and NuGet packages for easy integration. No credit card is required for the trial, and we offer flexible licensing options for production use.
FREE TRIAL
A PDF SDK (software development kit) provides developers with tools to integrate robust PDF capabilities into their applications — like viewing, editing, signing, generating, converting, and more. Nutrient’s PDF SDK is a complete solution that works across web, mobile, and server platforms, helping you build secure, scalable, and interactive document support in your application, without relying on external tools.
Choosing a PDF SDK comes down to flexibility, performance, and platform coverage. Consider these key questions:
The best PDF SDK depends on your use case — whether it’s lightweight client-side only deployment, secure signing, or the ability to fully automate your document workflows. Nutrient’s PDF SDK has a full-featured PDF engine with AI built into it, giving you best-in-class performance, cross-platform support, and modular APIs that developers love. It’s trusted by thousands of companies —from startups, to multinational enterprises across the globe — and used by billions of end users.
Nutrient’s PDF SDK is the core engine behind all types of use cases — contract management, form filling, document workflows, compliance, and more — all within your app’s native environment.
Nutrient stands out by focusing on developer-first tools with enterprise-level performance, scalability, and support. It’s ideal for engineering and product teams that need flexibility, performance, and real ROI.