---
title: "Convert HTML to PDF in JavaScript with html2pdf.js"
canonical_url: "https://www.nutrient.io/blog/how-to-convert-html-to-pdf-using-html2pdf/"
md_url: "https://www.nutrient.io/blog/how-to-convert-html-to-pdf-using-html2pdf.md"
last_updated: "2026-07-31T07:32:34.926Z"
description: "Convert HTML to PDF client-side with html2pdf.js — setup, customization options, and best practices. No server required."
---

**TL;DR**

[`html2pdf.js`](https://ekoopmans.github.io/html2pdf.js/) is a lightweight JavaScript library that converts HTML to PDF entirely on the client side by combining [`html2canvas`](https://github.com/niklasvh/html2canvas) (for capturing HTML elements) and [`jsPDF`](https://github.com/parallax/jsPDF) (for PDF generation). It requires minimal setup — just include the library, select your HTML element, configure options like page size and margins, and call `html2pdf().from(element).save()`. It’s great for simple documents, but for complex layouts or advanced features, consider [Nutrient’s HTML-to-PDF API](https://www.nutrient.io/api/html-to-pdf-api/).

## Why choose html2pdf.js?

html2pdf.js generates PDFs directly in the browser:

- Runs entirely in the browser — no server needed.

- Simple API — Include the library, select an element, and call `.save()`.

- Customizable output — Set margins, page size, orientation, and image quality.

It works well for lightweight tools, invoices, or downloadable content.

## Getting started with html2pdf

1. Include html2pdf.js in your HTML file by downloading it from the [GitHub repository](https://github.com/eKoopmans/html2pdf.js) or loading it via [CDN](https://cdnjs.com/libraries/html2pdf.js):

	```html

	<script
		src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.12.1/html2pdf.bundle.min.js"
		integrity="sha512-D25Z8/1q2z65ZpJ3NzY6XiPZfwjhbv34OTQHDIZd+KPK+uWCovGt+fMkSzW8ArzCMFUgZt6Cdu7qoXNuy6a2GA=="
		crossorigin="anonymous"
		referrerpolicy="no-referrer"
	></script>
	```

2. Create the HTML content you want to convert. Use an existing element on the page or create a new one. The following example uses a `<div>` with some text and basic styling:

	```html

	<!DOCTYPE html>
	<html>
		<head>
			<meta charset="utf-8" />
			<meta http-equiv="X-UA-Compatible" content="IE=edge" />
			<title>HTML to PDF Using html2pdf</title>
			<meta
				name="viewport"
				content="width=device-width, initial-scale=1"
			/>
			<!-- html2pdf CDN link -->

			<script
				src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.12.1/html2pdf.bundle.min.js"
				integrity="sha512-D25Z8/1q2z65ZpJ3NzY6XiPZfwjhbv34OTQHDIZd+KPK+uWCovGt+fMkSzW8ArzCMFUgZt6Cdu7qoXNuy6a2GA=="
				crossorigin="anonymous"
				referrerpolicy="no-referrer"
			></script>
		</head>
		<body>
			<div id="content">
				<h1 id="my-element">Welcome to html2pdf Tutorial</h1>
				<p>
					This is an example of converting HTML content to a PDF file
					using the html2pdf JavaScript library.
				</p>
			</div>
			<script src="index.js"></script>
		</body>
	</html>
	```

3. Create a JavaScript file (e.g. `index.js`). Select the HTML element to convert using a DOM selector. To convert the entire page, use [`document.documentElement`](https://developer.mozilla.org/en-US/docs/Web/API/Document/documentElement):

	```js

	const element = document.documentElement;
	```

   This selects the `<html>` element and all its children. To convert only a specific part of the page, target an element by ID or class:

	```js

	const element = document.querySelector('#my-element');

	```

   This selects the element with the ID `my-element`.

4. Configure conversion options such as file name, paper size, page orientation, margins, and image quality:

	```js

	const options = {
		filename: 'my-document.pdf',
		margin: 1,
		image: { type: 'jpeg', quality: 0.98 },
		html2canvas: { scale: 2 },
		jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' },
	};
	```

   This names the output `'my-document.pdf'`, uses JPEG images at 98 percent quality, and passes additional settings to html2canvas and jsPDF.

5. Call `html2pdf()` to run the conversion and save the PDF:

	```js

	html2pdf().set(options).from(element).save();
	```

   Here’s the complete `index.js`:

	```js

	// index.js
	const element = document.getElementById('content');

	const options = {
		filename: 'my-document.pdf',
		margin: 1,
		image: { type: 'jpeg', quality: 0.98 },
		html2canvas: { scale: 2 },
		jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' },
	};

	html2pdf().set(options).from(element).save();
	```

6. Open the HTML file in Chrome, Firefox, or Edge. The browser downloads the PDF automatically.![example output](@/assets/images/blog/2023/how-to-convert-html-to-pdf-using-html2pdf/output.png)

### Customization examples

Below are two common PDF configuration adjustments.

- Example 1: Set page size and orientation

Choose from standard page sizes (e.g. A4, letter) and set the orientation (portrait or landscape):

```js

const options = {
	jsPDF: { unit: 'mm', format: 'a4', orientation: 'landscape' },
};

```

- Example 2: Control page breaks

```js

const options = {
	jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' },
	pagebreak: { mode: 'avoid-all', before: '#page2el' },

};

```

html2pdf.js provides many more [configuration options](https://ekoopmans.github.io/html2pdf.js/#options) in its documentation.

### Multipage documents with page breaks

html2pdf.js respects CSS `break-before`, `break-after`, and `break-inside` rules. You can also add the `html2pdf__page-break` class to force a break after any element:

```html

<div id="report">
	<section>
		<h2>Page 1 content</h2>
		<p>First page text here...</p>
	</section>
	<div class="html2pdf__page-break"></div>
	<section>
		<h2>Page 2 content</h2>
		<p>Second page text here...</p>
	</section>
</div>

```

```js

html2pdf().set({
		margin: 10,
		filename: 'report.pdf',
		pagebreak: { mode: ['avoid-all', 'css', 'legacy'] },
		jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
	}).from(document.getElementById('report')).save();

```

The `pagebreak.mode` array tells html2pdf.js to respect CSS break rules and the legacy `html2pdf__page-break` class, and to avoid splitting elements across pages.

## Using html2pdf.js with React

Use `useRef` to reference the DOM element and trigger the conversion from an event handler:

```js

import { useRef } from 'react';
import html2pdf from 'html2pdf.js';

function Invoice() {
	const ref = useRef();

	const downloadPDF = () => {
		html2pdf().set({
				margin: 10,
				filename: 'invoice.pdf',
				html2canvas: { scale: 2 },
				jsPDF: { unit: 'mm', format: 'a4' },
			}).from(ref.current).save();
	};

	return (
		<>
			<div ref={ref}>
				<h1>Invoice #1234</h1>

				<p>Amount due: $150.00</p>
			</div>
			<button onClick={downloadPDF}>Download PDF</button>
		</>
	);
}

```

Install with `npm install html2pdf.js`. The library accesses the DOM directly via the ref, so it works with any React setup (Vite, Next.js client components, Create React App).

## Troubleshooting common issues

| Problem                         | Cause                                                        | Fix                                                                                                                             |
| ------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
| **Blank PDF**                   | Element not in DOM when `html2pdf()` runs                    | Wrap in `setTimeout` or call after `DOMContentLoaded`. Verify the selector returns an element.                                  |
| **Blurry or pixelated text**    | Default `html2canvas.scale` is 1 (low resolution)            | Set `html2canvas: { scale: 2 }` or higher. This increases canvas resolution.                                                    |
| **Content cut off**             | Margins too large or element overflows page                  | Reduce `margin`, or set `html2canvas: { scrollY: 0, scrollX: 0 }` to capture from the top.                                      |
| **Page breaks in wrong places** | Missing page break configuration                             | Add `pagebreak: { mode: ['avoid-all', 'css', 'legacy'] }` and use CSS `break-before: page` or the `html2pdf__page-break` class. |
| **Images missing**              | Cross-origin images blocked by html2canvas                   | Set `html2canvas: { useCORS: true }` or host images on the same domain.                                                         |
| **Large file size**             | High-resolution canvas and JPEG quality                      | Lower `html2canvas.scale` to 1.5 or reduce `image.quality` (e.g. 0.8).                                                          |
| **Non-selectable text**         | html2pdf.js renders the page as an image, not as vector text | This is by design. For selectable text, use either jsPDF directly or a server-side tool like Playwright.                        |

## When to use html2pdf.js (and when not to)

html2pdf.js is a good fit when:

- You need client-side PDF generation with no backend.

- The document is simple — text, images, basic tables.

- You want minimal setup — one CDN script, no build step required.

Consider alternatives when:

- You need selectable, searchable text in the PDF — html2pdf.js renders pages as images. Use jsPDF (programmatic) or Playwright (server-side) instead.

- Your HTML uses complex CSS (flexbox, grid, `position: sticky`) — html2canvas doesn’t fully support these. Use Playwright or [Nutrient’s HTML-to-PDF API](https://www.nutrient.io/api/html-to-pdf-api/) for full CSS3 rendering.

- The document is large (50+ pages) — browser memory limits apply. Use a server-side solution.

- You need fillable forms, signatures, or annotations — these require a document SDK like [Nutrient](https://www.nutrient.io/sdk/).

## Converting HTML to PDF with Nutrient

If you need full CSS3 support, selectable text, fillable forms, or server-side generation, [Nutrient’s HTML-to-PDF API](https://www.nutrient.io/api/html-to-pdf-api/) handles HTML-to-PDF conversion as a cloud service — no browser binary or local rendering engine required.

### Quick example: Convert an HTML file to PDF (Node.js)

```js

// This code requires Node.js. Do not run this code directly in a web browser.

const axios = require('axios')
const FormData = require('form-data')
const fs = require('fs')

const formData = new FormData()
formData.append('html', fs.createReadStream('index.html'))

;(async () => {
  try {
    const response = await axios.post('https://api.nutrient.io/processor/generate_pdf', formData, {
      headers: formData.getHeaders({
        'Authorization': 'Bearer your_api_key_here'
      }),
      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("error", (err) => reject(err))
    stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")))
  })
}

```

### Using Document Engine (self-hosted)

If you need to keep documents on your own infrastructure, [Document Engine](https://www.nutrient.io/guides/document-engine/pdf-generation.md) provides the same HTML-to-PDF conversion as a self-hosted API:

```bash

curl -X POST http://localhost:5000/api/build \
  -H "Authorization: Token token=<API token>" \
  -F page.html=@index.html \
  -F instructions='{ "parts": [{ "html": "page.html" }] }' \
  -o result.pdf

```

Document Engine renders HTML with a full browser engine, so flexbox, grid, custom fonts, and `@media print` rules all work. It also converts HTML form elements into [fillable PDF fields](https://www.nutrient.io/guides/document-engine/forms/introduction-to-forms/form-fields.md).

### html2pdf.js vs. Nutrient

|                 | html2pdf.js                  | Nutrient                             |
| --------------- | ---------------------------- | ------------------------------------ |
| **Runs in**     | Browser                      | Cloud API or self-hosted server      |
| **CSS support** | Limited (html2canvas)        | Full CSS3 (browser engine)           |
| **Text output** | Image-based (not selectable) | Vector text (selectable, searchable) |
| **Forms**       | Not supported                | HTML forms → fillable PDF fields     |
| **Setup**       | One script tag               | API key and HTTP request             |
| **Cost**        | Free                         | [Free tier](https://dashboard.nutrient.io/sign_up/?product=processor), then pay-per-use |

[Start with 50 free credits](https://dashboard.nutrient.io/sign_up/?product=processor) — no commitment required.

## Other alternatives

- **Puppeteer / Playwright** — Node.js libraries that launch a headless browser and call `page.pdf()`. Full CSS3 support, selectable text, server-side rendering. Heavier to deploy but more capable. See our [top JavaScript PDF libraries](https://www.nutrient.io/blog/top-js-pdf-libraries/#6-puppeteer) post.

- **[jsPDF](https://github.com/parallax/jsPDF)** — Client-side like html2pdf.js, but you build the PDF programmatically instead of rendering HTML. Produces vector text (selectable and searchable), but no HTML input — you position elements with code.

- **[wkhtmltopdf](https://wkhtmltopdf.org/)** — Command-line tool using WebKit to convert HTML to PDF. Supports headers, footers, and page numbering, but requires server-side installation. See our [HTML to PDF in C# using wkhtmltopdf](https://www.nutrient.io/blog/how-to-convert-html-to-pdf-using-wkhtmltopdf-and-csharp/) post.

## Conclusion

html2pdf.js is the fastest way to generate a PDF from HTML in the browser — no server, no build step, one script tag. It works well for simple documents like invoices, receipts, and reports. For complex CSS layouts, selectable text, or production-scale generation, use Playwright (server-side) or [Nutrient’s API](https://www.nutrient.io/api/html-to-pdf-api/).

If you’re weighing html2pdf.js against other options, [HTML to PDF in JavaScript: Five libraries compared](https://www.nutrient.io/blog/html-to-pdf-in-javascript/) provides code examples and a full tradeoff breakdown for html2pdf.js, jsPDF, pdfmake, Playwright, and Nutrient.

## FAQ

#### What is html2pdf.js and how does it work?

`html2pdf.js` is a client-side JavaScript library for converting HTML to PDF. It uses `html2canvas` to render the page as an image and `jsPDF` to create a downloadable PDF file — no server needed.

#### How do I use html2pdf.js in a web project?

Include it via CDN or install it with `npm install html2pdf.js`. Then call `html2pdf().from(element).set(options).save()` to convert an HTML element into a PDF with optional customization.

#### Can I customize the PDF output with html2pdf.js?

Yes. You can configure filename, page size, margins, orientation, image type/quality, and more using the `set()` method and options like `jsPDF` and `html2canvas` settings.

#### What are the limitations of using html2pdf.js?

It can struggle with large documents, dynamic or script-generated content, and complex CSS layouts. Since rendering is image-based, output may lose fidelity or appear blurry on high-resolution screens.

#### What is Nutrient and how does it compare to html2pdf.js?

Nutrient offers HTML-to-PDF generation through a cloud API, SDKs, and no-code tools. Unlike html2pdf.js, Nutrient supports server-side rendering, pixel-perfect layouts, embedded fonts, forms, and enterprise features like security and compliance.

#### When should I use Nutrient instead of html2pdf.js?

Use html2pdf.js for fast, simple, client-side exports. Choose Nutrient when you need high fidelity, support for large documents, or production-grade PDF output with full customization and backend integration.

#### How do I convert HTML to PDF with Nutrient’s API?

Send a `POST` request to `https://api.nutrient.io/processor/generate_pdf` with your HTML file as a multipart form field named `html` and an `Authorization: Bearer <API_KEY>` header. The API returns a PDF stream. See the [Nutrient section](#converting-html-to-pdf-with-nutrient) above for a complete Node.js example.

#### Does Nutrient support CSS flexbox and grid in HTML-to-PDF conversion?

Yes. Nutrient uses a full browser rendering engine, so flexbox, grid, `@media print` rules, custom fonts, and other CSS3 features render accurately. html2pdf.js uses html2canvas, which has limited CSS support.

#### Can Nutrient convert HTML forms into fillable PDF forms?

Yes. Nutrient [Document Engine](https://www.nutrient.io/guides/document-engine/pdf-generation.md) converts HTML form elements — text inputs, checkboxes, dropdowns — into interactive [fillable PDF fields](https://www.nutrient.io/guides/document-engine/forms/introduction-to-forms/form-fields.md). This isn’t possible with html2pdf.js or other client-side libraries.

#### Is there a free tier for Nutrient’s HTML-to-PDF API?

Yes. Nutrient offers [50 free credits](https://dashboard.nutrient.io/sign_up/?product=processor) with no commitment. Each HTML-to-PDF conversion costs 1 credit. After the free tier, pricing is pay-per-use.
---

## 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 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)
- [or](/blog/how-to-convert-html-to-pdf-using-react.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)
- [Open an image.](/blog/how-to-use-tesseract-ocr-in-python.md)
- [From an HTML string.](/blog/html-in-pdf-format.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 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 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)
- [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)
- [Top 5 Javascript Pdf Viewers](/blog/top-5-javascript-pdf-viewers.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 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)

