---
title: "How to add electronic signatures to PDFs with an API"
canonical_url: "https://www.nutrient.io/blog/electronic-signature-api/"
md_url: "https://www.nutrient.io/blog/electronic-signature-api.md"
last_updated: "2026-10-07T20:46:40.918Z"
description: "Add electronic signatures to PDFs with one API request — visible, invisible, or image-based. Curl and Node.js examples with Nutrient DWS API."
---

# Electronic signature API: How to sign PDFs programmatically

**TL;DR**

Nutrient DWS API adds digital signatures to PDFs so recipients can check whether the signed content has changed. Use the [`/sign` endpoint](https://www.nutrient.io/api/reference/public/#tag/Digital-Signatures/operation/sign-file) for invisible signatures, visible signing details, or a drawn signature image. Send the document as multipart form data and save the signed PDF returned by the API. Your application remains responsible for identifying signers and recording their consent.

When your application generates a contract or report, recipients need a way to check that its contents haven’t changed. Placing a signature image on the page doesn’t provide that check.

[Nutrient DWS API](https://www.nutrient.io/api/digital-signatures-api/) signs the PDF and embeds the data a compatible reader needs to validate it. You can add this step after generating or filling a document, while Nutrient handles the signing certificate and timestamp. For a workflow that collects a person’s signature, your application must also capture their approval before sending the PDF for signing.

## Electronic vs. digital signatures: What does the API apply?

The two terms get used interchangeably, but they’re different layers of the same workflow:

- An **electronic signature** is the legal concept — any electronic record of a person’s intent to sign. It can be anything from a typed name or drawn mark to a click on “I agree.”

- A **digital signature** is the cryptographic mechanism — a signature computed with a private key over a hash of the document. A compatible PDF reader uses the public key in the signing certificate to validate the signed content.

Nutrient’s `/sign` endpoint applies a cryptographic digital signature. Your application authenticates the person and records their intent to sign; Nutrient makes changes to the signed content detectable. The digital signature alone doesn’t identify an individual signer. See [the difference between digital and electronic signatures](https://www.nutrient.io/blog/digital-vs-electronic-signatures/) for more context, or [electronic signatures in a PDF](https://www.nutrient.io/blog/electronic-signatures-on-pdf/) for the signature types PDFs support.![Electronic signing workflow: The application captures signer identity and consent, the API signs the PDF, and a PDF reader with signature validation checks signed content using its trust store.](@/assets/images/blog/2026/electronic-signature-api/electronic-signing-workflow.png)

Nutrient DWS API provides the signing operation covered here. For hosted signing sessions with recipients, reminders, and workflow state, use Nutrient DWS Signer API.

## How to add an electronic signature to a PDF with an API

To sign a PDF with the Nutrient DWS API:

1. **Get a free Nutrient API key** — Sign up on the [Nutrient digital signature API page](https://www.nutrient.io/api/digital-signatures-api/) and copy your key from the dashboard.

2. **POST the PDF to `/sign`** — Send the file as multipart form data with your key in the `Authorization` header.

3. **Save the response** — The API returns the signed PDF. Optionally pass a `data` object to control where the signature appears and what it shows.

The minimal request signs the document with an invisible signature:

```bash

curl --fail -X POST https://api.nutrient.io/sign \
  -H "Authorization: Bearer $NUTRIENT_API_KEY" \
  -F file=@document.pdf \
  -o result.pdf

```

The `--fail` option makes curl return a nonzero exit code on HTTP errors, such as an invalid API key or exhausted credits. Curl then doesn’t save the error response as `result.pdf`.

Open `result.pdf` in a reader that supports digital signature validation to inspect the signature. The reader can validate the signed revision and report subsequent changes. Whether a later change invalidates a signature depends on the change and any certification permissions.

Nutrient applies a fixed [signing profile](https://www.nutrient.io/guides/dws-processor/tools-and-api/pdf-digital-signature-api.md): SHA-256 at the baseline long-term (B-LT) level. B-LT is a technical signature profile, not a legal assurance level. It embeds an RFC 3161 timestamp, the certificate chain, and revocation information for validation after the signing certificate expires. Certificate trust still depends on the reader and its trust store.

## Add a visible signature

To show signing details on the page, pass a `data` object with a `position` and an `appearance` to Nutrient’s signing endpoint. The `position.rect` array uses PDF points in the format `[left, top, width, height]`:

```bash

curl --fail -X POST https://api.nutrient.io/sign \
  -H "Authorization: Bearer $NUTRIENT_API_KEY" \
  -F file=@document.pdf \
  -F 'data={
    "position": {
      "pageIndex": 0,
      "rect": [72, 650, 250, 80]
    },
    "appearance": {
      "mode": "signatureAndDescription",
      "showWatermark": true,
      "showSignDate": true
    }
  };type=application/json' \
  -o result.pdf

```

The `appearance.mode` option controls the layout:

- `signatureOnly` — Just the signature graphic.

- `signatureAndDescription` — Graphic plus signing details.

- `descriptionOnly` — Signing details as text, no graphic.

Set `showSignDate` to render the signing timestamp in the appearance, and `showDateTimezone` to include the timezone.

## Add a hand-drawn signature image

If your application captures a hand-drawn signature, include it in the request as the `graphicImage` part, which is the signature graphic itself. The signature can come from a [signature pad](https://www.nutrient.io/blog/how-to-add-a-signature-pad-using-javascript/), a stylus, or an uploaded image. The separate `image` part is the watermark drawn behind the signature, and `showWatermark: false` keeps the default Nutrient logo out of the appearance:

```bash

curl --fail -X POST https://api.nutrient.io/sign \
  -H "Authorization: Bearer $NUTRIENT_API_KEY" \
  -F file=@document.pdf \
  -F graphicImage=@signature.png \
  -F 'data={
    "position": {
      "pageIndex": 0,
      "rect": [72, 650, 250, 80]
    },
    "appearance": {
      "mode": "signatureOnly",
      "showWatermark": false,
      "showSignDate": false
    }
  };type=application/json' \
  -o result.pdf

```

Supported image content types include `image/png` and `image/jpeg`. The result is a PDF that shows the person’s drawn signature on the page, backed by a cryptographic signature that makes any later modification detectable.

## Sign an existing signature field

If the PDF already contains a signature form field, sign that field by name with `formFieldName` instead of specifying a position. A contract template with a designated signing box is a typical case:

```bash

curl --fail -X POST https://api.nutrient.io/sign \
  -H "Authorization: Bearer $NUTRIENT_API_KEY" \
  -F file=@contract.pdf \
  -F 'data={
    "formFieldName": "signature-field",
    "appearance": {
      "mode": "signatureAndDescription",
      "showWatermark": true,
      "showSignDate": true
    }
  };type=application/json' \
  -o result.pdf

```

If no field with that name exists, the API can create one at a `position` you provide.

## Sign a PDF with an API in Node.js

The same request works from any language that can send multipart form data. In Node.js 18 or later, the built-in `fetch` and `FormData` cover it with no dependencies:

```js

// sign.mjs
import { readFile, writeFile } from "node:fs/promises";

const apiKey = process.env.NUTRIENT_API_KEY;
if (!apiKey) {
  throw new Error("Set NUTRIENT_API_KEY before running this example.");
}

const form = new FormData();
form.append(
  "file",
  new Blob([await readFile("document.pdf")], { type: "application/pdf" }),
  "document.pdf",
);
form.append(
  "data",
  new Blob(
    [
      JSON.stringify({
        position: { pageIndex: 0, rect: [72, 650, 250, 80] },
        appearance: { mode: "signatureAndDescription", showSignDate: true },
      }),
    ],
    { type: "application/json" },
  ),
);

const response = await fetch("https://api.nutrient.io/sign", {
  method: "POST",
  headers: { Authorization: `Bearer ${apiKey}` },
  body: form,
});

if (!response.ok) {
  throw new Error(`Signing failed: ${response.status} ${await response.text()}`);
}

await writeFile("result.pdf", Buffer.from(await response.arrayBuffer()));

```

Save the example as `sign.mjs` to enable ECMAScript (ES) modules, set the `NUTRIENT_API_KEY` environment variable, and place `document.pdf` in your working directory. Run `node sign.mjs` to produce `result.pdf` with a visible signature on the first page. To sign invisibly, drop the `data` field.

Nutrient also ships official client libraries that wrap the same API: [`@nutrient-sdk/dws-client-typescript`](https://www.nutrient.io/blog/announcing-typescript-sdk-nutrient-dws-processor-api/) for TypeScript/Node.js and [`nutrient-dws`](https://www.nutrient.io/blog/announcing-python-sdk-nutrient-dws-processor-api/) for Python. Both expose a `sign()` method alongside the rest of the document-processing toolset, including merge, convert, optical character recognition (OCR), and extraction.

**Featured Content**

**Use your own signing certificates**

Nutrient Document Engine supports signing in your infrastructure with your certificates and hardware security modules (HSMs).

[Explore Nutrient Document Engine](https://www.nutrient.io/guides/document-engine/signatures.md)

## Handle real-world documents

Use these Nutrient signing options when preparing documents for production:

- **Password-protected PDFs** — Pass the document password in the `pspdfkit-pdf-password` header. If the password contains characters that HTTP header handling might modify, pass it as `base64:<encoded-password>`.

- **Flatten before signing** — Set `"flatten": true` in the `data` object to remove interactive annotations and form fields while preserving their appearance. Use it only when the signed output is a final artifact. Flattening doesn’t prevent later editing of page content.

- **Sign last** — Run content-changing operations (merging, form filling, redaction, watermarking, and optimization) via the [Nutrient Build API](https://www.nutrient.io/api/reference/public/#tag/Document-Editing/operation/build-document) before signing the result. Later changes can be detected during signature validation.

## What the signature does — and doesn’t — establish

The table below separates what Nutrient’s signature establishes from the evidence your application needs to retain.

| Property           | What the API signature establishes                                                                   | What your workflow must supply                                                                                                               |
| ------------------ | ---------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Document integrity | The signature covers the signed byte range; validation detects any change to signed content.         | Nothing — this is the API’s core guarantee.                                                                                                  |
| Attribution        | The certificate identity is derived from your organization account, attributing the signature to it. | Verifiers need to know your expected organization ID and compare it with the identifier in the certificate’s organizational unit (OU) field. |
| Signer identity    | Nothing by itself — the API authenticates your application’s request, not a person.                  | Authenticating the individual, and recording their consent and intent.                                                                       |
| Legal effect       | Timestamp and validation material that strengthen the evidence trail.                                | The complete workflow: signer authentication, consent records, and retained audit evidence.                                                  |

A signature from the API can anchor a legally enforceable electronic signing workflow, but it isn’t categorically legally binding on its own. Legal effect depends on the full workflow, the document type, and the jurisdiction. Production plans sign with certificates that chain to a publicly trusted root. The free plan uses a private test certificate, so use it to build and test the integration, not for production signatures.

## Test your signing workflow with Nutrient

Create a [free Nutrient API key](https://www.nutrient.io/api/digital-signatures-api/) and sign a sample PDF from your application. Check the signature’s appearance, certificate, and timestamp in a reader that supports digital signature validation. Use that result to test your integration before switching to a production plan.

## FAQ

#### How do I add an electronic signature to a PDF using an API?

Send the PDF to Nutrient DWS API’s `/sign` endpoint as a multipart POST request with your API key in the `Authorization` header. The API returns the signed PDF. Add a `data` object with `position` and `appearance` for a visible signature, or a `graphicImage` part for a hand-drawn signature graphic.

#### Are API-generated signatures legally binding?

Not automatically. The API provides the cryptographic digital signature — document integrity, a trusted timestamp, and validation material. Legal enforceability depends on your complete workflow, including how you authenticate the signer, record their consent and intent, and retain audit evidence. The document type and jurisdiction also matter.

#### What’s the difference between an electronic signature and a digital signature?

An electronic signature is the legal concept — an electronic record of intent to sign. A digital signature is the cryptographic mechanism that makes a document tamper-evident. Most real signing workflows use both: The application captures the electronic signature (who signed, and their intent), and a digital signature seals the document.

#### Can I use my own signing certificate with the API?

Nutrient DWS API manages the signing certificate and derives its identity from your organization account. You can’t supply your own certificate to this endpoint. For signing with your certificates or HSM, use [Nutrient Document Engine](https://www.nutrient.io/guides/document-engine/signatures.md).

#### How do I sign a PDF with an API in Node.js?

Use the built-in `fetch` and `FormData` in Node.js 18+ to POST the file to `https://api.nutrient.io/sign` — see the complete example above. Alternatively, use the official TypeScript client, `@nutrient-sdk/dws-client-typescript`, which wraps the same endpoint in a `sign()` method.

#### Is there a free electronic signature API?

Nutrient DWS API has a [free plan](https://www.nutrient.io/api/digital-signatures-api/) you can use to build and test the signing integration. The free plan signs with a private test certificate; production signatures with publicly trusted certificates require a paid plan.
---

## 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 Assistant Agent Governance](/blog/ai-assistant-agent-governance.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)
- [Apryse To Nutrient Migration](/blog/apryse-to-nutrient-migration.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)
- [How To Convert Html To Pdf Using React](/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)
- [C# barcode scanner: How to scan and read 1D barcodes and QR codes](/blog/how-to-scan-barcodes-in-csharp.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)
- [Migrating Observability Hyperdx To Dash0](/blog/migrating-observability-hyperdx-to-dash0.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)
- [Ocr Api Comparison](/blog/ocr-api-comparison.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)
- [Using Javascript In Pdf Form Fields](/blog/using-javascript-in-pdf-form-fields.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)

