---
title: "Render a PDF table of contents with react-pdf outline"
canonical_url: "https://www.nutrient.io/blog/react-pdf-outline-table-of-contents/"
md_url: "https://www.nutrient.io/blog/react-pdf-outline-table-of-contents.md"
last_updated: "2026-09-08T12:21:01.815Z"
description: "Use the react-pdf Outline component to render a PDF’s bookmark tree as a navigable table of contents sidebar with click handling and custom styling."
---

**TL;DR**

- `<Outline>` must be a child of `<Document>` — it renders the PDF’s bookmark tree as nested `<ul>/<li>/<a>` elements.

- Wire up `onItemClick` (on either `<Document>` or `<Outline>`) to receive `{ dest, pageIndex, pageNumber }` and drive page navigation.

- Not every PDF has an outline. Check `onLoadSuccess` for `null`, and hide the sidebar accordingly.

- For full control over the markup, read raw outline data via `useOutlineContext` and render the tree yourself — see [custom rendering modes and context hooks in react-pdf](https://www.nutrient.io/blog/react-pdf-custom-rendering-hooks.md) for the pattern.

The `Outline` component renders the PDF’s built-in bookmark tree (table of contents). Clicking an item navigates to that section of the document.

## Basic usage

Render `Outline` as a child of `Document` alongside your page view:

```tsx

import { Document, Page, Outline } from "react-pdf";

function PDFWithOutline() {
  const [numPages, setNumPages] = useState(null);
  const [currentPage, setCurrentPage] = useState(1);

  return (
    <Document
      file={file}
      onLoadSuccess={({ numPages }) => setNumPages(numPages)}
      onItemClick={({ pageNumber }) => setCurrentPage(pageNumber)}
    >
      <div style={{ display: "flex" }}>
        <aside style={{ width: 250, overflowY: "auto" }}>
          <Outline />
        </aside>
        <main>
          <Page pageNumber={currentPage} />
        </main>
      </div>
    </Document>
  );
}

```

## Outline props

| Prop            | Type            | Description                                    |
| --------------- | --------------- | ---------------------------------------------- |
| `className`     | string/string[] | CSS class(es) alongside `.react-pdf__Outline`. |
| `inputRef`      | ref             | Ref forwarded to the root `<div>`.             |
| `onItemClick`   | function        | Called when an outline item is clicked.        |
| `onLoadSuccess` | function        | Called when outline is loaded.                 |
| `onLoadError`   | function        | Called on error loading outline.               |

## Handling item clicks

The `onItemClick` callback (on either `Document` or `Outline`) receives:

```tsx

<Outline
  onItemClick={({ dest, pageIndex, pageNumber }) => {
    // `dest`: the PDF destination object (for advanced navigation).
    // `pageIndex`: 0-indexed page number.
    // `pageNumber`: 1-indexed page number.
    console.log(`Navigate to page ${pageNumber}`);
    setCurrentPage(pageNumber);
  }}
/>

```

`onItemClick` on `<Document>` catches clicks from any child `<Outline>`. This is useful for centralized navigation handling so each outline doesn’t need its own handler.

## Outline load callbacks

`onLoadSuccess` and `onLoadError` report whether the outline loaded, and with what:

```tsx

<Outline
  onLoadSuccess={(outline) => {
    if (outline) {
      console.log("Outline loaded with items");
    } else {
      console.log("PDF has no outline");
    }
  }}
  onLoadError={(error) => {
    console.error("Failed to load outline:", error);
  }}
/>

```

## Styling the outline

The outline renders as a nested list. Target it with CSS:

```css.react-pdf__Outline {
  padding: 16px;
}

/* Top-level list. */.react-pdf__Outline ul {
  list-style: none;
  padding: 0;
  margin: 0;
}

/* Nested lists (subsections). */.react-pdf__Outline ul ul {
  padding-left: 16px;
}

/* Outline items. */.react-pdf__Outline li {
  margin: 2px 0;
}

/* Clickable links. */.react-pdf__Outline a {
  display: block;
  padding: 4px 8px;
  color: #333;

  text-decoration: none;
  border-radius: 4px;
  font-size: 14px;
}.react-pdf__Outline a:hover {
  background-color: #f0f0f0;

}

```

## Conditional rendering

Not all PDFs have an outline. Handle this gracefully:

```tsx

function OutlineSidebar() {
  const [hasOutline, setHasOutline] = useState(true);

  if (!hasOutline) return null;

  return (
    <aside className="outline-sidebar">
      <h3>Table of Contents</h3>
      <Outline
        onLoadSuccess={(outline) => {
          if (!outline) setHasOutline(false);
        }}
      />
    </aside>
  );
}

```

## Complete sidebar layout

This puts it all together: an outline sidebar that hides itself when there’s no outline, plus page navigation:

```tsx

function PDFViewerWithSidebar() {
  const [numPages, setNumPages] = useState(null);
  const [currentPage, setCurrentPage] = useState(1);
  const [showOutline, setShowOutline] = useState(true);

  return (
    <Document
      file={file}
      onLoadSuccess={({ numPages }) => setNumPages(numPages)}
      onItemClick={({ pageNumber }) => setCurrentPage(pageNumber)}
    >
      <div className="pdf-layout">
        {showOutline && (
          <aside className="sidebar">
            <Outline
              onLoadSuccess={(outline) => {
                if (!outline) setShowOutline(false);
              }}
            />
          </aside>
        )}
        <main className="pdf-content">
          <Page pageNumber={currentPage} />
          <div className="page-nav">
            <button
              disabled={currentPage <= 1}
              onClick={() => setCurrentPage((p) => p - 1)}
            >
              Previous
            </button>
            <span>{currentPage} / {numPages}</span>
            <button
              disabled={currentPage >= numPages}
              onClick={() => setCurrentPage((p) => p + 1)}
            >
              Next
            </button>
          </div>
        </main>
      </div>
    </Document>
  );
}

```

## Key points

- `Outline` must be a child of `Document`.

- Not all PDFs have an outline — check `onLoadSuccess` for null.

- `onItemClick` gives you `pageNumber` (1-indexed) and `pageIndex` (0-indexed).

- `onItemClick` on `Document` also catches outline clicks (useful for centralized navigation).

- Style with CSS targeting `.react-pdf__Outline` classes.

- The outline renders as nested `<ul>/<li>/<a>` elements.

## Rendering the outline yourself

If you need full control over the markup — to use your own component library, add icons per level, or virtualize a deeply nested tree — read the raw outline data and render it yourself. `react-pdf` exposes `useOutlineContext` for children of `<Outline>`, and `onLoadSuccess(outline)` hands you the same tree structure. See [custom rendering modes and context hooks in react-pdf](https://www.nutrient.io/blog/react-pdf-custom-rendering-hooks.md) for the full pattern.

## How Nutrient Web SDK handles this

All the custom outline components, click handlers, and conditional rendering above reduce to a single line with Nutrient Web SDK:

```js

// Built-in bookmark sidebar via `sidebarMode` — one line.
instance.setViewState((v) =>
  v.set("sidebarMode", NutrientViewer.SidebarMode.BOOKMARKS),
);

```

There’s no `<Outline>` component, no `onItemClick` handler, no conditional rendering for missing outlines, and no CSS styling. Nutrient’s built-in sidebar displays the bookmark tree with nested navigation, automatic scroll-to-page, and keyboard accessibility — all styled and ready to use.

[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

#### Why doesn’t my PDF show an outline?

Not every PDF has one. Outlines are an authoring choice — Word, InDesign, and LaTeX (with `hyperref`) typically generate them; quick exports from browsers or scanners usually don’t. Check `onLoadSuccess` — if it receives `null`, the PDF has no bookmark tree and there’s nothing for `<Outline>` to render.

#### What’s the difference between <code>pageIndex</code> and <code>pageNumber</code> in <code>onItemClick</code>?

`pageIndex` is 0-indexed (matches the underlying PDF.js page array); `pageNumber` is 1-indexed (matches user-facing UI like “Page 5 of 20”). Use whichever fits the rest of your code, but be consistent — mixing them is a common off-by-one source.

#### Should I put <code>onItemClick</code> on <code>&lt;Document&gt;</code> or <code>&lt;Outline&gt;</code>?

Either works. Put it on `<Document>` when you want one handler for all outline activity in the tree. Put it on `<Outline>` when you have multiple outlines (rare) or want to attach behavior specific to that instance — for example, expanding/collapsing UI state.

#### What if the user loads a new PDF — does the outline reset?

`react-pdf` remounts the `<Outline>` when the parent `<Document>`’s `file` prop changes, so the new outline loads automatically. If you tracked `hasOutline` in component state (as in the conditional rendering example), reset it in a `useEffect` keyed on `file` so a missing-outline state from a previous PDF doesn’t carry over.

#### Can I style the outline to match my app’s theme?

Yes — the outline renders as nested `<ul>`, `<li>`, and `<a>` elements under `.react-pdf__Outline`. Override colors, spacing, and hover states with normal CSS. For richer control (custom icons, virtualization, or component-library wrappers), render the tree yourself using the outline data from `onLoadSuccess` or `useOutlineContext`.

#### Does the outline scroll the page into view automatically?

No — `react-pdf` only fires `onItemClick`. You’re responsible for updating the page state (`setCurrentPage`) and, if you scroll-render pages, scrolling the right page into view. Some setups also call `dest` against the PDF.js link service for precise position (zoom + offset); for most apps, `pageNumber` is enough.
---

## 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 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)
- [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 Multilingual Ocr Software](/blog/best-multilingual-ocr-software.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)
- [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)
- [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)
- [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)
- [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)
- [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)
- [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)
- [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 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)
- [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 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 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)

