---
title: "PDF.js in Vue.js: Build a PDF viewer (2026)"
canonical_url: "https://www.nutrient.io/blog/how-to-build-a-vuejs-pdf-viewer-with-pdfjs/"
md_url: "https://www.nutrient.io/blog/how-to-build-a-vuejs-pdf-viewer-with-pdfjs.md"
last_updated: "2026-07-10T11:16:01.215Z"
description: "Build a PDF viewer in Vue.js with PDF.js — setup, rendering, and navigation controls — plus a Nutrient Web SDK comparison for annotations, forms, and Office support."
---

**TL;DR**

This tutorial compares two approaches for building a Vue.js PDF viewer: pdfvuer (open source, basic features) and Nutrient Web SDK (commercial, 30+ features including annotations, forms, and signatures). You’ll learn to set up both solutions with complete code examples, from project creation to rendering PDFs in the browser.

[Vue.js](https://vuejs.org/) is a popular frontend JavaScript framework for building single-page applications (SPAs) and user interfaces (UIs). It enables rapid prototyping and building fast, reliable applications.

This tutorial shows how to create a PDF viewer with PDF.js. [PDF.js](https://mozilla.github.io/pdf.js/) is an open source JavaScript library for viewing PDF files in the browser.

The first part covers creating a PDF viewer with an open source library. The second part provides a step-by-step guide for integrating the Nutrient [Vue.js PDF viewer library](https://www.nutrient.io/guides/web/viewer.md) into a Vue.js project. The Nutrient viewer library provides features beyond what PDF.js offers:

- A prebuilt UI — Save time with a well-documented list of APIs when customizing the UI to meet your exact requirements.

- Annotation tools — Draw, circle, highlight, comment, and add notes to documents with 15+ prebuilt annotation tools.

- Multiple file types — Support client-side viewing of [PDFs](https://www.nutrient.io/guides/web.md), [MS Office documents](https://www.nutrient.io/guides/web/viewer.md), and [image files](https://www.nutrient.io/guides/web/viewer/images.md).

- 30+ features — Easily add features like PDF editing, digital signatures, form filling, real-time document collaboration, and more.

- Dedicated support — Deploy faster by working 1-on-1 with our developers.

## Requirements

Before starting, install:

- [Git](https://git-scm.com/downloads)

- [Node.js](https://nodejs.org/en/) (version 18 or later)

- A package manager: [npm](https://www.npmjs.com/) or [yarn](https://yarnpkg.com/)

## Creating the PDF viewer with open source libraries

Two main PDF.js wrappers simplify creating a PDF viewer with Vue.js: [`vue-pdf`](https://github.com/FranckFreiburger/vue-pdf) and [`pdfvuer`](https://github.com/arkokoley/pdfvuer).

| Feature             | vue-pdf                                          | pdfvuer                   |
| ------------------- | ------------------------------------------------ | ------------------------- |
| npm downloads       | Higher                                           | Lower                     |
| Vue 3 support       | No                                               | Yes                       |
| Vue 2 support       | Yes                                              | Yes                       |
| Actively maintained | No                                               | Limited                   |
| Documentation       | Limited                                          | Limited                   |
| Known issues        | [Printing bug](https://github.com/FranckFreiburger/vue-pdf/issues/291) with [unmerged fix](https://github.com/FranckFreiburger/vue-pdf/pull/130) | Few customization options |

This tutorial uses `pdfvuer` because it supports both Vue 2 and Vue 3.

## Installing Vue CLI

To work with Vue.js, install [Vue CLI](https://cli.vuejs.org/) (command-line interface), the standard tooling for Vue.js development. It helps create, build, and run Vue.js applications.

Install the CLI using [`npm`](https://www.npmjs.com/get-npm) (included with Node.js) or [`yarn`](https://yarnpkg.com/lang/en/docs/install/):

```bash

npm install -g @vue/cli

```

```bash

yarn global add @vue/cli

```

Verify the installation:

```bash

vue --version

```

This tutorial uses Vue CLI version 5.x. Note that Vue CLI is now in maintenance mode — for new projects, the Vue team recommends [create-vue](https://github.com/vuejs/create-vue) (Vite-based), the official Vue project scaffolding tool. The Nutrient integration below works the same either way.

## Creating the project for pdfvuer

1. Create a new project:

   ```bash

   vue create pdfvuer-example
   ```

2. When prompted, select **Default (Vue 3)** (`[Vue 3] babel, eslint`) from the list.![screen showing the vue.js project creation](@/assets/images/blog/2021/how-to-build-a-vuejs-pdf-viewer-with-pdfjs/vue-cli-project-creation.png)

3. Change to the project directory:

   ```bash

   cd pdfvuer-example
   ```

### Adding the pdfvuer library

Install the `pdfvuer` library:

```bash

npm install pdfvuer@next --save

```

```bash

yarn add pdfvuer@next

```

### Displaying the PDF

Add a PDF document named `example.pdf` to the `public` directory (use our [demo document](https://www.nutrient.io/example.pdf) as an example).

Open `src/App.vue` and replace its contents with:

```vue

<template>
	<pdf src="example.pdf" :page="1" />
</template>

<script>
import pdf from 'pdfvuer';

export default {
	components: {
		pdf,
	},
};
</script>

```

- The `script` tag imports the `pdf` component from the `pdfvuer` library.

- The `template` tag renders a `pdf` element with the `src` attribute pointing to the PDF file and the `page` attribute set to `1` (first page).

Start the development server:

```bash

npm run serve

```

```bash

yarn serve

```

The app runs at `http://localhost:8080/` (the port may vary if 8080 is already in use).

The source code for this project is available on [GitHub](https://github.com/PSPDFKit-labs/pdfvuer-web-example-vue).![pdfvuer demo](@/assets/images/blog/2021/how-to-build-a-vuejs-pdf-viewer-with-pdfjs/pdfvuer-demo.png)

This library has limited customization options. It only displays the first page of the document, with no built-in page navigation.

The next section shows how [Nutrient Web SDK](https://www.nutrient.io/sdk/web/) addresses these limitations.

## Building a Vue.js PDF viewer with Nutrient

Nutrient Web SDK provides a PDF library for building Vue.js PDF viewers. It includes more than 30 features:

- [15+ PDF annotation tools](https://www.nutrient.io/guides/web/annotations.md)

- [PDF form filling and creation](https://www.nutrient.io/guides/web/forms.md)

- [Digital and electronic signatures](https://www.nutrient.io/guides/web/signatures.md)

- [Document editing](https://www.nutrient.io/guides/web/editor.md) (rotate, merge, split, and more)

- [Image and Office file viewing](https://www.nutrient.io/guides/web/viewer.md)

- [Real-time collaboration](https://www.nutrient.io/guides/web/instant-synchronization.md)

Integration into new or existing Vue.js projects takes a few steps.

1. Create a new Vue.js project for Nutrient integration:

   ```bash

   vue create nutrient-vue-project
   ```

2. When prompted, select **Default (Vue 3)** (`[Vue 3] babel, eslint`). Then change to the project directory:

   ```bash

   cd nutrient-vue-project
   ```

### Adding Nutrient

1. Install `@nutrient-sdk/viewer` as a dependency with `npm` or `yarn`:

   ```bash

   npm install @nutrient-sdk/viewer
   ```

   ```bash

   yarn add @nutrient-sdk/viewer
   ```

2. The Nutrient SDK uses private class methods, which require Babel plugins to transpile correctly. Install the required Babel plugins:

   ```bash

   npm install -D @babel/plugin-transform-private-methods @babel/plugin-transform-class-properties @babel/plugin-transform-private-property-in-object
   ```

   ```bash

   yarn add -D @babel/plugin-transform-private-methods @babel/plugin-transform-class-properties @babel/plugin-transform-private-property-in-object
   ```

3. Update your `babel.config.js` file to include these plugins:

   ```js

   // babel.config.js

   module.exports = {
   	presets: ['@vue/cli-plugin-babel/preset'],
   	plugins: [
   		'@babel/plugin-transform-private-methods',
   		'@babel/plugin-transform-class-properties',
   		'@babel/plugin-transform-private-property-in-object',
   	],
   };
   ```

4. Create a `js` directory under the `public` directory:

   ```bash

   mkdir -p public/js
   ```

5. Copy the Nutrient Web SDK library assets to the `public/js` directory:

```shell

cp -R./node_modules/@nutrient-sdk/viewer/dist/nutrient-viewer-lib public/js/nutrient-viewer-lib

```

This copies the `nutrient-viewer-lib` directory from `node_modules/` into `public/js/`, making it available to the SDK at runtime.

### Displaying the PDF

1. Add a PDF document named `example.pdf` to the `public` directory (use our [demo document](https://www.nutrient.io/example.pdf) as an example).

2. Add a component wrapper for the Nutrient library and save it as `src/components/NutrientContainer.vue`:

   ```vue

   <!-- src/components/NutrientContainer.vue -->

   <template>
   	<div class="pdf-container"></div>
   </template>

   <script>
   import NutrientViewer from '@nutrient-sdk/viewer';

   export default {
   	name: 'NutrientContainer',
   	/**
   	 * The component receives the `pdfFile` prop, which is of type `String` and is required.
   	 */
   	props: {
   		pdfFile: {
   			type: String,
   			required: true,
   		},
   	},
   	/**
   	 * We wait until the template has been rendered to load the document into the library.
   	 */
   	mounted() {
   		this.loadNutrient().then((instance) => {
   			this.$emit('loaded', instance);
   		});
   	},
   	/**
   	 * We watch for `pdfFile` prop changes and trigger unloading and loading when there's a new document to load.
   	 */
   	watch: {
   		pdfFile(val) {
   			if (val) {
   				this.loadNutrient();
   			}
   		},
   	},
   	/**
   	 * Our component has the `loadNutrient` method. This unloads and cleans up the component and triggers document loading.
   	 */
   	methods: {
   		async loadNutrient() {
   			NutrientViewer.unload('.pdf-container');
   			return NutrientViewer.load({
   				// To access the `pdfFile` from props, use `this` keyword.
   				document: this.pdfFile,
   				container: '.pdf-container',
   			});
   		},
   	},

   	/**
   	 * Clean up when the component is unmounted so it's ready to load another document (not needed in this example).
   	 */
   	beforeUnmount() {
   		NutrientViewer.unload('.pdf-container');
   	},
   };
   </script>

   <style scoped>.pdf-container {
   	height: 100vh;
   }
   </style>
   ```

   This component:

   - Renders a `div` with the `pdf-container` class for mounting the viewer
   - Defines methods for loading and unloading PDF files
   - Sets the container height to fill the viewport

3. Now, replace the contents of `src/App.vue` with the following:

   ```vue

   <!-- src/App.vue -->

   <template>
   	<div id="app">
   		<label for="file-upload" class="custom-file-upload">
   			Open PDF
   		</label>
   		<input
   			id="file-upload"
   			type="file"
   			@change="openDocument"
   			class="btn"
   		/>
   		<NutrientContainer :pdfFile="pdfFile" @loaded="handleLoaded" />
   	</div>
   </template>

   <script>
   import NutrientContainer from '@/components/NutrientContainer.vue';

   export default {
   	data() {
   		return {
   			pdfFile: '/example.pdf',
   		};
   	},
   	/**
   	 * Render the `NutrientContainer` component.
   	 */
   	components: {
   		NutrientContainer,
   	},
   	/**
   	 * Our component has two methods — one to check when the document is loaded, and the other to open the document.
   	 */
   	methods: {
   		handleLoaded(instance) {
   			console.log('Nutrient has loaded: ', instance);
   			// Do something.
   		},

   		openDocument(event) {
   			// To access the Vue instance data properties, use `this` keyword.
   			if (this.pdfFile) {
   				window.URL.revokeObjectURL(this.pdfFile);
   			}
   			this.pdfFile = window.URL.createObjectURL(
   				event.target.files[0],
   			);
   		},
   	},
   };
   </script>

   <style>
   #app {

   	text-align: center;
   	color: #2c3e50;

   }

   body {
   	margin: 0;
   }

   input[type='file'] {
   	display: none;
   }.custom-file-upload {
   	border: 1px solid #ccc;

   	border-radius: 4px;
   	display: inline-block;
   	padding: 6px 12px;
   	cursor: pointer;
   	background: #4a8fed;

   	padding: 10px;
   	color: #fff;

   	font: inherit;
   	font-size: 16px;
   	font-weight: bold;
   }
   </style>
   ```

   This component:

   - Uses `@change` (shorthand for `v-on:change`) to handle file uploads
   - Binds `pdfFile` to the `NutrientContainer` component with `:pdfFile` (shorthand for `v-bind:pdfFile`)
   - Listens for the `loaded` event from the viewer
   - Stores the current PDF path in the `pdfFile` data property

4. Start the app:

```bash

npm run serve

```

```bash

yarn serve

```

The app runs at `http://localhost:8080/` (the port may vary if 8080 is already in use).

If the PDF doesn’t render, verify that `example.pdf` exists in the `public` directory.

The demo application supports opening different PDF files via the **Open PDF** button, as well as adding signatures, annotations, stamps, and more.

The complete source code is available on [GitHub](https://github.com/PSPDFKit/nutrient-web-examples/tree/main/examples/vue). The `vue-2` branch contains the Vue 2 version. File names in the repository may differ slightly.

## Conclusion

This tutorial covered building a Vue.js PDF viewer with both an open source library (pdfvuer) and Nutrient Web SDK.

Similar tutorials are available for other frameworks:

- [How to build an Angular PDF viewer with PDF.js](https://www.nutrient.io/blog/how-to-build-an-angular-pdf-viewer-with-pdfjs.md)

- [How to build a React PDF viewer with PDF.js](https://www.nutrient.io/blog/how-to-build-a-reactjs-viewer-with-pdfjs.md)

- [How to build a jQuery PDF viewer with PDF.js](https://www.nutrient.io/blog/how-to-build-a-jquery-pdf-viewer-with-pdfjs/)

- [How to build a Bootstrap 5 PDF viewer with PDF.js](https://www.nutrient.io/blog/how-to-build-a-bootstrap5-pdf-viewer-with-pdfjs/)

- [How to build an Electron PDF viewer with PDF.js](https://www.nutrient.io/blog/how-to-build-an-electron-pdf-viewer-with-pdfjs/)

- [How to build a TypeScript PDF viewer with PDF.js](https://www.nutrient.io/blog/how-to-build-a-typescript-pdf-viewer-with-pdfjs/)

- [How to build a JavaScript PDF viewer with PDF.js](https://www.nutrient.io/blog/how-to-build-a-javascript-pdf-viewer-with-pdfjs.md)

Open source Vue.js libraries work well for basic viewing when building custom UIs. For additional features like annotations, forms, and signatures — plus dedicated support — consider Nutrient’s [JavaScript PDF library](https://www.nutrient.io/guides/web.md). It’s easy to integrate and includes well-documented APIs for advanced use cases. For a detailed comparison, see our [PDF.js alternative guide](https://www.nutrient.io/sdk/vs/pdfjs/). [Try it for free](https://www.nutrient.io/try/), or [visit the demo](https://www.nutrient.io/demo/) to see it in action.

For a full-featured Vue.js viewer with a prebuilt UI out of the box, see how to build a [Vue.js PDF viewer with Nutrient Web SDK](https://www.nutrient.io/blog/how-to-build-a-vuejs-pdf-viewer.md).

## FAQ

#### How do I install pdfvuer in my Vue.js project?

You can install pdfvuer using npm with the command `npm install pdfvuer@next --save` or with yarn using `yarn add pdfvuer@next`.

#### What is the benefit of using Nutrient over pdfvuer?

Nutrient offers more than 30 features, including annotation tools, PDF form filling, document editing, and real-time collaboration, along with dedicated support.

#### How can I display a PDF file using pdfvuer in a Vue.js application?

Add the pdfvuer library to your project. Then use the `<pdf>` component in your Vue template to display the PDF by specifying the `src` attribute with the path to your PDF file.

#### How do I handle file uploads in the Nutrient Vue.js viewer?

Use a file input element to upload PDF files, create an object URL for the selected file, and pass it to the Nutrient component in your Vue.js application.
---

## 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)
- [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](/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)
- [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 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)
- [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 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 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)
- [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 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)

