---
title: "How to merge PDFs using an SDK: A developer’s guide"
canonical_url: "https://www.nutrient.io/blog/merge-pdfs/"
md_url: "https://www.nutrient.io/blog/merge-pdfs.md"
last_updated: "2026-08-11T08:08:12.855Z"
description: "Learn to merge PDFs with Nutrient SDK, DWS API, and pdf-lib, comparing features and ideal use cases for any project."
---

Merging PDFs is a common requirement in document-heavy applications, enabling users to consolidate multiple files into a single PDF. This capability is helpful for simplifying document management, creating portfolios, organizing files, and more. This post will explore how developers can merge PDFs programmatically, comparing [Nutrient](https://www.nutrient.io/sdk/web/) — previously PSPDFKit — a commercial SDK, with open source alternatives like [pdf-lib](https://pdf-lib.js.org/). It’ll also look at how merging PDFs can be implemented using Nutrient’s [DWS API](https://www.nutrient.io/api/).

**TL;DR**

There are three ways to merge PDFs programmatically:

- **Nutrient Web SDK** — Merge in the browser with the `applyOperations` API and the `importDocument` operation

- **Nutrient DWS API** — Merge server-side with a single REST call and no local dependencies

- **pdf-lib** — A free, open source option for Node.js and the browser

## Why merge PDFs?

Before diving into the code, it’s first helpful to quickly review why merging PDFs can be beneficial for developers and users alike.

- **Document organization** — Merging PDFs makes it easy to compile and organize information. For example, merging multiple invoices into one file can make reporting more manageable.

- **Reducing attachments** — Combining documents can reduce clutter, especially when sharing files via email or other platforms that limit the number of attachments.

- **Creating document portfolios** — Consolidating documents, like reports or contracts, into a single PDF can help users create organized portfolios.

- **Streamlined document processing** — For applications that process documents, merging PDFs simplifies workflows by minimizing the number of files handled.

However, challenges like maintaining document integrity, handling different PDF formats, and ensuring compatibility across devices can make PDF merging complex. This post aims to simplify this process with step-by-step examples.

## Merging PDFs with Nutrient Web SDK

[Nutrient](https://www.nutrient.io/sdk/web/) is a powerful [PDF SDK](https://www.nutrient.io/sdk/) offering a wide array of features for document management, including PDF merging, editing, and annotating. Its comprehensive API and extensive documentation make it a popular choice for [enterprise companies](https://www.nutrient.io/sdk/pricing/) that require advanced document capabilities. Nutrient’s suite of tools also includes DWS API, which empowers developers to automate and track workflows, making it easier to manage and process documents efficiently within applications.

### Steps to merge PDFs with Nutrient Web SDK

Here’s an example of how to merge PDF files using Nutrient. This method is efficient and well-suited for projects that require seamless document management.

1. To start, install Nutrient Web SDK in your project using npm or Yarn:

```bash

npm install @nutrient-sdk/viewer

# or

yarn add @nutrient-sdk/viewer

```

2. Copy the Nutrient Web SDK files to your assets directory:

```bash

cp -R./node_modules/@nutrient-sdk/viewer/dist/./assets/

```

3. Ensure your server has the correct MIME type for WebAssembly (`application/wasm`).

4. For the merging process, you should have your PDF files ready. In this case, you’ll be merging two files — `document.pdf` and `imported.pdf`.

5. Add an empty `<div>` to your HTML file where Nutrient Web SDK will be mounted:

```html

<div id="nutrient" style="width: 100%; height: 100vh;"></div>

```

6. Add this script tag to your HTML file to load the `index.js` file:

```html

<script type="module" src="index.js"></script>

```

7. In your JavaScript file (`index.js`), import Nutrient Web SDK and initialize it:

```javascript

import './assets/nutrient-viewer.js';

// Define the base URL for the Nutrient Web SDK assets.
const baseUrl = `${window.location.protocol}//${window.location.host}/assets/`;

NutrientViewer.load({
	baseUrl,
	container: '#nutrient',

	document: 'document.pdf', // The main document you want to load.
}).then((instance) => {
		console.log('Nutrient Web SDK loaded', instance);

		// Now merge another PDF using the `importDocument` operation.
		fetch('imported.pdf').then((res) => {
				if (!res.ok) {
					throw res;
				}
				return res.blob();
			}).then((blob) => {
				// Perform the `importDocument` operation to merge PDFs.
				instance.applyOperations([
					{
						type: 'importDocument',
						importedPageIndexes: [2, 4, [7, 8]], // Specify the pages to import.
						beforePageIndex: 3, // Import the document before page 3.
						document: blob, // The blob representing the imported document.
						treatImportedDocumentAsOnePage: false, // Treat the imported document as separate pages.
					},
				]);
			}).catch((error) =>
				console.error('Error importing document:', error),
			);
	}).catch((error) => {
		console.error('Error loading Nutrient:', error.message);
	});

```

### Key parameters in the importDocument operation

- **`beforePageIndex` or `afterPageIndex`** — Specifies where the imported document should be added in the current document.

- **`treatImportedDocumentAsOnePage`** — When set to `true`, all pages of the imported document are treated as a single page for subsequent operations. If set to `false`, each page is treated separately.

- **`importedPageIndexes`** — This array allows you to specify pages or a range of pages to import from the document. If omitted, the entire document is imported.

### Serving your project

Use a simple HTTP server to serve your project’s files. You can use the `serve` package to serve your project locally:

```bash

npm install --global serve

serve -l 8080.

```

Navigate to `http://localhost:8080` in your browser to view your PDF.

### Exporting the merged PDF

After applying the operations (i.e. merging the documents), you can export the final merged document using `instance.exportPDF()`:

```javascript

instance.exportPDF().then((pdfData) => {
	// You now have the merged PDF data as an ArrayBuffer.
	console.log('Merged PDF data:', pdfData);
	// You can save it, display it, or send it to the server.
});

```

By using Nutrient’s `importDocument` operation, you can easily merge multiple PDF files in the browser, by adding either entire documents or specific pages, and perform additional operations like rotation or text extraction. This solution is fully serverless and leverages WebAssembly for fast, secure, and private PDF rendering and editing directly in the browser.

You can try Nutrient without needing a trial key, although your document will include a watermark during this period. If you prefer to use the SDK without a watermark, you can easily get a 30-day full access trial by [requesting a trial key](https://www.nutrient.io/contact-sales/) — no additional setup is required.

## Merging PDFs using Nutrient DWS API

First, make sure you have the required libraries installed.

1. Install [Axios](https://github.com/axios/axios) for making HTTP requests:

```bash

npm install axios

```

2. Install [Form-Data](https://www.npmjs.com/package/form-data) to handle file uploads:

```bash

npm install form-data

```

3. Ensure you have `fs` ([file system](https://nodejs.org/api/fs.html)) built in with Node.js, so that there’s no need to install it separately.

4. Create a folder for your project (e.g. `pdf-merge`), and inside this folder, place the PDFs you want to merge (`first_half.pdf` and `second_half.pdf`). The folder structure will look like this:

```

pdf-merge/
  ├── first_half.pdf
  ├── second_half.pdf
  ├── mergePDFs.js

```

5. Create a new file named `mergePDFs.js` in the project folder, and follow the code below.

At the top of your file, import the libraries you’ll use:

```javascript

// Import the required libraries.
const axios = require('axios'); // For making HTTP requests.
const FormData = require('form-data'); // For handling form data (file uploads).
const fs = require('fs'); // For reading files from the file system.

```

- `axios` is used for making HTTP requests to the API.

- `form-data` helps construct the `multipart/form-data` request needed for file uploads.

- `fs` allows you to read files from your local machine.

6. Create a new `FormData` object to prepare the data you’ll send in the API request:

```javascript

// Create a `FormData` instance.
const formData = new FormData();

```

This will be used to append the PDFs and the instructions for merging.

7. Add an instruction object to the `FormData` that tells the API which PDFs to merge:

```javascript

// Append the instructions that tell the API how to merge the PDFs.
formData.append(
	'instructions',
	JSON.stringify({
		parts: [
			{
				file: 'first_half', // Reference to the first PDF.
			},
			{
				file: 'second_half', // Reference to the second PDF.
			},
		],
	}),
);

```

- The `instructions` field tells the API which files to merge and in what order.

- `"first_half"` and `"second_half"` correspond to the file names used in the next steps.

8. Now, attach the actual PDF files (`first_half.pdf` and `second_half.pdf`) to the `FormData`. This is done by reading the files and appending them:

```javascript

// Attach the actual PDF files to the `FormData`.
formData.append('first_half', fs.createReadStream('first_half.pdf')); // Attach the first PDF.
formData.append('second_half', fs.createReadStream('second_half.pdf')); // Attach the second PDF.

```

- `fs.createReadStream()` reads the file and prepares it to be sent as part of the form data.

9. You’ll now create an async function to send the request to Nutrient DWS API. This function will handle making the request and saving the merged PDF:

```javascript

// Create an async function to send the request to DWS API.
(async () => {
	try {
		// Send a POST request to the API with the form data and authorization header.
		const response = await axios.post(
			'https://api.nutrient.io/build',
			formData,
			{
				headers: formData.getHeaders({
					Authorization: 'Bearer your_api_key_here', // Replace with your actual API key.
				}),
				responseType: 'stream', // Set the response type to 'stream' to handle large files.
			},
		);

		// Pipe the merged PDF result into a file called "result.pdf."
		response.data.pipe(fs.createWriteStream('result.pdf'));
		console.log('PDFs merged successfully!');
	} catch (e) {
		// If there is an error, log it.
		const errorString = await streamToString(e.response.data);
		console.log('Error merging PDFs:', errorString);
	}
})();

```

- `axios.post()` sends the request to the DWS API.

- `responseType: "stream"` allows you to handle the large merged PDF as a stream.

- The merged PDF will be written to a file called `result.pdf`.

10. If the request fails, you’ll need a helper function to handle the error response and log it:

```javascript

// Helper function to handle the response stream and convert it to a string (for error handling).
function streamToString(stream) {
	const chunks = [];
	return new Promise((resolve, reject) => {
		stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
		stream.on('error', (err) => reject(err));
		stream.on('end', () =>
			resolve(Buffer.concat(chunks).toString('utf8')),
		);
	});
}

```

- This function listens to the response stream and converts it to a string, allowing you to handle error messages properly.

11. After you’ve written your `mergePDFs.js` file, run the script in the terminal:

```bash

node mergePDFs.js

```

- This will send a request to DWS API, merge the PDFs, and save the result as `result.pdf` in your project folder.

After the script has finished running, you’ll see a new file called `result.pdf` in your folder. Open this file to verify the PDFs were merged correctly.

By following these steps, you can merge PDFs using the Nutrient API. The code makes a POST request to the API, attaches the PDF files, and provides instructions on how to merge them. If the operation is successful, the merged PDF is saved as `result.pdf`.

## Open source alternative for merging PDFs: pdf-lib

For those looking for a free, customizable solution, [pdf-lib](https://pdf-lib.js.org/) is a lightweight, open source library for PDF manipulation. It supports creating and modifying PDFs, including merging documents.

### Step-by-step guide to merging PDFs with pdf-lib

1. Install the pdf-lib package using npm:

```bash

npm install pdf-lib

```

2. Start by importing the `PDFDocument` class from pdf-lib and the `fs` module for handling file operations:

```javascript

import { PDFDocument } from 'pdf-lib';
import fs from 'fs';

```

3. Define an async function, `mergePDFsWithPDFLib()`, to handle the merging process. In this function, load two PDF files from the file system using `fs.readFileSync()`. These files should be in the same directory as your code, or you can provide a full file path if they’re located elsewhere:

```javascript

async function mergePDFsWithPDFLib() {
    // Load the PDF files.
    const pdfDoc1 = await PDFDocument.load(fs.readFileSync("first.pdf"));
    const pdfDoc2 = await PDFDocument.load(fs.readFileSync("second.pdf"));

```

4. Create a new empty PDF document where you’ll store the merged content of the PDFs. This document will act as the final output for your merged files:

```javascript

// Create a new PDF document.
const mergedPDF = await PDFDocument.create();

```

5. Copy all pages from the first PDF (`pdfDoc1`) and add them to the new `mergedPDF` document. This is done using the `copyPages()` function, which lets you copy specific pages by index:

```javascript

// Copy pages from the first PDF.
const copiedPages1 = await mergedPDF.copyPages(
	pdfDoc1,
	pdfDoc1.getPageIndices(),
);
copiedPages1.forEach((page) => mergedPDF.addPage(page));

```

6. Repeat the same process for the second PDF (`pdfDoc2`). This copies all pages from `pdfDoc2` and adds them to `mergedPDF`:

```javascript

// Copy pages from the second PDF.
const copiedPages2 = await mergedPDF.copyPages(
	pdfDoc2,
	pdfDoc2.getPageIndices(),
);
copiedPages2.forEach((page) => mergedPDF.addPage(page));

```

7. Once all pages from both PDFs have been added to `mergedPDF`, save the document to your file system. Use the `save()` method to get the merged PDF content as a byte array, and then write this to a new file (e.g. `merged.pdf`):

```javascript

// Save the merged PDF.
const mergedPDFBytes = await mergedPDF.save();
fs.writeFileSync("merged.pdf", mergedPDFBytes);
}

```

8. Now, call the function and handle any errors with `.catch(console.error)`:

```javascript

mergePDFsWithPDFLib().catch(console.error);

```

### Full code example

Here’s the complete code for merging two PDF files:

```javascript

import { PDFDocument } from 'pdf-lib';
import fs from 'fs';

async function mergePDFsWithPDFLib() {
	// Load the PDF files.
	const pdfDoc1 = await PDFDocument.load(fs.readFileSync('first.pdf'));
	const pdfDoc2 = await PDFDocument.load(
		fs.readFileSync('second.pdf'),
	);

	// Create a new PDF document.
	const mergedPDF = await PDFDocument.create();

	// Copy pages from the first PDF.
	const copiedPages1 = await mergedPDF.copyPages(
		pdfDoc1,
		pdfDoc1.getPageIndices(),
	);
	copiedPages1.forEach((page) => mergedPDF.addPage(page));

	// Copy pages from the second PDF.
	const copiedPages2 = await mergedPDF.copyPages(
		pdfDoc2,
		pdfDoc2.getPageIndices(),
	);
	copiedPages2.forEach((page) => mergedPDF.addPage(page));

	// Save the merged PDF.
	const mergedPDFBytes = await mergedPDF.save();
	fs.writeFileSync('merged.pdf', mergedPDFBytes);
}

mergePDFsWithPDFLib().catch(console.error);

```

### Explanation of key steps

1. **Load PDFs** — `PDFDocument.load()` reads each PDF and loads it as a document object.

2. **Create a new document** — `PDFDocument.create()` initializes an empty PDF to store merged pages.

3. **Copy pages** — `copyPages()` copies pages from each PDF and inserts them into the new document.

4. **Save the merged PDF** — `mergedPDF.save()` converts the new document into a byte array, which is then saved as `merged.pdf`.

Using pdf-lib makes it straightforward to merge multiple PDFs into one. With these steps, you can easily extend this process to merge any number of PDFs by following the same approach. This open source solution is lightweight and efficient, ideal for smaller projects or when you need customizable PDF handling without a commercial SDK.

## Comparison of Nutrient and open source libraries

| Feature         | **Nutrient Web SDK**                                                  | **Nutrient DWS API**                                               | **pdf-lib**                                   |
| --------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------ | --------------------------------------------- |
| **Ease of use** | High, easy to integrate                                               | High, easy to integrate with server-side automation                | Moderate, requires setup                      |
| **Features**    | Comprehensive PDF manipulation and annotation support                 | Server-side PDF merging, document workflow automation, scalability | Basic PDF manipulation, no annotation support |
| **Performance** | Optimized for enterprise use                                          | Highly scalable and optimized for enterprise environments          | Good for small projects                       |
| **Cost**        | Free license available with watermark, paid license for full features | Free trial with 50 credits, 5 MB file size limit                   | Free and open source                          |

Nutrient Web SDK offers a free version with a watermark, allowing users to try the solution before purchasing a full license. Nutrient DWS API also provides a free trial with a watermark, enabling users to test its server-side PDF merging and automation capabilities. pdf-lib remains a free and open source library for basic PDF manipulation tasks.

## Best practices for merging PDFs

Merging PDFs effectively requires some best practices to ensure smooth functionality and maintain performance:

- **Optimize file sizes** — Reducing PDF size can improve performance and load times. Use compression libraries or remove unnecessary metadata to keep file sizes manageable.

- **Handle errors gracefully** — When dealing with multiple file types and sources, add error handling to ensure smooth merging, even with problematic files.

- **Privacy and security** — For sensitive documents, use secure file handling methods and consider merging encrypted PDFs when necessary.

## Conclusion

In this post, you learned about PDF merging using [Nutrient Web SDK](https://www.nutrient.io/guides/web.md) and [DWS API](https://www.nutrient.io/api/), alongside the open source [pdf-lib](https://pdf-lib.js.org/). Nutrient Web SDK offers an enterprise-level solution with advanced features, while DWS API focuses on scalable document processing. pdf-lib is a free, flexible option for simpler merging needs. Choose the solution that best fits your requirements.

## FAQ

#### What is Nutrient Web SDK, and how does it compare to DWS API for PDF merging?

Nutrient Web SDK is a comprehensive toolkit for PDF manipulation, including merging, editing, and securing PDFs within an application. DWS API, a cloud-based service, allows for merging PDFs via HTTP requests, making it suitable for automated and server-side operations.

#### Which is better for merging PDFs: Nutrient Web SDK or DWS API?

The choice depends on your project needs:

- **Nutrient Web SDK** — Ideal for client-side applications that require extensive PDF manipulation features beyond merging.

- **DWS API** — Perfect for cloud-based workflows, allowing multiple PDF operations through HTTP endpoints without managing local resources.

#### Can pdf-lib handle PDF merging, and is it a good alternative?

Yes, pdf-lib is a popular open source JavaScript library for PDF manipulation, including merging capabilities. While it’s sufficient for basic PDF merging tasks, it lacks some advanced functionalities and optimizations for large files, which SDKs like Nutrient and DWS API provide.

#### How does the performance of pdf-lib compare with Nutrient Web SDK and DWS API for large PDF files?

For large PDFs:

- **Nutrient Web SDK** — Optimized for handling complex, large files with minimal lag.

- **DWS API** — Suitable for large files processed on the server side, utilizing cloud resources to reduce strain on the client side.

- **pdf-lib** — May struggle with very large files, as it’s designed for smaller applications and may lack advanced optimizations.

#### Can I use an API to merge PDFs with pdf-lib?

No, pdf-lib is a JavaScript library that operates within a JavaScript environment, and it doesn’t have an HTTP API. For API-based merging, you need to use DWS API or Nutrient’s server-side solutions.

#### Are there any security settings in Nutrient Web SDK and DWS API when merging PDFs?

Yes, both Nutrient Web SDK and DWS API support security features such as password protection, encryption, and setting permissions on merged PDFs. pdf-lib, however, has limited security settings compared to these SDKs.

#### Is pdf-lib free, and how does that affect its use for PDF merging?

pdf-lib is free and open source, making it a great option for small-scale applications or when budget constraints exist. However, for larger, more robust applications requiring high performance and security, Nutrient Web SDK or DWS API might be better choices despite their licensing costs.
---

## 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 Ai Platforms](/blog/best-document-ai-platforms.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)
- [Document Watermarking](/blog/document-watermarking.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)
- [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 Data Extraction Developer Guide](/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)
- [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)
- [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)
- [Sdk Product Updates Q2 2026](/blog/sdk-product-updates-q2-2026.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)

