---
title: "How to add watermarks to PDFs: A complete guide for developers"
canonical_url: "https://www.nutrient.io/blog/document-watermarking/"
md_url: "https://www.nutrient.io/blog/document-watermarking.md"
last_updated: "2026-08-05T08:24:24.296Z"
description: "Learn how to add watermarks to PDFs using Nutrient SDK. Code examples for text and image watermarks on Web, iOS, Android, and server-side applications."
---

**TL;DR**

Add watermarks to PDFs using Nutrient SDK. This guide covers text and image watermarks, static vs. dynamic options, and code examples for Document Engine, Web SDK, iOS, and Android.

Watermarks protect sensitive documents, reinforce branding, and help with compliance. This guide shows you how to add watermarks to PDFs using [Nutrient PDF SDK](https://www.nutrient.io/sdk/) across web, mobile, and server-side platforms.

## What is a watermark?

A watermark is a piece of text, an image, or data added to a document, photo, or even a banknote to prevent unauthorized copying or misuse. It can be obvious, like a logo or stamp, or hidden within the content as invisible data.

Watermarks help protect content, but they only work if they’re difficult to remove — otherwise, they don’t serve much of a purpose.

## Understanding document watermarking

Document watermarking embeds a recognizable mark — visible or invisible — on a document to indicate ownership or provide additional context. Visible watermarks, such as logos or text, are directly noticeable, while invisible watermarks are hidden and can only be detected with special tools.

### Common use cases for watermarking

Watermarking addresses a range of business and security needs across industries, including:

- **Copyright protection** — Prevent unauthorized distribution or plagiarism.

- **Branding** — Add company logos or taglines to reinforce identity.

- **Tracking and auditing** — Identify document leaks or unauthorized sharing with dynamic information (e.g. Opened by [User] on [Date] from IP [Address]).

- **Metadata and labeling** — Display associated metadata such as author, project name, due date, or compliance labels.

- **Status indicators** — Mark documents with statuses like Draft, Final, or Confidential.

- **Security and compliance** — Overlay user IDs, timestamps, or other details to ensure document security.

- **Legal and policy notices** — Insert legal disclaimers, copyright messages, or corporate policies.

- **Machine-readable data** — Embed barcodes or QR codes with our [barcode scanner SDK](https://www.nutrient.io/sdk/solutions/scanning-barcodes/) for automated processing.

## Why use watermarks on PDFs?

Watermarks provide practical benefits for security, branding, and compliance. Here’s how they protect your documents and support business requirements.

### 1. Security

Watermarks deter unauthorized distribution. When sharing contracts, reports, or invoices, a watermark:

- Identifies document ownership

- Discourages copying or redistribution

- Helps meet regulatory requirements

### 2. Branding

Add logos or taglines directly to documents for consistent branding across all outputs.

### 3. Compliance

Industries like healthcare, finance, and legal services often require document labeling. Watermarks satisfy these requirements.

## Types of watermarks: Static vs. dynamic

- **Static watermarks** — Same on every document (e.g. company logo, CONFIDENTIAL stamp). Applied uniformly.

- **Dynamic watermarks** — Generated per document with variable data like usernames, timestamps, or document IDs. Useful for tracking who accessed what.

## How to add watermarks with Nutrient SDK

[Nutrient PDF SDK](https://www.nutrient.io/sdk/) supports text and image watermarks across all platforms:

- **Customizable** — Control position, opacity, rotation, and text styling

- **Cross-platform** — Web, iOS, Android, and server-side (Document Engine)

- **Performant** — Handles large-scale document processing

## Adding watermarks on different platforms

The following sections provide platform-specific implementation guides with code examples for Document Engine, Web SDK, iOS, Android, and Document Converter.

### 1. Document Engine

Nutrient [Document Engine](https://www.nutrient.io/sdk/document-engine/) makes it easy to watermark documents using the [watermark](https://www.nutrient.io/api/reference/document-engine/upstream/#tag/Build-API/Instructions-Schema) action. You can specify [options](https://www.nutrient.io/api/reference/document-engine/upstream/#tag/Build-API/Instructions-Schema) that describe the look and position of a watermark, including both text and image annotations.

Follow these steps to watermark documents with Document Engine.

#### Steps to add watermarks

1. Set up Document Engine

   Ensure Document Engine is running and ready to accept requests.

2. Use multipart `POST` requests

   Send requests to the `/api/build` endpoint with detailed instructions. For more information, refer to [A brief tour of multipart requests](https://www.nutrient.io/blog/a-brief-tour-of-multipart-requests/).

3. Flatten the annotations

   After applying the watermark, [flatten the document’s annotations](https://www.nutrient.io/guides/document-engine/annotations/flatten.md) to make the watermark irremovable.

#### Examples

These examples demonstrate common watermarking scenarios using Document Engine.

#### Watermarking a file on disk

To add a TOP SECRET text watermark, use the following code:

```bash

curl -X POST http://localhost:5000/api/build \
  -H "Authorization: Token token=<API token>" \
  -F document=@/path/to/example-document.pdf \
  -F instructions='{
  "parts": [
    {
      "file": "document",
      "actions": [
        {
          "type": "watermark",
          "text": "TOP SECRET",
          "width": 100,
          "height": 200
        },
        {
          "type": "flatten"
        }
      ]
    }
  ]
}' \
  -o result.pdf

```

This request attaches an input file and specifies watermarking actions to apply.

#### Adding image and text watermarks

Here’s an example of combining an image watermark on the first page of a document and a text watermark on the last page:

```bash

curl -X POST http://localhost:5000/api/build \
  -H "Authorization: Token token=<API token>" \
  -F document=@/path/to/example-document.pdf \
  -F image-local=@/path/to/image-watermark.png \
  -F instructions='{
  "parts": [
    {
      "file": "document",
      "pages": {
        "start": 0,
        "end": 0
      },
      "actions": {
        "type": "watermark",
        "image": "image-local",
        "width": 100
      }
    },
    {
      "file": "document",
      "pages": {
        "start": 3,
        "end": 3
      },
      "actions": {
        "type": "watermark",
        "text": "TOP SECRET",
        "width": 100,
        "height": 200
      }
    }
  ],
  "actions": [
    {
      "type": "flatten"
    }
  ]
}' \
  -o result.pdf

```

#### Watermarking a file from a URL

You can also use URLs to specify both the document and the image for the watermark:

```bash

curl -X POST http://localhost:5000/api/build \
  -H "Authorization: Token token=<API token>" \
  -F instructions='{
  "parts": [
    {
      "file": {
        "url": "https://www.nutrient.io/downloads/examples/paper.pdf"
      },
      "pages": {
        "start": 0,
        "end": 0
      },
      "actions": {
        "type": "watermark",
        "image": {
          "url": "https://image-url.com/path-to-image-on-internet.png"
        },
        "width": 100
      }
    }
  ],
  "actions": [
    {
      "type": "flatten"
    }
  ]
}' \
  -o result.pdf

```

When specifying URLs, ensure the image URL includes the MIME type, such as `png`.

### 2. Nutrient DWS API — PDF watermark API

[Nutrient DWS API](https://www.nutrient.io/api/pdf-watermark-api/) lets you add custom watermarks to PDF documents via an easy-to-use HTTP service.

#### Benefits

- **Secure** — Data isn’t stored, and all interactions are encrypted (SOC 2 Type 2 audited).

- **Simple** — Quick integration with well-documented APIs.

- **Flexible** — More than 30 tools for document conversion and manipulation.

- **Affordable** — Pay based on credits, with transparent pricing.

#### Get started

1. Sign up for a [free account](https://dashboard.nutrient.io/sign_up/?product=processor) and get 50 credits.

2. Upload files by placing your `document.pdf` and `logo.png` files in your project.

3. Use the provided sample code in your preferred language.

4. Download `result.pdf` and check for the watermark.

#### Example with Node.js

```javascript

const axios = require("axios");
const FormData = require("form-data");
const fs = require("fs");

const formData = new FormData();
formData.append(
  "instructions",
  JSON.stringify({
    parts: [{ file: "document" }],
    actions: [{ type: "watermark", image: "logo", width: "25%" }],
  }),
);
formData.append("document", fs.createReadStream("document.pdf"));
formData.append("logo", fs.createReadStream("logo.png"));

(async () => {
  try {
    const response = await axios.post(
      "https://api.nutrient.io/build",
      formData,
      {
        headers: formData.getHeaders({
          Authorization: "Bearer your_api_key",
        }),
        responseType: "stream",
      },
    );
    response.data.pipe(fs.createWriteStream("result.pdf"));
  } catch (e) {
    const errorString = await streamToString(e.response.data);
    console.log(errorString);
  }
})();

function streamToString(stream) {
  const chunks = [];
  return new Promise((resolve, reject) => {
    stream.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
    stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
    stream.on("error", reject);
  });
}

```

The code uses Node.js to add a watermark to a PDF by sending a request to Nutrient DWS API with a PDF and image file, along with your API key for authentication. The watermarked PDF is saved as `result.pdf` after the request is processed.

### 3. Web SDK

[Nutrient Web SDK](https://www.nutrient.io/sdk/web/) allows you to add watermarks to PDFs displayed in the browser, which is useful for preventing screenshots by overlaying user-specific information, such as a username. To achieve this, use the `renderPageCallback` option in the [`NutrientViewer.load()`](https://www.nutrient.io/api/web/functions/NutrientViewer.load.html) method, where you can draw the watermark on each page using the Canvas API, as shown in the example below:

```js

NutrientViewer.load({
  document: document,
  renderPageCallback: function (ctx, pageIndex, pageSize) {
    ctx.beginPath();
    ctx.moveTo(0, 0);
    ctx.lineTo(pageSize.width, pageSize.height);
    ctx.stroke();

    ctx.font = "30px Comic Sans MS";
    ctx.fillStyle = "red";
    ctx.textAlign = "center";

    ctx.fillText(
      `Generated for John Doe. Page ${pageIndex + 1}`,
      pageSize.width / 2,
      pageSize.height / 2,
    );
  },
});

```

This watermark only appears during viewing in the browser and doesn’t alter the original PDF document.

### 4. Android SDK — Secure your PDFs with custom watermarks

To add custom, non-removable watermarks to PDFs, use [Nutrient Android SDK](https://www.nutrient.io/sdk/android/)’s [`PdfDrawable`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui.drawable/-pdf-drawable/index.html) API. This method allows you to overlay user-specific watermarks (e.g. name, timestamp) to discourage unauthorized sharing or screenshots. You can provide a [`PdfDrawableProvider`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui.drawable/-pdf-drawable-provider/index.html) that will be registered with the [`PdfFragment`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui/-pdf-fragment/add-drawable-provider.html) to apply the watermark, including on page thumbnails. Here’s an example of how to set this up in your [`PdfActivity`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui/-pdf-activity/index.html):

```kotlin

class WatermarkExampleActivity : PdfActivity() {
    private val customTestDrawableProvider: PdfDrawableProvider = object : PdfDrawableProvider() {
        override fun getDrawablesForPage(context: Context, document: PdfDocument, @IntRange(from = 0) pageIndex: Int): List<PdfDrawable> {
            return listOf(WatermarkDrawable("Watermark", PointF(350f, 350f)))
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        requirePdfFragment().addDrawableProvider(customTestDrawableProvider)
        pspdfKitViews.thumbnailBarView?.addDrawableProvider(customTestDrawableProvider)
    }
}

```

The `WatermarkDrawable` class handles content and positioning. The watermark appears onscreen but doesn’t modify the PDF file.

Explore the Android demo:

### 5. iOS SDK

[Nutrient iOS SDK](https://www.nutrient.io/sdk/ios/) allows you to add a permanent watermark to all pages of a document using the [`Processor`](https://www.nutrient.io/api/ios/documentation/pspdfkit/processor) API. The following example shows how to apply a watermark to every page:

```swift

let configuration = Processor.Configuration(document: document)!
configuration.drawOnAllCurrentPages { context, pageIndex, pageRect, renderOptions in
    let text = "Watermark on Page \(pageIndex + 1)"
    context.translateBy(x: 0, y: pageRect.size.height / 2)
    context.rotate(by: -.pi / 4)
    let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.boldSystemFont(ofSize: 30),.foregroundColor: UIColor.red.withAlphaComponent(0.5)
    ]
    text.draw(with: pageRect, options:.usesLineFragmentOrigin, attributes: attributes, context: nil)
}

let processor = Processor(configuration: configuration, securityOptions: documentSecurityOptions)
try processor.write(toFileURL: processedDocumentURL)

```

This method creates a new PDF with the watermark applied to all pages, which will remain even in other PDF viewers.

For a temporary watermark that won’t be saved to disk, use the following:

```swift

let renderBlock: PSPDFRenderDrawBlock = { context, pageIndex, pageRect, renderOptions in
    let text = "Temporary Watermark on Page \(pageIndex + 1)"
    context.translateBy(x: 0, y: pageRect.size.height / 2)
    context.rotate(by: -.pi / 4)
    let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.boldSystemFont(ofSize: 30),.foregroundColor: UIColor.red.withAlphaComponent(0.5)
    ]
    text.draw(with: pageRect, options:.usesLineFragmentOrigin, attributes: attributes, context: nil)
}

document.updateRenderOptions(for:.page) {
    $0.drawBlock = renderBlock
}

```

This approach adds a watermark for display, but it won’t be saved in the document. For more details, refer to [`DrawOnPagesExample.swift`](https://github.com/PSPDFKit/pspdfkit-ios-catalog/blob/master/Catalog/Examples/DocumentProcessing/DrawOnPagesExample.swift) in the [Nutrient Catalog](https://www.nutrient.io/guides/ios/getting-started/example-projects.md).

Explore our iOS demo:

### 6. Advanced watermarking solutions with Nutrient Document Converter

[Nutrient Document Converter](https://www.nutrient.io/low-code/document-converter/) provides powerful watermarking capabilities for [SharePoint](https://www.nutrient.io/guides/document-converter/sharepoint/watermark/watermark-documents.md), [Power Automate](https://www.nutrient.io/guides/document-converter/power-automate.md), and [Document Converter Services](https://www.nutrient.io/guides/document-converter/document-converter-services.md). These features ensure document security, enhance compliance, and support branding by adding dynamic, customizable watermarks to a wide variety of file types.

#### Watermarking in SharePoint

Add watermarks directly to your documents in SharePoint Online and on-premises environments using the following solutions.

- [SharePoint Designer workflows](https://www.nutrient.io/guides/document-converter/sharepoint/watermark/designer-workflow-watermark-documents.md):

Automate the addition of watermarks such as text, images, barcodes, or QR codes. Place watermarks behind or in front of document content, and apply them to specific pages or page ranges.

- [Nintex workflows](https://www.nutrient.io/guides/document-converter/sharepoint/watermark/nintex-workflow-watermark-documents.md):

Integrate watermarking into advanced workflows using Nintex for SharePoint. Apply elements like shapes, text, or logos as watermarks, and manage multiple watermark actions with the composite watermark feature.

- [SharePoint user interface](https://www.nutrient.io/guides/document-converter/sharepoint/watermark/watermark-documents.md):

Apply watermarks directly from the SharePoint interface for documents or list item attachments. Options include:

- **Dynamic watermarks** — Custom user-specific watermarks that display when a document is opened.

- **Page-specific placement** — Apply watermarks to odd/even pages, page intervals, or specific orientations (portrait or landscape).

#### Watermarking with Power Automate

Document Converter integrates seamlessly with [Power Automate](https://www.nutrient.io/guides/document-converter/power-automate.md) to enable watermarking within automated workflows.

- Dynamic watermark content:

Automatically include dates, times, user details, or metadata from connected systems.

- Flexible options:

Add text, images, barcodes, or shapes as watermarks, and control placement on single or multiple pages.

- Custom automation:

Easily configure workflows to apply watermarks dynamically during document processing, ensuring consistency and compliance.

#### PDF watermark API for developers

For custom solutions, Nutrient offers a robust [PDF watermark API](https://www.nutrient.io/guides/document-converter/document-converter-services/watermark.md) that allows developers to embed watermarks programmatically.

- Dynamic customization:

Add metadata, page numbers, user-specific data, and branding elements such as company logos or legal disclaimers.

- Advanced features:
  - Place watermarks on specific pages (e.g. odd, even, intervals, portrait, or landscape).
  - Insert a variety of elements like text, QR codes, images, and barcodes.
  - Add machine-readable data for auditing or compliance.

- Developer integration:

Access sample code in C#, Java,.NET Core, PHP, and JavaScript to simplify implementation.

[Contact our Sales team](https://www.nutrient.io/contact-sales/?=low-code) for more information on Nutrient’s low-code solutions for watermarking.

## Comparison of Nutrient products

| Product            | Ideal for                | Key strengths                      |
| ------------------ | ------------------------ | ---------------------------------- |
| Document Engine    | Advanced editing needs   | Full control, robust customization |
| PDF watermark API  | Server-side applications | Scalable, fine-grained control     |
| Web SDK            | Browser-based solutions  | Lightweight, easy integration      |
| Android SDK        | Mobile Android apps      | Seamless app integration           |
| iOS SDK            | Mobile iOS apps          | Optimized for Apple devices        |
| Document Converter | Non-technical teams      | Quick setup, low-code environment  |

## Get started with watermarks

- **[Start a free trial](https://www.nutrient.io/try/)** — Test watermarking on your own PDFs

- **[Contact Sales](https://www.nutrient.io/contact-sales/?=sdk)** — Questions about licensing or enterprise features

## FAQ

#### How do I add watermarks to a PDF?

Use Nutrient SDK’s watermark API. You can add text or image watermarks with custom positioning, opacity, and rotation. See the code examples above for Document Engine, Web SDK, iOS, and Android.

#### Can I add both text and image watermarks?

Yes. Nutrient SDK supports text watermarks (e.g. CONFIDENTIAL, usernames, timestamps) and image watermarks (e.g. logos, stamps). You can combine both on the same document.

#### What’s the difference between static and dynamic watermarks?

Static watermarks are the same on every document (e.g. a company logo). Dynamic watermarks include variable data like usernames, timestamps, or document IDs, which are useful for tracking and security.

#### Can I add watermarks on mobile apps?

Yes. Nutrient SDK supports watermarks on iOS and Android. The watermark appears during viewing but doesn’t modify the original PDF unless you flatten it.

#### How do I make watermarks permanent?

Use the “flatten” action after applying the watermark. This burns the watermark into the PDF so it can’t be removed, even in other PDF viewers.
---

## Related pages

- [The business case for accessibility: Five ways it drives enterprise value](/blog/5-ways-accessibility-drives-enterprise-value.md)
- [Accessibility Untangled Why It Matters Guide](/blog/accessibility-untangled-why-it-matters-guide.md)
- [Advanced Techniques For React Native Ui Components](/blog/advanced-techniques-for-react-native-ui-components.md)
- [`vector_store` holds your indexed documents (see the multimodal RAG post](/blog/agentic-rag.md)
- [Ai Document Automation Extraction To Action](/blog/ai-document-automation-extraction-to-action.md)
- [Ai Legal Assistant Document Authoring](/blog/ai-legal-assistant-document-authoring.md)
- [Angular File Viewer Pdf Image Office Files](/blog/angular-file-viewer-pdf-image-office-files.md)
- [Auto Tagging And Document Accessibility In Dotnet Sdk](/blog/auto-tagging-and-document-accessibility-in-dotnet-sdk.md)
- [Best Document Viewers](/blog/best-document-viewers.md)
- [The CEO’s AI playbook: Why decision architecture beats model selection](/blog/ceo-ai-playbook-decision-architecture.md)
- [1. Extract and chunk the PDF.](/blog/chat-with-pdf.md)
- [Complete Guide To Pdfjs](/blog/complete-guide-to-pdfjs.md)
- [Construction Document Data Extraction](/blog/construction-document-data-extraction.md)
- [Convert One Drive Files To Pdf In Sharepoint](/blog/convert-one-drive-files-to-pdf-in-sharepoint.md)
- [Create And Edit Pdfs In Flutter](/blog/create-and-edit-pdfs-in-flutter.md)
- [Create Pdfs With React](/blog/create-pdfs-with-react.md)
- [Creating A Document Scanner With Ocr In Python](/blog/creating-a-document-scanner-with-ocr-in-python.md)
- [Creating And Filling Pdf Forms Programmatically In Javascript](/blog/creating-and-filling-pdf-forms-programmatically-in-javascript.md)
- [The CTO’s AI playbook: Why accountability architecture beats orchestration](/blog/cto-ai-playbook-accountability-architecture.md)
- [Digital Signatures](/blog/digital-signatures.md)
- [Digital Workflow Automation](/blog/digital-workflow-automation.md)
- [Document Ai Vs Ocr](/blog/document-ai-vs-ocr.md)
- [Document Extraction Confidence Scores](/blog/document-extraction-confidence-scores.md)
- [Document Viewer](/blog/document-viewer.md)
- [Emerging threats: Your logging system may be an agentic threat vector](/blog/emerging-threats-your-logging-system.md)
- [app.py](/blog/extract-text-from-pdf-using-python.md)
- [Fillable Pdf](/blog/fillable-pdf.md)
- [How To Add Digital Signature To Pdf Using React](/blog/how-to-add-digital-signature-to-pdf-using-react.md)
- [How To Build A Dotnet Maui Pdf Viewer](/blog/how-to-build-a-dotnet-maui-pdf-viewer.md)
- [How To Build A Flutter Pdf Viewer](/blog/how-to-build-a-flutter-pdf-viewer.md)
- [or](/blog/how-to-build-a-javascript-pdf-viewer-with-pdfjs.md)
- [How To Build A Javascript Pdf Viewer](/blog/how-to-build-a-javascript-pdf-viewer.md)
- [or](/blog/how-to-build-a-nextjs-pdf-viewer.md)
- [How To Build A Powerpoint Viewer Using Javascript](/blog/how-to-build-a-powerpoint-viewer-using-javascript.md)
- [Using Yarn](/blog/how-to-build-a-react-excel-viewer.md)
- [How To Build A React Native Pdf Viewer](/blog/how-to-build-a-react-native-pdf-viewer.md)
- [How To Build A React Powerpoint Viewer](/blog/how-to-build-a-react-powerpoint-viewer.md)
- [How To Build A Reactjs File Viewer](/blog/how-to-build-a-reactjs-file-viewer.md)
- [or](/blog/how-to-build-a-reactjs-pdf-viewer-with-react-pdf.md)
- [or](/blog/how-to-build-a-reactjs-pdf-viewer.md)
- [How To Build A Reactjs Viewer With Pdfjs](/blog/how-to-build-a-reactjs-viewer-with-pdfjs.md)
- [How To Build A Vuejs Pdf Viewer With Pdfjs](/blog/how-to-build-a-vuejs-pdf-viewer-with-pdfjs.md)
- [How To Build A Vuejs Pdf Viewer](/blog/how-to-build-a-vuejs-pdf-viewer.md)
- [How To Build An Android Pdf Viewer](/blog/how-to-build-an-android-pdf-viewer.md)
- [How To Build An Angular Pdf Viewer With Ng2 Pdf Viewer](/blog/how-to-build-an-angular-pdf-viewer-with-ng2-pdf-viewer.md)
- [How To Build An Angular Pdf Viewer With Pdfjs](/blog/how-to-build-an-angular-pdf-viewer-with-pdfjs.md)
- [How To Convert Docx To Pdf Using Javascript](/blog/how-to-convert-docx-to-pdf-using-javascript.md)
- [How To Convert Docx To Pdf Using Python](/blog/how-to-convert-docx-to-pdf-using-python.md)
- [How To Convert Html To Pdf Using Html2pdf](/blog/how-to-convert-html-to-pdf-using-html2pdf.md)
- [or](/blog/how-to-convert-html-to-pdf-using-react.md)
- [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 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)
- [Open an image.](/blog/how-to-use-tesseract-ocr-in-python.md)
- [From an HTML string.](/blog/html-in-pdf-format.md)
- [Javascript Pdf Editors](/blog/javascript-pdf-editors.md)
- [Javascript Pdf Libraries](/blog/javascript-pdf-libraries.md)
- [Linearized Pdf](/blog/linearized-pdf.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 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)
- [Building WCAG 2.2, Section 508, and PDF/UA-compliant PDFs with an SDK](/blog/pdf-accessibility.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)
- [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)
- [Pdfjs Limitations Commercial Upgrade](/blog/pdfjs-limitations-commercial-upgrade.md)
- [Pdfjs Native Annotation Layer Forms](/blog/pdfjs-native-annotation-layer-forms.md)
- [Pdfjs Navigation Zoom Rotation](/blog/pdfjs-navigation-zoom-rotation.md)
- [Pdfjs Pdf Page Manipulation Pdf Lib](/blog/pdfjs-pdf-page-manipulation-pdf-lib.md)
- [Pdfjs React Viewer Setup](/blog/pdfjs-react-viewer-setup.md)
- [Pdfjs Rendering Overlays React Portals](/blog/pdfjs-rendering-overlays-react-portals.md)
- [Pdfjs Server Side Text Extraction](/blog/pdfjs-server-side-text-extraction.md)
- [Pdfjs Sticky Note Annotations](/blog/pdfjs-sticky-note-annotations.md)
- [Pdfjs Text Highlight Annotations](/blog/pdfjs-text-highlight-annotations.md)
- [Pdfjs Text Search Pdffindcontroller](/blog/pdfjs-text-search-pdffindcontroller.md)
- [Pdfjs Thumbnail Sidebar](/blog/pdfjs-thumbnail-sidebar.md)
- [Process Flows](/blog/process-flows.md)
- [React Native Pdf Annotation](/blog/react-native-pdf-annotation.md)
- [Using Yarn](/blog/react-pdf-editor.md)
- [or](/blog/sample-blog-updated.md)
- [Add DWS MCP Server to your Claude Code project.](/blog/teaching-llms-to-read-pdfs.md)
- [Open an image file.](/blog/tesseract-python-guide.md)
- [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)
- [Convert an HTML file to PDF.](/blog/top-ten-ways-to-convert-html-to-pdf.md)
- [Vector Pdf](/blog/vector-pdf.md)
- [Wcag2 Accessibility Requirements Documents](/blog/wcag2-accessibility-requirements-documents.md)
- [Web Sdk Is Now Headless](/blog/web-sdk-is-now-headless.md)
- [What Are Annotations](/blog/what-are-annotations.md)
- [What Is A Vpat](/blog/what-is-a-vpat.md)
- [What Is Document Processing](/blog/what-is-document-processing.md)
- [What Is Intelligent Document Processing](/blog/what-is-intelligent-document-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)

