---
title: "react-pdf annotation layer: Links, forms, and filtering"
canonical_url: "https://www.nutrient.io/blog/react-pdf-annotation-layer-forms/"
md_url: "https://www.nutrient.io/blog/react-pdf-annotation-layer-forms.md"
last_updated: "2026-08-28T16:27:43.456Z"
description: "Enable the react-pdf annotation layer for links, render interactive PDF forms, filter annotation types, and style annotations with CSS."
---

**TL;DR**

- Import `react-pdf/dist/Page/AnnotationLayer.css` and the annotation layer renders by default — links, popup notes, highlights, and widgets become real DOM elements over the canvas.

- Set `renderForms={true}` on `<Page>` to turn PDF form fields into interactive `<input>`/`<select>`/`<textarea>` elements (AcroForm only — no XFA).

- Use `filterAnnotations` to show or hide specific subtypes, and use `onGetAnnotationsSuccess` to inspect raw annotation data.

- `react-pdf` doesn’t expose APIs for creating/editing annotations or saving filled form values back to the PDF — for that, use an SDK like [Nutrient Web SDK](https://www.nutrient.io/sdk/web-overview/).

The annotation layer renders elements that exist within the PDF file itself — links, form fields, popups, and other interactive elements. `react-pdf` renders these as HTML elements overlaid on the canvas.

## Enabling the annotation layer

The annotation layer is enabled by default. Import the CSS:

```tsx

import "react-pdf/dist/Page/AnnotationLayer.css";

```

```tsx

<Page pageNumber={1} renderAnnotationLayer={true} />  {/* Default. */}

```

Disable it:

```tsx

<Page pageNumber={1} renderAnnotationLayer={false} />

```

## What the annotation layer renders

| PDF annotation type   | Rendered as                            |
| --------------------- | -------------------------------------- |
| `Link`                | Clickable `<a>` tag                    |
| `Text` (popup note)   | Note icon with expandable popup        |
| `Highlight`           | Colored overlay                        |
| `FreeText`            | Positioned text element                |
| `Widget` (form field) | `<input>`, `<select>`, or `<textarea>` |
| `FileAttachment`      | Download icon                          |

## External link control

Control how links to external URLs behave:

```tsx

<Document
  file={file}
  externalLinkTarget="_blank"  // Open in new tab.
  externalLinkRel="noopener noreferrer nofollow"  // Default value.

>

  <Page pageNumber={1} />
</Document>

```

| Prop                 | Default                          | Description                                  |
| -------------------- | -------------------------------- | -------------------------------------------- |
| `externalLinkTarget` | Browser default                  | `"_self"`, `"_blank"`, `"_parent"`, `"_top"` |
| `externalLinkRel`    | `"noopener noreferrer nofollow"` | `rel` attribute for security                 |

## Interactive forms

Enable form interactivity with `renderForms`:

```tsx

<Page
  pageNumber={1}
  renderAnnotationLayer={true}  // Required for forms.
  renderForms={true}
/>

```

This renders PDF form fields as interactive HTML elements:

| PDF form field | HTML element              |
| -------------- | ------------------------- |
| Text field     | `<input type="text">`     |
| Text area      | `<textarea>`              |
| Checkbox       | `<input type="checkbox">` |
| Radio button   | `<input type="radio">`    |
| Dropdown       | `<select>`                |
| List box       | `<select multiple>`       |
| Push button    | `<button>`                |

### Example: PDF form viewer

The component below puts the two props together to render an interactive form:

```tsx

function FormViewer() {
  return (
    <Document file="form.pdf">
      <Page
        pageNumber={1}
        renderAnnotationLayer={true}
        renderForms={true}
      />
    </Document>
  );
}

```

Users can fill in the form fields directly in the browser. Note that `react-pdf` supports AcroForm fields only — dynamic XFA forms (common in government and banking PDFs) aren’t rendered as interactive widgets. There’s also no built-in API to save filled values back to the PDF; you’d need a library like `pdf-lib` to write the values into a new file.

## Filtering annotations

Use `filterAnnotations` to control which annotations are rendered:

```tsx

<Page
  pageNumber={1}
  filterAnnotations={({ annotations }) => {
    // Only show links, hide everything else.
    return annotations.filter((annot) => annot.subtype === "Link");
  }}
/>

```

### Common filter use cases

The `filterAnnotations` callback receives the full annotation array on every render, so any subtype comparison you write works as a filter:

```tsx

// Hide all popup notes.
filterAnnotations={({ annotations }) =>
  annotations.filter((a) => a.subtype!== "Text")
}

// Hide form fields.
filterAnnotations={({ annotations }) =>
  annotations.filter((a) => a.subtype!== "Widget")
}

// Only show specific annotation types.
filterAnnotations={({ annotations }) =>
  annotations.filter((a) => ["Link", "Highlight"].includes(a.subtype))
}

```

## Annotation callbacks

`react-pdf` exposes separate callbacks for reading raw annotation data (`onGetAnnotationsSuccess`/`onGetAnnotationsError`) and for the annotation layer finishing its render (`onRenderAnnotationLayerSuccess`/`onRenderAnnotationLayerError`):

```tsx

<Page
  pageNumber={1}
  onGetAnnotationsSuccess={(annotations) => {
    // Array of annotation objects from the PDF.
    annotations.forEach((annot) => {
      console.log(annot.subtype);    // "Link", "Text", "Widget", etc.
      console.log(annot.rect);       // [x1, y1, x2, y2].
      console.log(annot.url);        // External URL (for links).
      console.log(annot.fieldName);  // Form field name (for widgets).
      console.log(annot.fieldValue); // Form field value.
    });
  }}
  onGetAnnotationsError={(error) => {
    console.error("Failed to load annotations:", error);
  }}
  onRenderAnnotationLayerSuccess={() => {
    console.log("Annotation layer rendered");
  }}
  onRenderAnnotationLayerError={(error) => {
    console.error("Failed to render annotations:", error);
  }}
/>

```

## Image resources path

Some annotations reference external images (like stamp icons). Set the path prefix:

```tsx

<Document
  file={file}
  imageResourcesPath="/images/"  // Prefix for annotation SVG src.

>

  <Page pageNumber={1} />
</Document>

```

Or set per page:

```tsx

<Page pageNumber={1} imageResourcesPath="/images/" />

```

## Styling annotations

Customize annotation appearance via CSS:

```css

/* Style link annotations. */.react-pdf__Page__annotations.linkAnnotation a {
  border: none;
}.react-pdf__Page__annotations.linkAnnotation a:hover {
  background-color: rgba(255, 255, 0, 0.2);
}

/* Style form inputs. */.react-pdf__Page__annotations.textWidgetAnnotation input {
  font-size: 12px;
  border: 1px solid #ccc;

  padding: 2px;
}

/* Style checkboxes. */.react-pdf__Page__annotations.buttonWidgetAnnotation.checkBox input {
  accent-color: #4A90D9;

}

```

## Key points

- Import `react-pdf/dist/Page/AnnotationLayer.css` for proper annotation styling.

- `renderAnnotationLayer` is `true` by default.

- `renderForms={true}` makes form fields interactive (requires `renderAnnotationLayer`).

- `filterAnnotations` lets you selectively show/hide annotation types.

- Use `externalLinkTarget="_blank"` to open PDF links in new tabs.

- `onGetAnnotationsSuccess` gives you raw annotation data for custom processing.

- PDF form fields become standard HTML inputs — you can style them with CSS.

## How Nutrient Web SDK handles this

`react-pdf` renders annotations read-only and lets users type into AcroForm fields, but it doesn’t expose APIs to create/edit/delete annotations or to save filled form values back to the PDF. Nutrient Web SDK covers both:

```js

// Annotations — create, edit, delete (not just read-only).
const annotation = new NutrientViewer.Annotations.HighlightAnnotation({
  pageIndex: 0,
  rects: NutrientViewer.Immutable.List([
    new NutrientViewer.Geometry.Rect({ left: 50, top: 100, width: 200, height: 20 }),
  ]),
});
await instance.create(annotation);

// Forms — read and write values programmatically.
await instance.setFormFieldValues({ "Name": "Jane Doe" });

```

Nutrient supports creating, editing, and deleting 17+ annotation types, plus interactive forms with validation, calculation fields, and digital signatures — and the filled or annotated document can be exported as a flattened PDF.

[Learn more about Nutrient Web SDK](https://www.nutrient.io/sdk/web-overview/) | [Migration guide](https://www.nutrient.io/guides/web/about/migration-guides/migrating-from-react-pdf.md) | [Contact Sales](https://www.nutrient.io/contact-sales/?=sdk)

## FAQ

#### Is the <code>react-pdf</code> annotation layer enabled by default?

Yes — `renderAnnotationLayer` defaults to `true`. You only need to import the matching stylesheet (`react-pdf/dist/Page/AnnotationLayer.css`) for elements to position correctly over the canvas.

#### Why aren’t my PDF form fields interactive?

The annotation layer renders forms as static visuals unless you opt in. Set `renderForms={true}` on `<Page>` (and keep `renderAnnotationLayer={true}`). This works for AcroForm fields only — dynamic XFA forms aren’t supported by PDF.js, which `react-pdf` wraps.

#### Can I save the values a user typed into a PDF form?

Not with `react-pdf` alone. The library renders form fields as HTML inputs but doesn’t write changes back to the PDF. To persist values, read them from the DOM (or from `onGetAnnotationsSuccess` plus your own state) and use a library like `pdf-lib` to update the file, or switch to an SDK that writes form values back to the file natively.

#### How do I hide certain annotation types?

Use `filterAnnotations` to return only the subtypes you want. For example, `annotations.filter((a) => a.subtype!== "Widget")` hides form fields, and `["Link", "Highlight"].includes(a.subtype)` keeps only links and highlights.

#### How do I open PDF links in a new tab?

Set `externalLinkTarget="_blank"` on `<Document>`. `externalLinkRel` defaults to `"noopener noreferrer nofollow"` for safety; override it if you need a different `rel` policy.

#### Can I style annotations with my own CSS?

Yes. The annotation layer uses stable public class names — `.linkAnnotation`, `.textWidgetAnnotation`, `.buttonWidgetAnnotation`, etc., all scoped under `.react-pdf__Page__annotations`. Override styles after importing `AnnotationLayer.css` so your rules win the cascade.
---

## 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)
- [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)
- [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)
- [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 Parsing Apis](/blog/best-document-parsing-apis.md)
- [Best Document Viewers](/blog/best-document-viewers.md)
- [Best Multilingual Ocr Software](/blog/best-multilingual-ocr-software.md)
- [Best Secure Document Collaboration Platforms](/blog/best-secure-document-collaboration-platforms.md)
- [Build Vs Buy Document Extraction](/blog/build-vs-buy-document-extraction.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)
- [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)
- [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 Html To Pptx](/blog/how-to-convert-html-to-pptx.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)
- [How To Programmatically Create And Fill Pdf Form In Angular](/blog/how-to-programmatically-create-and-fill-pdf-form-in-angular.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)
- [Javascript Document Editor](/blog/javascript-document-editor.md)
- [Javascript Pdf Editors](/blog/javascript-pdf-editors.md)
- [Javascript Pdf Libraries](/blog/javascript-pdf-libraries.md)
- [Langextract Vs Llamaindex Extraction Comparison](/blog/langextract-vs-llamaindex-extraction-comparison.md)
- [Linearized Pdf](/blog/linearized-pdf.md)
- [Llamaparse Alternatives](/blog/llamaparse-alternatives.md)
- [Low Code No Code Document Integrations](/blog/low-code-no-code-document-integrations.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)
- [Building WCAG 2.2, Section 508, and PDF/UA-compliant PDFs 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)
- [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)
- [React Pdf Loading States Errors Passwords](/blog/react-pdf-loading-states-errors-passwords.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)
- [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)
- [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)

