---
title: "How to programmatically create and fill PDF forms in Angular"
canonical_url: "https://www.nutrient.io/blog/how-to-programmatically-create-and-fill-pdf-form-in-angular/"
md_url: "https://www.nutrient.io/blog/how-to-programmatically-create-and-fill-pdf-form-in-angular.md"
last_updated: "2026-09-24T12:17:01.822Z"
description: "Create and fill PDF forms programmatically in Angular with pdf-lib: Build new forms, fill existing ones (text, checkboxes, dropdowns), and flatten the result."
---

**TL;DR**

- Use the pdf-lib library for programmatic PDF form work in Angular — both creating new forms and filling existing ones

- Create text fields with `createTextField()` and fill them with `setText()`

- Fill an existing PDF form by loading it with `PDFDocument.load()` and then setting text fields, checkboxes, dropdowns, and radio groups by field name

- Remove interactive form fields with `form.flatten()`

- Save and download PDFs using Blob and `URL.createObjectURL()`

- Consider Nutrient Web SDK for advanced features like UI form filling and real-time updates

Angular applications can create and fill PDF forms programmatically using libraries like [pdf-lib](https://pdf-lib.js.org/). This tutorial covers both directions: building a new PDF form from scratch and filling it, and filling an existing PDF form — text fields, checkboxes, dropdowns, and radio groups — and flattening the result so values can no longer be changed through the original form fields. (For generating non-form PDFs such as reports or invoices in Angular, the [generating PDFs in Angular](https://www.nutrient.io/blog/how-to-generate-pdfs-using-angular/) tutorial is the dedicated guide.)

## Prerequisites

- Angular installed on the development environment — the steps work on Angular 16 and later, including the current Angular 22

- Basic understanding of Angular concepts

## Step 1 — Setting up the Angular project

1. To begin, you need to set up an Angular project. If you haven’t installed the Angular CLI, you can do so by running the following command:

```bash

npm install -g @angular/cli

```

Before running the command, ensure you have Node.js and Node Package Manager (npm) installed on your machine. You can download and install them from the official [Node.js](https://nodejs.org) website.

2. Once the Angular CLI is installed, create a new Angular project using the following command:

```bash

ng new pdf-forms-angular --file-name-style-guide=2016

```

The project command uses the 2016 file name style so the generated root files match `app.component.ts` and `app.component.html` in this tutorial. Choose client-side rendering for this browser example.

This will create a new directory named `pdf-forms-angular` with the basic structure and files for an Angular application.

3. Navigate to the project directory:

```bash

cd pdf-forms-angular

```

## Step 2 — Setting up the Angular component

1. To get started, install pdf-lib by running the following command in your Angular project directory:

```bash

npm install pdf-lib

```

2. Then, create an Angular component to handle the form. For example, create a component called `FillFormComponent`:

```bash

ng generate component fill-form --type=component

```

The component command uses the `component` type suffix so the files are named `fill-form.component.ts` and `fill-form.component.html` in the `fill-form` directory.![Angular project file structure showing the fill-form component directory](@/assets/images/blog/2023/how-to-programmatically-create-and-fill-pdf-form-in-angular/file-structure.png)

3. Next, open the `fill-form.component.ts` file and import the required modules, including the `PDFDocument` class from the pdf-lib library:

```typescript

import { Component, OnInit } from '@angular/core';
import { PDFDocument } from 'pdf-lib';

@Component({
	selector: 'app-fill-form',
	templateUrl: './fill-form.component.html',
	styleUrls: ['./fill-form.component.css'],
})
export class FillFormComponent implements OnInit {
	constructor() {}

	ngOnInit(): void {
		this.generateAndFillPDF();
	}

	async generateAndFillPDF(): Promise<void> {
		// Implementation goes here.
	}
}

```

## Step 3 — Generating the PDF form

Inside the `generateAndFillPDF()` method, start by creating a new PDF document using pdf-lib’s `PDFDocument.create()`. Add a page to the document and retrieve the form object using `pdfDoc.getForm()`.

Now, you can create a new PDF document and add form elements to it. For example, to add a text field, you can use the `createTextField()` method:

```typescript

async generateAndFillPDF(): Promise<void> {
  const pdfDoc = await PDFDocument.create();
  const page = pdfDoc.addPage();
  const form = pdfDoc.getForm();

  // Implementation continues...
}

```

## Step 4 — Creating and filling form fields

Next, create the form fields you want to include in the PDF form. In this example, you’ll create two text fields: one for the name, and one for the email address.

Use the `createTextField()` method on the form object to create each field and provide a unique name for identification. To fill the form programmatically, you can use the same `setText()` method to set values for the form fields:

```typescript

async generateAndFillPDF(): Promise<void> {
  //...

  const nameField = form.createTextField('name');
  nameField.setText('John Doe');
  nameField.addToPage(page, { x: 50, y: 100, width: 200, height: 20 });

  const emailField = form.createTextField('email');
  emailField.setText('test@gmail.com');
  emailField.addToPage(page, { x: 50, y: 50, width: 200, height: 20 });

  //...
}

```

## Step 5 — Saving and downloading the PDF form

Once you’ve created and filled the PDF form, you can save it and offer it for download to the user. To save the PDF document, use the `save()` method provided by pdf-lib:

```typescript

async generateAndFillPDF(): Promise<void> {
  //...

  const pdfBytes = await pdfDoc.save();

  const blob = new Blob([pdfBytes], { type: 'application/pdf' });
  const url = URL.createObjectURL(blob);

	// Use the URL to download or display the PDF form.
  window.open(url);
}

```

This will return the PDF bytes as an array. Create a `Blob` object from the bytes, and generate a URL using `URL.createObjectURL()`. Finally, use `window.open(url)` to open the filled PDF form for download or display.

## Step 6 — Adding a fill button to trigger form filling

Add a button or trigger in your `fill-form.component.html` file that calls the `generateAndFillPDF` method when clicked:

```html

<h1>Fill PDF Form</h1>
<button (click)="generateAndFillPDF()">Fill Form</button>

```

By following these steps, you can programmatically create and fill PDF forms with data in your Angular application.

Here’s the full code for the `fill-form.component.ts` file:

```typescript

import { Component, OnInit } from '@angular/core';
import { PDFDocument } from 'pdf-lib';

@Component({
	selector: 'app-fill-form',
	templateUrl: './fill-form.component.html',
	styleUrls: ['./fill-form.component.css'],
})
export class FillFormComponent implements OnInit {
	constructor() {}

	ngOnInit(): void {
		this.generateAndFillPDF();
	}

	async generateAndFillPDF(): Promise<void> {
		const pdfDoc = await PDFDocument.create();
		const page = pdfDoc.addPage();
		const form = pdfDoc.getForm();

		const nameField = form.createTextField('name');
		nameField.setText('John Doe');
		nameField.addToPage(page, {
			x: 50,
			y: 100,
			width: 200,
			height: 20,
		});

		const emailField = form.createTextField('email');
		emailField.setText('test@gmail.com');
		emailField.addToPage(page, {
			x: 50,
			y: 50,
			width: 200,
			height: 20,
		});

		const pdfBytes = await pdfDoc.save();

		const blob = new Blob([pdfBytes], { type: 'application/pdf' });
		const url = URL.createObjectURL(blob);

		// Use the URL to download or display the PDF form.
		window.open(url);
	}
}

```

## Step 7 — Updating the app component template

To use the `FillFormComponent` in your Angular application, replace the placeholder content in the `app.component.html` file with the following code:

```html

<div>
	<app-fill-form></app-fill-form>
</div>

```

This will render the `FillFormComponent` and trigger the generation and filling of the PDF form when the component is initialized.

On Angular 17 and later, `ng generate component` produces a standalone component by default. Before using `<app-fill-form>` in the app template, add `FillFormComponent` to the `imports` array of the `@Component` decorator in `app.component.ts`. On NgModule-based projects, declare it in the module instead.

## Step 8 — Running the application

Now, you’re ready to run the Angular application. Use the following command:

```bash

ng serve

```

This command will compile the application and start a development server. Open your web browser and navigate to http://localhost:4200 to see the application in action.

## Filling an existing PDF form in Angular

The steps above create a form from scratch, but the more common production task is filling a PDF form that already exists — an application form, a contract template, a government form. pdf-lib handles this with `PDFDocument.load()` plus per-type field getters. Each getter takes the field’s name as defined inside the PDF, and each field type has its own setter:

```typescript

async fillExistingForm(): Promise<void> {
	// Fetch a fillable PDF (e.g. from the app's assets or an API).
	const formPdfBytes = await fetch('/assets/application-form.pdf').then(
		(res) => res.arrayBuffer(),
	);

	// Load the document and get its form.
	const pdfDoc = await PDFDocument.load(formPdfBytes);
	const form = pdfDoc.getForm();

	// Fill each field by its name, using the setter for its type.
	form.getTextField('name').setText('John Doe');
	form.getCheckBox('subscribe').check();
	form.getDropdown('country').select('Austria');
	form.getRadioGroup('plan').select('annual');

	// Save and open the filled PDF.
	const pdfBytes = await pdfDoc.save();
	const blob = new Blob([pdfBytes], { type: 'application/pdf' });
	window.open(URL.createObjectURL(blob));
}

```

Two details to watch:

- **Field names must match exactly.** The names passed to `getTextField()`, `getCheckBox()`, `getDropdown()`, and `getRadioGroup()` are the names stored inside the PDF’s form definition. A mismatched name throws at runtime. The field names can be inspected in any PDF editor that shows form properties.

- **Each field type has its own getter.** Calling `getTextField()` on a checkbox throws — pdf-lib enforces the field types. Checkboxes use `check()`/`uncheck()`, dropdowns and option lists use `select()`, and radio groups use `select()` with the option name.

## Flattening a filled form

Flattening converts filled form fields into regular page content, so the values can no longer be changed through interactive fields. Flattening doesn’t prevent a PDF content editor from changing the page:

```typescript

// After filling the fields:
form.flatten();

const pdfBytes = await pdfDoc.save();

```

Once flattened, the document has no interactive form fields left; validators and viewers treat the values as static text.

<!---

> Interact with the sandbox by clicking the left rectangle icon and selecting Editor > Show Default Layout. To edit, sign in with GitHub — click the rectangle icon again and choose Sign in. To preview the result, click the rectangle icon once more and choose Editor > Embed Preview. For the full example, click the Open Editor button. Enjoy experimenting with the project!

--->

## Drawbacks of pdf-lib

The pdf-lib library has some limitations worth noting:

- **No built-in form viewer** — pdf-lib provides programmatic form APIs. You can collect input with Angular controls and pass it to these APIs, but you need a separate PDF viewer for direct interaction with fields on the page.

- **Application-managed updates** — Your application must connect input changes to pdf-lib, save the PDF, and refresh any preview. pdf-lib doesn’t provide a built-in live viewer or collaboration service.

## Form filling with Nutrient

Nutrient supports [form filling](https://www.nutrient.io/guides/web/forms/introduction-to-forms.md) through both UI components and API methods.

- **User interface form filling** — Nutrient’s prebuilt UI components enable users to effortlessly navigate and interact with PDF forms. They can fill in text fields, select options from dropdown menus, and interact with checkboxes and radio buttons. See it in action by exploring the [demo](https://www.nutrient.io/demo/pdf-form-fill/).

**[Programmatic form filling](https://www.nutrient.io/sdk/form-viewing-and-filling/)** — Nutrient Web SDK offers versatile options for programmatic form filling:

- **Document Engine** — Persist, restore, and synchronize form field values across devices with the required server configuration and application integration.

- **XFDF** — Exchange form field data with other PDF readers and editors.

- **Instant JSON** — Export and import changes made to form fields.

- **Manual API** — Complete control over extracting, saving, and manipulating form field values.

In addition, Nutrient also provides an option for creating PDF forms:

- [PDF Form Creator](https://www.nutrient.io/sdk/solutions/forms/) — Simplify PDF form creation with a point-and-click UI. You can create PDF forms from scratch using an intuitive UI or via the API. Convert static forms into fillable forms, or modify existing forms by letting your users create, edit, and remove form fields in a PDF.

These options support custom workflows and data interoperability with other PDF tools.

## Conclusion

You now have a working Angular implementation for programmatic PDF form generation using pdf-lib. For production applications requiring user interaction or real-time updates, consider [Nutrient Web SDK](https://www.nutrient.io/try/). You can also [launch our demo](https://www.nutrient.io/demo/pdf-form-fill/) to see form filling in action.

## FAQ

#### What libraries can be used for PDF form filling in Angular?

Popular options include pdf-lib for basic programmatic form filling and Nutrient for a more comprehensive set of features.

#### How can I add form fields to a PDF in Angular?

You can use pdf-lib to create and customize form fields like text fields by setting properties and adding them to pages programmatically.

#### How can an existing PDF form be filled in Angular?

Load the PDF with `PDFDocument.load()`, get its form with `getForm()`, and set each field by name: `getTextField().setText()` for text, `getCheckBox().check()` for checkboxes, and `getDropdown().select()` or `getRadioGroup().select()` for choices. Then save the document.

#### How can a filled PDF form be made read-only?

Call `form.flatten()` after filling the fields and before saving. Flattening converts the field values into static page content, so the values can no longer be changed through the original fields. It doesn’t make the page content tamper-proof.

#### Are there any UI limitations with pdf-lib?

Yes. pdf-lib is focused on programmatic form handling and lacks a built-in UI for direct interaction with form fields.

#### What advantages does Nutrient offer for form filling?

Nutrient provides UI components, real-time updates, and data export options like XFDF, which are beneficial for both users and developers.

#### Is Nutrient suitable for creating PDF forms in Angular applications?

Yes. Nutrient enables you to create, edit, and manage PDF forms with both a UI-based creator and an API.
---

## 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)
- [How to build an AI agent for contract redlining against a compliance playbook](/blog/ai-contract-redlining-compliance-playbook.md)
- [Ai Document Automation Extraction To Action](/blog/ai-document-automation-extraction-to-action.md)
- [Ai Document Workflows Ocr Compliance Heavy Teams](/blog/ai-document-workflows-ocr-compliance-heavy-teams.md)
- [Ai Legal Assistant Document Authoring](/blog/ai-legal-assistant-document-authoring.md)
- [Amazon Textract Alternatives](/blog/amazon-textract-alternatives.md)
- [Start (clears any prior buffer), navigate the document, then stop into a file.](/blog/android-faster-pdf-rendering.md)
- [Android Pdf Out Of Memory Handling](/blog/android-pdf-out-of-memory-handling.md)
- [Angular File Viewer Pdf Image Office Files](/blog/angular-file-viewer-pdf-image-office-files.md)
- [Approval Workflow Software](/blog/approval-workflow-software.md)
- [Approvals Matrix](/blog/approvals-matrix.md)
- [Auto Tagging And Document Accessibility In Dotnet Sdk](/blog/auto-tagging-and-document-accessibility-in-dotnet-sdk.md)
- [Simple PII redaction.](/blog/automated-pii-removal.md)
- [Azure Document Intelligence Alternatives](/blog/azure-document-intelligence-alternatives.md)
- [Best Ai Document Workflow Platforms](/blog/best-ai-document-workflow-platforms.md)
- [Best Document Ai Platforms](/blog/best-document-ai-platforms.md)
- [Best Document Classification Platforms](/blog/best-document-classification-platforms.md)
- [Best document parser for RAG: LlamaParse vs. Unstructured vs. Reducto vs. Nutrient](/blog/best-document-parser-llamaparse-unstructured-reducto.md)
- [Best Document Parsing Apis](/blog/best-document-parsing-apis.md)
- [Best Document Viewers](/blog/best-document-viewers.md)
- [Best Llm Document Understanding Platforms](/blog/best-llm-document-understanding-platforms.md)
- [Best Multilingual Ocr Software](/blog/best-multilingual-ocr-software.md)
- [Best Pdf Parsers For Rag](/blog/best-pdf-parsers-for-rag.md)
- [Best Salesforce Document Generation Apps](/blog/best-salesforce-document-generation-apps.md)
- [Best Secure Document Collaboration Platforms](/blog/best-secure-document-collaboration-platforms.md)
- [Bpm Guide](/blog/bpm-guide.md)
- [Bpm Tools](/blog/bpm-tools.md)
- [Build Vs Buy Document Extraction](/blog/build-vs-buy-document-extraction.md)
- [Business Automation](/blog/business-automation.md)
- [Capex Vs Opex](/blog/capex-vs-opex.md)
- [The CEO’s AI playbook: Why decision architecture beats model selection](/blog/ceo-ai-playbook-decision-architecture.md)
- [1. Extract and chunk the PDF.](/blog/chat-with-pdf.md)
- [Complete Guide To Pdfjs](/blog/complete-guide-to-pdfjs.md)
- [Construction Document Data Extraction](/blog/construction-document-data-extraction.md)
- [Convert One Drive Files To Pdf In Sharepoint](/blog/convert-one-drive-files-to-pdf-in-sharepoint.md)
- [Create And Edit Pdfs In Flutter](/blog/create-and-edit-pdfs-in-flutter.md)
- [Create Pdfs With React](/blog/create-pdfs-with-react.md)
- [Creating A Document Scanner With Ocr In Python](/blog/creating-a-document-scanner-with-ocr-in-python.md)
- [Creating And Filling Pdf Forms Programmatically In Javascript](/blog/creating-and-filling-pdf-forms-programmatically-in-javascript.md)
- [The CTO’s AI playbook: Why accountability architecture beats orchestration](/blog/cto-ai-playbook-accountability-architecture.md)
- [Digital Signatures](/blog/digital-signatures.md)
- [Digital Workflow Automation](/blog/digital-workflow-automation.md)
- [Docling Alternatives](/blog/docling-alternatives.md)
- [Document Ai Vs Ocr](/blog/document-ai-vs-ocr.md)
- [Document Authoring Audit Trail](/blog/document-authoring-audit-trail.md)
- [Document Extraction Confidence Scores](/blog/document-extraction-confidence-scores.md)
- [Document Extraction For Underwriting](/blog/document-extraction-for-underwriting.md)
- [Document Viewer](/blog/document-viewer.md)
- [Document Watermarking](/blog/document-watermarking.md)
- [Emerging threats: Your logging system may be an agentic threat vector](/blog/emerging-threats-your-logging-system.md)
- [Extend Alternatives](/blog/extend-alternatives.md)
- [Extract Patient Data On Premises](/blog/extract-patient-data-on-premises.md)
- [app.py](/blog/extract-text-from-pdf-using-python.md)
- [Fillable Pdf](/blog/fillable-pdf.md)
- [Google Document Ai Alternatives](/blog/google-document-ai-alternatives.md)
- [How To Add Digital Signature To Pdf Using React](/blog/how-to-add-digital-signature-to-pdf-using-react.md)
- [How To Build A Dotnet Maui Pdf Viewer](/blog/how-to-build-a-dotnet-maui-pdf-viewer.md)
- [How To Build A Flutter Pdf Viewer](/blog/how-to-build-a-flutter-pdf-viewer.md)
- [or](/blog/how-to-build-a-javascript-pdf-viewer-with-pdfjs.md)
- [or](/blog/how-to-build-a-javascript-pdf-viewer.md)
- [How To Build A Nextjs Pdf Viewer](/blog/how-to-build-a-nextjs-pdf-viewer.md)
- [How To Build A Powerpoint Viewer Using Javascript](/blog/how-to-build-a-powerpoint-viewer-using-javascript.md)
- [Using Yarn](/blog/how-to-build-a-react-excel-viewer.md)
- [How To Build A React Native Pdf Viewer](/blog/how-to-build-a-react-native-pdf-viewer.md)
- [How To Build A React Powerpoint Viewer](/blog/how-to-build-a-react-powerpoint-viewer.md)
- [How To Build A Reactjs File Viewer](/blog/how-to-build-a-reactjs-file-viewer.md)
- [or](/blog/how-to-build-a-reactjs-pdf-viewer-with-react-pdf.md)
- [or](/blog/how-to-build-a-reactjs-pdf-viewer.md)
- [How To Build A Reactjs Viewer With Pdfjs](/blog/how-to-build-a-reactjs-viewer-with-pdfjs.md)
- [How To Build A Vuejs Pdf Viewer With Pdfjs](/blog/how-to-build-a-vuejs-pdf-viewer-with-pdfjs.md)
- [How To Build A Vuejs Pdf Viewer](/blog/how-to-build-a-vuejs-pdf-viewer.md)
- [How To Build An Android Pdf Viewer](/blog/how-to-build-an-android-pdf-viewer.md)
- [How To Build An Angular Pdf Viewer With Ng2 Pdf Viewer](/blog/how-to-build-an-angular-pdf-viewer-with-ng2-pdf-viewer.md)
- [How To Build An Angular Pdf Viewer With Pdfjs](/blog/how-to-build-an-angular-pdf-viewer-with-pdfjs.md)
- [How To Convert Docx To Pdf Using Javascript](/blog/how-to-convert-docx-to-pdf-using-javascript.md)
- [How To Convert Docx To Pdf Using Python](/blog/how-to-convert-docx-to-pdf-using-python.md)
- [How To Convert Html To Pdf Using Html2pdf](/blog/how-to-convert-html-to-pdf-using-html2pdf.md)
- [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 Html To Pptx](/blog/how-to-convert-html-to-pptx.md)
- [Quarterly report](/blog/how-to-convert-pdf-to-markdown-using-python.md)
- [How To Convert Word To Pdf In Nodejs](/blog/how-to-convert-word-to-pdf-in-nodejs.md)
- [or](/blog/how-to-create-a-react-js-signature-pad.md)
- [How To Create Pdfs With React To Pdf](/blog/how-to-create-pdfs-with-react-to-pdf.md)
- [How To Edit Pdfs Using Ios Pdf Library](/blog/how-to-edit-pdfs-using-ios-pdf-library.md)
- [How To Embed A Pdf Viewer In Your Website](/blog/how-to-embed-a-pdf-viewer-in-your-website.md)
- [How To Extract Tables From Pdf And Images](/blog/how-to-extract-tables-from-pdf-and-images.md)
- [How To Generate Pdf From Html With Nodejs](/blog/how-to-generate-pdf-from-html-with-nodejs.md)
- [base_url tells WeasyPrint where to resolve relative asset paths](/blog/how-to-generate-pdf-reports-from-html-in-python.md)
- [How To Merge Pdfs Using Javascript](/blog/how-to-merge-pdfs-using-javascript.md)
- [How To Ocr Pdfs In Linux](/blog/how-to-ocr-pdfs-in-linux.md)
- [How To Print Pdf In Csharp](/blog/how-to-print-pdf-in-csharp.md)
- [Open an image.](/blog/how-to-use-tesseract-ocr-in-python.md)
- [From an HTML string.](/blog/html-in-pdf-format.md)
- [Html To Pdf In Javascript](/blog/html-to-pdf-in-javascript.md)
- [Intelligent Data Extraction](/blog/intelligent-data-extraction.md)
- [Invoice Approval Software](/blog/invoice-approval-software.md)
- [Javascript Document Editor](/blog/javascript-document-editor.md)
- [Javascript Pdf Editors](/blog/javascript-pdf-editors.md)
- [Javascript Pdf Libraries](/blog/javascript-pdf-libraries.md)
- [Landing Ai Alternatives](/blog/landing-ai-alternatives.md)
- [Langextract Vs Llamaindex Extraction Comparison](/blog/langextract-vs-llamaindex-extraction-comparison.md)
- [Linearized Pdf](/blog/linearized-pdf.md)
- [Uses OpenAI by default — set OPENAI_API_KEY.](/blog/llamaindex-vs-langchain-rag.md)
- [Llamaindex Vs Langchain Vs Haystack](/blog/llamaindex-vs-langchain-vs-haystack.md)
- [Llamaindex Workflows Vs Langgraph](/blog/llamaindex-workflows-vs-langgraph.md)
- [Llamaparse Alternatives](/blog/llamaparse-alternatives.md)
- [Low Code No Code Document Integrations](/blog/low-code-no-code-document-integrations.md)
- [Material Requisition](/blog/material-requisition.md)
- [or](/blog/merge-pdfs.md)
- [Swift Package Manager](/blog/mobile-pdf-sdk.md)
- [`elements` come from your document parser — each has a type and content.](/blog/multimodal-rag.md)
- [Nutrient Flutter 6 Bindings Api](/blog/nutrient-flutter-6-bindings-api.md)
- [Nutrient Flutter Bindings Architecture](/blog/nutrient-flutter-bindings-architecture.md)
- [Nutrient Vs Conga Composer](/blog/nutrient-vs-conga-composer.md)
- [Online Document Viewer](/blog/online-document-viewer.md)
- [Open Pdf In Your Web App](/blog/open-pdf-in-your-web-app.md)
- [PDF accessibility for developers: Meeting WCAG 2.2, Section 508, and PDF/UA with an SDK](/blog/pdf-accessibility.md)
- [Extract data from PDF files: A developer guide to structured data from PDFs and scans](/blog/pdf-data-extraction-developer-guide.md)
- [Pdf Extraction Benchmark Opendataloader Bench](/blog/pdf-extraction-benchmark-opendataloader-bench.md)
- [Pdf Extraction Document Case Studies](/blog/pdf-extraction-document-case-studies.md)
- [Pdf Page Labels](/blog/pdf-page-labels.md)
- [Pdf Sdk Compliance Security Checklist](/blog/pdf-sdk-compliance-security-checklist.md)
- [Pdf Sdk Performance Benchmark](/blog/pdf-sdk-performance-benchmark.md)
- [Pdf Ua Compliance Guide](/blog/pdf-ua-compliance-guide.md)
- [Pdf Ua Validation](/blog/pdf-ua-validation.md)
- [Pdfjs Accessibility Structtree Printing](/blog/pdfjs-accessibility-structtree-printing.md)
- [Pdfjs Advanced Loading Streaming Workers](/blog/pdfjs-advanced-loading-streaming-workers.md)
- [Pdfjs Annotation Editor Layer](/blog/pdfjs-annotation-editor-layer.md)
- [Pdfjs Area Annotations Canvas Capture](/blog/pdfjs-area-annotations-canvas-capture.md)
- [Pdfjs Coordinate Systems Pdf To Screen](/blog/pdfjs-coordinate-systems-pdf-to-screen.md)
- [Pdfjs Document Outline Bookmarks Metadata](/blog/pdfjs-document-outline-bookmarks-metadata.md)
- [Pdfjs Eventbus Guide](/blog/pdfjs-eventbus-guide.md)
- [macOS](/blog/pdfjs-file-format-conversion-to-pdf.md)
- [macOS](/blog/pdfjs-generating-pdf-thumbnails-pdf2pic.md)
- [Pdfjs Limitations Commercial Upgrade](/blog/pdfjs-limitations-commercial-upgrade.md)
- [Pdfjs Native Annotation Layer Forms](/blog/pdfjs-native-annotation-layer-forms.md)
- [Pdfjs Navigation Zoom Rotation](/blog/pdfjs-navigation-zoom-rotation.md)
- [Pdfjs Pdf Page Manipulation Pdf Lib](/blog/pdfjs-pdf-page-manipulation-pdf-lib.md)
- [Pdfjs React Viewer Setup](/blog/pdfjs-react-viewer-setup.md)
- [Pdfjs Rendering Overlays React Portals](/blog/pdfjs-rendering-overlays-react-portals.md)
- [Pdfjs Server Side Text Extraction](/blog/pdfjs-server-side-text-extraction.md)
- [Pdfjs Sticky Note Annotations](/blog/pdfjs-sticky-note-annotations.md)
- [Pdfjs Text Highlight Annotations](/blog/pdfjs-text-highlight-annotations.md)
- [Pdfjs Text Search Pdffindcontroller](/blog/pdfjs-text-search-pdffindcontroller.md)
- [Pdfjs Thumbnail Sidebar](/blog/pdfjs-thumbnail-sidebar.md)
- [People Process Tools](/blog/people-process-tools.md)
- [Process Flows](/blog/process-flows.md)
- [React Native Pdf Annotation](/blog/react-native-pdf-annotation.md)
- [React Pdf Annotation Layer Forms](/blog/react-pdf-annotation-layer-forms.md)
- [React Pdf Custom Rendering Hooks](/blog/react-pdf-custom-rendering-hooks.md)
- [Using Yarn](/blog/react-pdf-editor.md)
- [React Pdf Loading States Errors Passwords](/blog/react-pdf-loading-states-errors-passwords.md)
- [React Pdf Non Latin Fonts Special Pdfs](/blog/react-pdf-non-latin-fonts-special-pdfs.md)
- [React Pdf Outline Table Of Contents](/blog/react-pdf-outline-table-of-contents.md)
- [React Pdf Performance Optimization](/blog/react-pdf-performance-optimization.md)
- [React Pdf Setup Basic Rendering](/blog/react-pdf-setup-basic-rendering.md)
- [React Pdf Text Layer Custom Renderer](/blog/react-pdf-text-layer-custom-renderer.md)
- [React Pdf Thumbnails Page Navigation](/blog/react-pdf-thumbnails-page-navigation.md)
- [Reducto Alternatives](/blog/reducto-alternatives.md)
- [Requisition System](/blog/requisition-system.md)
- [labels.py](/blog/route-documents-automatically-classify-api.md)
- [or](/blog/sample-blog-updated.md)
- [Sdk Product Updates Q2 2026](/blog/sdk-product-updates-q2-2026.md)
- [System Of Record Vs Source Of Truth](/blog/system-of-record-vs-source-of-truth.md)
- [Add DWS MCP Server to your Claude Code project.](/blog/teaching-llms-to-read-pdfs.md)
- [Open an image file.](/blog/tesseract-python-guide.md)
- [The Six Best Pdf Generator Apis](/blog/the-six-best-pdf-generator-apis.md)
- [Define the HTML part of the document.](/blog/top-10-ways-to-generate-pdfs-in-python.md)
- [Top 5 Javascript Pdf Viewers](/blog/top-5-javascript-pdf-viewers.md)
- [or](/blog/top-js-pdf-libraries.md)
- [Top Ten Ways To Convert Html To Pdf](/blog/top-ten-ways-to-convert-html-to-pdf.md)
- [Unstructured Alternatives](/blog/unstructured-alternatives.md)
- [Vector Pdf](/blog/vector-pdf.md)
- [Wcag2 Accessibility Requirements Documents](/blog/wcag2-accessibility-requirements-documents.md)
- [Web Sdk Is Now Headless](/blog/web-sdk-is-now-headless.md)
- [What Are Annotations](/blog/what-are-annotations.md)
- [What Is A Vpat](/blog/what-is-a-vpat.md)
- [What Is Business Logic](/blog/what-is-business-logic.md)
- [What Is Document Processing](/blog/what-is-document-processing.md)
- [What Is Intelligent Document Processing](/blog/what-is-intelligent-document-processing.md)
- [What Is Ocr Invoice Processing](/blog/what-is-ocr-invoice-processing.md)
- [What Is Pdf Ua](/blog/what-is-pdf-ua.md)
- [Why Pdfium Is A Trusted Platform For Pdf Rendering](/blog/why-pdfium-is-a-trusted-platform-for-pdf-rendering.md)
- [Why Your Ai Agent Hallucinates Pdf Table Data](/blog/why-your-ai-agent-hallucinates-pdf-table-data.md)

