---
title: "How to migrate from Apryse WebViewer to Nutrient Web SDK"
canonical_url: "https://www.nutrient.io/blog/apryse-to-nutrient-migration/"
md_url: "https://www.nutrient.io/blog/apryse-to-nutrient-migration.md"
last_updated: "2026-09-25T16:11:12.362Z"
description: "Plan an Apryse WebViewer to Nutrient Web SDK migration: Retain XFDF or adopt Instant JSON, replace collaboration, and validate the viewer before cutover."
---

**TL;DR**

Scope an Apryse WebViewer to Nutrient Web SDK migration around annotation compatibility, collaboration, viewer customization, and required file formats.

- **Annotation compatibility** — Keep XFDF through Nutrient’s [built-in import](https://www.nutrient.io/guides/web/importing-exporting/xfdf-support.md), or adopt [Instant JSON](https://www.nutrient.io/guides/web/json.md) for your new workflow. Test both the data and its appearance.

- **Collaboration** — Replace your custom synchronization implementation with Instant synchronization through [Document Engine](https://www.nutrient.io/guides/document-engine.md) or a hosted deployment. Self-hosting still means operating the infrastructure.

- **Viewer customization** — Map the document loading, annotation, saving, and UI behavior your application needs to preserve.

- **File formats** — Confirm licensed computer-aided design (CAD) support and plan for XML Forms Architecture (XFA) forms before committing to a migration scope.

This guide is for teams that have already decided to evaluate a move and want to know what the work actually involves. If you’re still comparing the two products feature by feature, the benchmark-backed matrix lives on the [Apryse alternative page](https://www.nutrient.io/sdk/vs/apryse/). For a broader market view, including Foxit, Syncfusion, and IronPDF, see our [enterprise PDF SDKs comparison](https://www.nutrient.io/blog/enterprise-pdf-sdks/).

Check the Nutrient SDK demos:

- [Viewer demo](https://www.nutrient.io/demo/viewer/)

- [AI Assistant](https://www.nutrient.io/sdk/ai-assistant/getting-started.md)

- [Collaboration demo](https://www.nutrient.io/demo/instant-collaboration/)

## Why teams move

Apryse WebViewer provides document viewing and processing APIs. Evaluate a move against specific application requirements, including annotation storage, collaboration, and deployment.

- **Data model** — Nutrient supports XFDF interoperability and Instant JSON for annotation persistence. Choosing JSON can simplify integration with a JavaScript or TypeScript application, but you still need to map application-specific metadata and permissions.

- **Collaboration ownership** — Apryse’s [collaboration documentation](https://docs.apryse.com/web/guides/realtime-collaboration/basics) describes a synchronization server that developers implement. Nutrient provides Instant synchronization through Document Engine or hosted options; your application still owns authentication and authorization decisions.

- **In-viewer AI** — Nutrient’s [AI Assistant](https://www.nutrient.io/document-ai/) is a licensed add-on. Apryse provides a model-agnostic interaction layer and sample code for [integrating AI with WebViewer](https://apryse.com/blog/ai-document-sdk-llm-integration). Compare the UI, model connections, and data-handling requirements of the configuration you intend to deploy.

- **Deployment and validation** — Decide where documents and model requests may be processed. Test output, error handling, and audit requirements in that deployment; a hosted service and a self-hosted stack have different data flows.

### Scope the format requirements first

Two things are worth confirming against the document set before planning the rest of the work:

- **CAD** — Nutrient renders and converts DWG and DXF through Document Engine with the CAD conversion license component. Check other formats against the [file type support matrix](https://www.nutrient.io/guides/web/about/file-type-support.md).

- **XFA forms** — Nutrient doesn’t support XFA forms. Identify an upstream conversion workflow before migrating those documents. Converting to AcroForms requires validating field behavior; flattening preserves a static document but removes interactive form functionality.

## What changes architecturally

Both viewers can run client-only, while real-time collaboration requires a backend. Separate two decisions: who implements synchronization, and who operates the service.

Nutrient offers three deployment options:

- **Client-only (WebAssembly)** — Viewing, annotations, forms, and signatures in-browser without a document-processing server. See the [Web guides](https://www.nutrient.io/sdk/web/getting-started/react-vite.md).

- **Hybrid** — Pair the Web SDK with [Document Engine](https://www.nutrient.io/guides/document-engine.md) for [optical character recognition (OCR)](https://www.nutrient.io/guides/document-engine/ocr.md), server-side processing, and Instant synchronization. Some operations, including [Office-to-PDF conversion](https://www.nutrient.io/guides/web/conversion/office-to-pdf.md), can also run in the browser. Refer to the [Document Engine guides](https://www.nutrient.io/sdk/document-engine/getting-started.md) for deployment requirements.

- **As a service** — [Managed Document Engine](https://www.nutrient.io/guides/document-engine/as-a-service/managed-document-engine.md) is dedicated, Nutrient-managed, and isolated infrastructure. The [DWS Viewer API](https://www.nutrient.io/guides/document-engine/as-a-service/dws-viewer-api.md) is shared and fully hosted, adding server-side rendering and collaboration with no backend to operate.

If you used WebViewer Server, map each server-side operation to the target deployment before replacing it. Either self-hosted Document Engine or a hosted option can replace a custom synchronization implementation. A hosted option also transfers operation of the document backend to Nutrient.

## Track 1 — Choose the annotation migration path

Start by deciding whether the new application will retain XFDF or adopt Instant JSON. A custom converter isn’t a prerequisite for migrating viewers.

Nutrient Web SDK can load a PDF with XFDF through its configuration, and Document Engine can import a PDF and XFDF together. Use the [XFDF import guide](https://www.nutrient.io/guides/web/importing-exporting/xfdf-support.md) to choose whether imported annotations replace or preserve those already in the PDF.

If your target workflow uses Instant JSON, import the existing annotations through the supported SDK path and export to Instant JSON. Validate custom properties, annotation identifiers, replies, stamps, and appearances against your source data. Refer to the [annotation APIs](https://www.nutrient.io/guides/web/annotations.md) and [Instant JSON guide](https://www.nutrient.io/guides/web/json.md) for the supported formats.

The example below explains the geometry difference for teams inspecting exported data or maintaining a custom transformation. It isn’t a complete migration script.

The difference is easiest to see on the same annotation: a blue rectangle on page one of a US Letter document. The page is 792 points tall, has no rotation, and has no crop-box offset. In XFDF, it’s an XML element:

```xml

<xfdf xml:space="preserve" xmlns="http://ns.adobe.com/xfdf/">
  <annots>
    <square
      page="0"
      rect="100,150,300,225"
      color="#2293FB"

      width="5"
      opacity="1"
      creationdate="D:19700101000000Z"
      date="D:19700101000000Z"
      name="01F73GJ4RPENTCMFSCJ5CSFT5G" />
  </annots>
</xfdf>

```

The same annotation can be represented in Instant JSON:

```json

{
  "format": "https://pspdfkit.com/instant-json/v1",
  "annotations": [
    {
      "v": 1,
      "type": "pspdfkit/shape/rectangle",
      "pageIndex": 0,
      "bbox": [100, 567, 200, 75],
      "strokeColor": "#2293FB",

      "strokeWidth": 5,
      "opacity": 1,
      "blendMode": "normal",
      "createdAt": "1970-01-01T00:00:00Z",
      "updatedAt": "1970-01-01T00:00:00Z",
      "id": "01F73GJ4RPENTCMFSCJ5CSFT5G"
    }
  ]
}

```

Note that the geometry isn’t a straight copy. XFDF `rect` is `x1,y1,x2,y2` in PDF user space, where the origin sits at the bottom-left of the page. Instant JSON `bbox` is `[left, top, width, height]` in a normalized space whose origin is the top-left of the page, so the conversion is:

- `left` = `x1` — unchanged, at 100.

- `width` = `x2 - x1` = 300 − 100 = 200.

- `height` = `y2 - y1` = 225 − 150 = 75.

- `top` = `pageHeight - y2` = 792 − 225 = 567. This is the one that catches people: The vertical origin flips, so the page height has to be in scope when the record is converted.

This calculation applies only to the unrotated, zero-offset page in the example. Rotated pages and nonzero crop-box offsets require the appropriate coordinate transformation. Prefer the built-in XFDF importer; if you maintain custom conversion code, include rotated and cropped pages in its test fixtures. Refer to the [coordinate space guide](https://www.nutrient.io/guides/web/pspdfkit-for-web/coordinate-spaces.md) for the distinction between PDF and normalized page coordinates.

See [annotation data formats](https://www.nutrient.io/guides/web/annotations/introduction-to-annotations/data-formats.md) for the tradeoffs between retaining XFDF and adopting Instant JSON.

Test form fields separately from annotations. Verify names, values, validation behavior, and export requirements. Flattening creates static content, so use it only where the workflow no longer needs interactive fields.

## Track 2 — Replace the collaboration stack

Inventory the document identifiers, annotation events, persistence, and access rules in your Apryse collaboration implementation. Apryse’s [collaboration guide](https://docs.apryse.com/web/guides/realtime-collaboration/basics) describes exporting annotation changes, storing them, and broadcasting them to connected clients.

On Nutrient, Instant synchronization is the real-time synchronization layer. Enable it by connecting the Web SDK to Document Engine (self-hosted) or to the hosted DWS Viewer API. Collaboration isn’t client-only on either product. See the [Instant synchronization guide](https://www.nutrient.io/guides/web/instant-synchronization.md) and the [DWS Viewer API](https://www.nutrient.io/guides/document-engine/as-a-service/dws-viewer-api.md).

Practically, this track is where the operational footprint changes most:

- Decide self-hosted vs. hosted first, because it determines what you decommission.

- Map your existing permission model onto Instant synchronization before cutover, and validate retention behavior.

- If you run the old synchronization service in parallel, be explicit about ownership. State which system owns the annotation of record at any given moment.

## Track 3 — Replace the viewer and UI

Replace the existing viewer with Nutrient Web SDK, map the core flows (open, annotate, export), and align the UI through theming and components. See [Web UI customization](https://www.nutrient.io/guides/web/user-interface.md).

Inventory viewer callbacks, toolbar customizations, and keyboard workflows before implementation. Build a mapping for the behavior your application uses:

| Existing application behavior          | Migration check                                                                            |
| -------------------------------------- | ------------------------------------------------------------------------------------------ |
| Open a document with saved annotations | Load the same PDF and import its annotation state; verify identifiers and appearance       |
| Save or export                         | Confirm whether the destination expects XFDF, Instant JSON, or annotations embedded in PDF |
| Configure toolbar tools and events     | Map each used action and callback. Test keyboard access and read-only states.              |
| Enforce access rules                   | Verify document and annotation permissions with representative user roles                  |

## Suggested phased plan

Use these phases to estimate your application’s migration. Advance when the validation criteria pass rather than assuming a fixed duration.

1. **Annotation compatibility** — Load representative documents and verify XFDF import or the chosen Instant JSON workflow.

2. **Viewer integration** — Connect open, save, and export behavior. Validate custom tools, events, and keyboard interactions.

3. **Collaboration** — Configure Document Engine or a hosted option. Test permissions, persistence, and concurrent changes.

4. **Cutover** — Run a controlled cohort, monitor failures, and exercise rollback before retiring the old viewer.

Estimate duration after testing annotation compatibility and inventorying custom UI, collaboration, and deployment requirements.

**Risk controls** — Run A/B or cohort cutovers, and keep a rollback path to the legacy stack. Validate annotation fidelity and access controls before final cutover.

## Feature parity checklist

Work through this before the cutover gate.

| Area                    | What to verify on the Nutrient side                                                                          |
| ----------------------- | ------------------------------------------------------------------------------------------------------------ |
| Annotations             | Roundtrip fidelity per annotation type; coordinate conversion; custom annotation definitions                 |
| Forms                   | AcroForm fill, validation, flattening, and value export via Instant JSON                                     |
| Digital signatures      | Certificate-based signing and verification plus [eSignature](https://www.nutrient.io/guides/web/signatures.md) flows                       |
| Redaction               | Search/regex-driven redaction parity; where you relied on OCR-based redaction, confirm the equivalent flow   |
| Office and images       | Client-side DOCX/XLSX/PPTX and PNG/JPEG/TIFF; see the [file type support matrix](https://www.nutrient.io/guides/web/about/file-type-support.md)                  |
| OCR and conversion      | Map required operations to browser or [Document Engine](https://www.nutrient.io/guides/document-engine.md) support; confirm licensed components     |
| PDF/A and accessibility | Revalidate [PDF/A](https://www.nutrient.io/guides/document-engine/pdfa.md) conversion and your [accessible](https://www.nutrient.io/blog/pdf-accessibility.md#how-nutrient-handles-accessibility-for-you) reading-order flows against the new stack            |
| CAD                     | DWG and DXF convert and render via Document Engine; confirm any other CAD formats in the document set        |
| XFA                     | Not supported — validate an upstream AcroForm conversion or accept the loss of interactivity when flattening |

## What changes in cost and operations

License fees are only part of it. Review these line items:

- **Infrastructure you retire** — The synchronization layer, and WebViewer Server if you ran it for Office conversion or streamed rendering.

- **Infrastructure you take on** — Choose either Document Engine (self-hosted, containerized) or a hosted subscription. The choice trades operations effort against data locality and control.

- **Adapters you maintain** — Review mappings for application metadata, identifiers, permissions, and events. Changing the annotation format doesn’t automatically remove those integrations.

- **Maintenance either way** — Both stacks need release tracking, prompt patching, and pinned versions. Run them through continuous integration and continuous delivery (CI/CD) with regression testing. Nutrient’s Web SDK builds on an optimized fork of PDFium. Because it’s a fork, upstream fixes arrive via Nutrient releases — track them as part of your patch cadence. Apryse uses a proprietary engine, so subscribe to vendor advisories. See the [Nutrient security overview](https://www.nutrient.io/security/).

Nutrient licensing is modular across Web, Mobile, Document Engine, and hosted options, with a [trial](https://www.nutrient.io/sdk/try/) path and quotes scoped to the modules you choose; see [pricing]. Apryse packaging is enterprise and sales-assisted.

## FAQ: Migrating from Apryse to Nutrient

#### How long does an Apryse-to-Nutrient migration take?

Estimate the four phases against your application. Annotation compatibility, UI customizations, collaboration, and validation requirements determine the scope. The plan is a sequence of checks, not a fixed delivery estimate.

#### Can I keep my existing XFDF annotation data?

Yes. Use Nutrient’s built-in XFDF import and validate annotation fidelity with your documents. Adopt Instant JSON if it fits the target persistence or synchronization workflow; you don’t need to write a custom converter simply to switch viewers.

#### Do I need to run a server after migrating?

It depends on the features you use. Viewing, annotations, forms, signatures, and supported Office-to-PDF conversion can run in the browser. Instant synchronization and operations such as OCR require a document backend. Choose self-hosted Document Engine or a hosted option for those requirements.

#### Which formats should be checked before migrating?

Check every format your application uses against the target deployment. DWG and DXF require Document Engine’s CAD conversion component. XFA needs an upstream conversion workflow. Validate behavior for the remaining formats rather than assuming feature parity.

#### Can Apryse and Nutrient run side by side during the migration?

Yes. Use a controlled rollout: Run an A/B or cohort cutover, keep a rollback path to the legacy stack, and validate annotation fidelity and access controls before retiring the old viewer. The one thing to be explicit about is which system owns the annotation of record while both are live.

## Start with a representative document set

Run a small proof of concept before scheduling the cutover. Include the annotation types, form behaviors, page rotations, and file formats your users rely on. Record any differences, confirm the deployment and license requirements, and use those results to estimate the remaining work.

**Planning a move from Apryse?** [Review our features list](https://www.nutrient.io/sdk/features-list/), [open the Web demo](https://www.nutrient.io/demo/hello/), and [talk to an engineer](https://www.nutrient.io/contact-sales/?=sdk) to scope the migration against your stack.

---

_[Nutrient PDF SDKs](https://www.nutrient.io/sdk/) provide modern APIs across all major platforms._
---

## 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)
- [How to build an AI agent for contract redlining against a compliance playbook](/blog/ai-contract-redlining-compliance-playbook.md)
- [Ai Document Automation Extraction To Action](/blog/ai-document-automation-extraction-to-action.md)
- [Ai Document Workflows Ocr Compliance Heavy Teams](/blog/ai-document-workflows-ocr-compliance-heavy-teams.md)
- [Ai Legal Assistant Document Authoring](/blog/ai-legal-assistant-document-authoring.md)
- [Ai Schema Generator Document Extraction](/blog/ai-schema-generator-document-extraction.md)
- [Amazon Textract Alternatives](/blog/amazon-textract-alternatives.md)
- [Start (clears any prior buffer), navigate the document, then stop into a file.](/blog/android-faster-pdf-rendering.md)
- [Android Pdf Out Of Memory Handling](/blog/android-pdf-out-of-memory-handling.md)
- [Angular File Viewer Pdf Image Office Files](/blog/angular-file-viewer-pdf-image-office-files.md)
- [Approval Workflow Software](/blog/approval-workflow-software.md)
- [Approvals Matrix](/blog/approvals-matrix.md)
- [Auto Tagging And Document Accessibility In Dotnet Sdk](/blog/auto-tagging-and-document-accessibility-in-dotnet-sdk.md)
- [Simple PII redaction.](/blog/automated-pii-removal.md)
- [Azure Document Intelligence Alternatives](/blog/azure-document-intelligence-alternatives.md)
- [Best Ai Document Workflow Platforms](/blog/best-ai-document-workflow-platforms.md)
- [Best Document Ai Platforms](/blog/best-document-ai-platforms.md)
- [Best Document Classification Platforms](/blog/best-document-classification-platforms.md)
- [Best document parser for RAG: LlamaParse vs. Unstructured vs. Reducto vs. Nutrient](/blog/best-document-parser-llamaparse-unstructured-reducto.md)
- [Best Document Parsing Apis](/blog/best-document-parsing-apis.md)
- [Best Document Viewers](/blog/best-document-viewers.md)
- [Best Llm Document Understanding Platforms](/blog/best-llm-document-understanding-platforms.md)
- [Best Multilingual Ocr Software](/blog/best-multilingual-ocr-software.md)
- [Best Pdf Parsers For Rag](/blog/best-pdf-parsers-for-rag.md)
- [Best Salesforce Document Generation Apps](/blog/best-salesforce-document-generation-apps.md)
- [Best Secure Document Collaboration Platforms](/blog/best-secure-document-collaboration-platforms.md)
- [Bpm Guide](/blog/bpm-guide.md)
- [Bpm Tools](/blog/bpm-tools.md)
- [Build Vs Buy Document Extraction](/blog/build-vs-buy-document-extraction.md)
- [Business Automation](/blog/business-automation.md)
- [Capex Vs Opex](/blog/capex-vs-opex.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)
- [Docling Alternatives](/blog/docling-alternatives.md)
- [Document Ai Vs Ocr](/blog/document-ai-vs-ocr.md)
- [Document Authoring Audit Trail](/blog/document-authoring-audit-trail.md)
- [Document Extraction Confidence Scores](/blog/document-extraction-confidence-scores.md)
- [Document Extraction For Underwriting](/blog/document-extraction-for-underwriting.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)
- [Extend Alternatives](/blog/extend-alternatives.md)
- [Extract Patient Data On Premises](/blog/extract-patient-data-on-premises.md)
- [app.py](/blog/extract-text-from-pdf-using-python.md)
- [Fillable Pdf](/blog/fillable-pdf.md)
- [Google Document Ai Alternatives](/blog/google-document-ai-alternatives.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)
- [or](/blog/how-to-build-a-javascript-pdf-viewer.md)
- [How To Build A Nextjs Pdf Viewer](/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)
- [How To Convert Html To Pdf Using Wkhtmltopdf And Csharp](/blog/how-to-convert-html-to-pdf-using-wkhtmltopdf-and-csharp.md)
- [or](/blog/how-to-convert-html-to-pdf-using-wkhtmltopdf-and-python.md)
- [How To Convert Html To Pptx](/blog/how-to-convert-html-to-pptx.md)
- [Quarterly report](/blog/how-to-convert-pdf-to-markdown-using-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 Edit Pdfs Using Ios Pdf Library](/blog/how-to-edit-pdfs-using-ios-pdf-library.md)
- [How To Embed A Pdf Viewer In Your Website](/blog/how-to-embed-a-pdf-viewer-in-your-website.md)
- [How To Extract Tables From Pdf And Images](/blog/how-to-extract-tables-from-pdf-and-images.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)
- [How To Merge Pdfs Using Javascript](/blog/how-to-merge-pdfs-using-javascript.md)
- [How To Ocr Pdfs In Linux](/blog/how-to-ocr-pdfs-in-linux.md)
- [How To Print Pdf In Csharp](/blog/how-to-print-pdf-in-csharp.md)
- [How To Programmatically Create And Fill Pdf Form In Angular](/blog/how-to-programmatically-create-and-fill-pdf-form-in-angular.md)
- [Open an image.](/blog/how-to-use-tesseract-ocr-in-python.md)
- [From an HTML string.](/blog/html-in-pdf-format.md)
- [Html To Pdf In Javascript](/blog/html-to-pdf-in-javascript.md)
- [Intelligent Data Extraction](/blog/intelligent-data-extraction.md)
- [Invoice Approval Software](/blog/invoice-approval-software.md)
- [Javascript Document Editor](/blog/javascript-document-editor.md)
- [Javascript Pdf Editors](/blog/javascript-pdf-editors.md)
- [Javascript Pdf Libraries](/blog/javascript-pdf-libraries.md)
- [Landing Ai Alternatives](/blog/landing-ai-alternatives.md)
- [Langextract Vs Llamaindex Extraction Comparison](/blog/langextract-vs-llamaindex-extraction-comparison.md)
- [Linearized Pdf](/blog/linearized-pdf.md)
- [Uses OpenAI by default — set OPENAI_API_KEY.](/blog/llamaindex-vs-langchain-rag.md)
- [Llamaindex Vs Langchain Vs Haystack](/blog/llamaindex-vs-langchain-vs-haystack.md)
- [Llamaindex Workflows Vs Langgraph](/blog/llamaindex-workflows-vs-langgraph.md)
- [Llamaparse Alternatives](/blog/llamaparse-alternatives.md)
- [Low Code No Code Document Integrations](/blog/low-code-no-code-document-integrations.md)
- [Material Requisition](/blog/material-requisition.md)
- [or](/blog/merge-pdfs.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 Flutter 6 Bindings Api](/blog/nutrient-flutter-6-bindings-api.md)
- [Nutrient Flutter Bindings Architecture](/blog/nutrient-flutter-bindings-architecture.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 accessibility for developers: Meeting WCAG 2.2, Section 508, and PDF/UA with an SDK](/blog/pdf-accessibility.md)
- [Extract data from PDF files: A developer guide to structured data from PDFs and scans](/blog/pdf-data-extraction-developer-guide.md)
- [Pdf Extraction Benchmark Opendataloader Bench](/blog/pdf-extraction-benchmark-opendataloader-bench.md)
- [Pdf Extraction Document Case Studies](/blog/pdf-extraction-document-case-studies.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)
- [Pdf Ua Validation](/blog/pdf-ua-validation.md)
- [Pdfjs Accessibility Structtree Printing](/blog/pdfjs-accessibility-structtree-printing.md)
- [Pdfjs Advanced Loading Streaming Workers](/blog/pdfjs-advanced-loading-streaming-workers.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 Document Outline Bookmarks Metadata](/blog/pdfjs-document-outline-bookmarks-metadata.md)
- [Pdfjs Eventbus Guide](/blog/pdfjs-eventbus-guide.md)
- [macOS](/blog/pdfjs-file-format-conversion-to-pdf.md)
- [macOS](/blog/pdfjs-generating-pdf-thumbnails-pdf2pic.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)
- [People Process Tools](/blog/people-process-tools.md)
- [Process Flows](/blog/process-flows.md)
- [React Native Pdf Annotation](/blog/react-native-pdf-annotation.md)
- [React Pdf Annotation Layer Forms](/blog/react-pdf-annotation-layer-forms.md)
- [React Pdf Custom Rendering Hooks](/blog/react-pdf-custom-rendering-hooks.md)
- [Using Yarn](/blog/react-pdf-editor.md)
- [React Pdf Loading States Errors Passwords](/blog/react-pdf-loading-states-errors-passwords.md)
- [React Pdf Non Latin Fonts Special Pdfs](/blog/react-pdf-non-latin-fonts-special-pdfs.md)
- [React Pdf Outline Table Of Contents](/blog/react-pdf-outline-table-of-contents.md)
- [React Pdf Performance Optimization](/blog/react-pdf-performance-optimization.md)
- [React Pdf Setup Basic Rendering](/blog/react-pdf-setup-basic-rendering.md)
- [React Pdf Text Layer Custom Renderer](/blog/react-pdf-text-layer-custom-renderer.md)
- [React Pdf Thumbnails Page Navigation](/blog/react-pdf-thumbnails-page-navigation.md)
- [Reducto Alternatives](/blog/reducto-alternatives.md)
- [Requisition System](/blog/requisition-system.md)
- [labels.py](/blog/route-documents-automatically-classify-api.md)
- [or](/blog/sample-blog-updated.md)
- [Sdk Product Updates Q2 2026](/blog/sdk-product-updates-q2-2026.md)
- [System Of Record Vs Source Of Truth](/blog/system-of-record-vs-source-of-truth.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)
- [The Six Best Pdf Generator Apis](/blog/the-six-best-pdf-generator-apis.md)
- [Define the HTML part of the document.](/blog/top-10-ways-to-generate-pdfs-in-python.md)
- [Top 5 Javascript Pdf Viewers](/blog/top-5-javascript-pdf-viewers.md)
- [or](/blog/top-js-pdf-libraries.md)
- [Top Ten Ways To Convert Html To Pdf](/blog/top-ten-ways-to-convert-html-to-pdf.md)
- [Unstructured Alternatives](/blog/unstructured-alternatives.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 Business Logic](/blog/what-is-business-logic.md)
- [What Is Document Processing](/blog/what-is-document-processing.md)
- [What Is Intelligent Document Processing](/blog/what-is-intelligent-document-processing.md)
- [What Is Ocr Invoice Processing](/blog/what-is-ocr-invoice-processing.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)

