---
title: "How to convert PDF to JSON: Structured data extraction"
canonical_url: "https://www.nutrient.io/blog/how-to-convert-pdf-to-json/"
md_url: "https://www.nutrient.io/blog/how-to-convert-pdf-to-json.md"
last_updated: "2026-10-15T10:59:10.110Z"
description: "Convert PDF to JSON with Nutrient Data Extraction. Extract document structure, tables, and invoice fields. Then check the values against the original PDF."
---

**TL;DR**

Use the [Nutrient Data Extraction API](https://www.nutrient.io/guides/dws-data-extraction.md) to extract PDF content as JSON. Choose `/extraction/parse` with spatial output for document elements and table cells, or `/extraction/extract` with a JSON Schema for known fields. The `structure`, `understand`, and `agentic` modes also run optical character recognition (OCR) on image-only scans.

An invoice reads fine as a PDF, but an application needs its number, total, and line items as data. This tutorial uses the [Nutrient Data Extraction API](https://www.nutrient.io/guides/dws-data-extraction.md) to convert PDF content into JSON, including tables and fields from scanned documents. The downloadable invoice example adds a manual review step before the values are exported. For an overview of the hosted endpoint, see the [PDF-to-JSON API](https://www.nutrient.io/api/pdf-to-json-api/).

## Why convert PDF to JSON?

PDF preserves page layout, but its structure varies. Tagged PDFs can encode a logical reading order, and interactive forms can expose field names and values. Untagged tables and flattened forms may contain only positioned text or pixels, so an extraction step is needed to recover their structure. JSON enables downstream applications to process the extracted fields and document structure.

Choose the JSON output based on what the application needs:

- **Full-document structure** — Detected paragraphs, headings, tables, and figures as typed elements, in reading order. Use these elements for search indexing, document comparison, and retrieval-augmented generation (RAG) ingestion.

- **Tables** — Rows and cells as data. Use this output for line items, price lists, and reports.

- **Known fields** — A fixed set of values mapped to a schema the downstream system already expects. Use this output when processing invoices or collecting form data.![Diagram of two endpoints for converting a PDF to JSON. A born-digital or scanned PDF goes to the Data Extraction API. POST /extraction/parse returns elements in reading order, such as paragraphs with bounds, and tables as rows and cells. Use it for search indexing, RAG ingestion, and line items. POST /extraction/extract with a JSON Schema returns named fields, such as invoice number and total amount. Use it for invoice processing and form intake. OCR runs on scanned input in the structure, understand, and agentic modes.](https://www.nutrient.io/@/assets/images/blog/2026/how-to-convert-pdf-to-json/pdf-to-json-paths.png)

Validate the extracted values against the application’s rules before using them in production.

## Get an API key

The examples call the Data Extraction API’s REST endpoints, so they need an API key and a local PDF. Use `curl` 7.76.0 or newer for the shell examples, or Python with the `requests` package for the Python example. Sign up on the [Nutrient dashboard](https://dashboard.nutrient.io/sign_up/?product=data-extraction) and copy the live key, which starts with `pdf_live_`, from the Data Extraction API keys page. The [getting started guide](https://www.nutrient.io/guides/dws-data-extraction/getting-started.md) covers setup in more detail.

For Python, install the dependency in the project’s virtual environment. On systems that use `python3`, substitute it for `python` in the commands below:

```shell

python -m pip install requests

```

## Turn a full PDF into structured JSON

With `output.format` set to `spatial`, the `/extraction/parse` endpoint returns detected document elements in `output.elements`. Their fields depend on the element type and can include text, spatial coordinates, detection confidence, and a page reference:

```shell

curl --fail-with-body --max-time 180 -X POST https://api.nutrient.io/extraction/parse \
  -H "Authorization: Bearer your_api_key_goes_here" \
  -F "file=@document.pdf" \
  -F 'instructions={"mode":"understand","output":{"format":"spatial"}}'

```

The same request in Python:

```python

import json
import requests

with open("document.pdf", "rb") as document:
    response = requests.post(
        "https://api.nutrient.io/extraction/parse",
        headers={"Authorization": "Bearer your_api_key_goes_here"},
        files={"file": document},
        data={
            "instructions": '{"mode":"understand","output":{"format":"spatial"}}'
        },
        timeout=(10, 180),
    )

response.raise_for_status()
result = response.json()
with open("document.json", "w", encoding="utf-8") as output:
    json.dump(result, output, ensure_ascii=False, indent=2)
print(json.dumps(result, ensure_ascii=False, indent=2))

```

The Python example checks the HTTP status before it saves the response to `document.json` and prints valid JSON. The response wraps the element array in `output`, as shown in this illustrative response with one paragraph:

```json

{
  "status": 200,
  "requestId": "req_e5f6g7h8",
  "output": {
    "elements": [
      {
        "id": "a1b2c3d4-1111-4000-8000-000000000001",
        "type": "paragraph",
        "role": "Title",
        "text": "Quarterly Report",
        "confidence": 0.95,
        "readingOrder": 0,
        "bounds": { "x": 100, "y": 50, "width": 400, "height": 35 },
        "page": { "pageIndex": 0, "pageNumber": 1, "width": 1818, "height": 2422 }
      }
    ]
  },
  "metrics": {
    "processingTimeMs": 4200,
    "pagesProcessed": 1
  },
  "configuration": {
    "mode": "understand",
    "outputFormat": "spatial"
  }
}

```

The `readingOrder` field records the detected reading sequence on each page, and `bounds` locates each element. Both help viewers highlight where a value came from. The [extract document elements guide](https://www.nutrient.io/guides/dws-data-extraction/parsing/extract-document-elements.md) covers the full schema, and the [RAG ingestion pipeline example](https://www.nutrient.io/guides/dws-data-extraction/examples/build-rag-ingestion-pipeline.md) shows these elements feeding a search index or RAG pipeline.

## Pull PDF tables out as JSON rows and cells

Tables come back as their own element type in the same `/extraction/parse` response. A `table` element includes `rowCount`, `columnCount`, and a `cells` array, so line items and report rows arrive as data, with no separate request or table-detection step. To save the detected tables, including their cell values and row/column spans, run the Python parse example above and append this code to write `tables.json`:

```python

tables = [e for e in result["output"]["elements"] if e["type"] == "table"]

with open("tables.json", "w", encoding="utf-8") as output:
    json.dump(tables, output, ensure_ascii=False, indent=2)
print(json.dumps(tables, ensure_ascii=False, indent=2))

```

For known form fields, use `/extraction/extract` with a JSON Schema, as shown in the next section. For a no-code table-extraction alternative using Nutrient DWS Processor API, see [table extraction on Zapier](https://www.nutrient.io/blog/nutrient-api-zapier-extract-table/).

## Map known fields to a custom JSON Schema

When the downstream system expects specific fields, skip the full-document structure and use the `/extraction/extract` endpoint. It maps the document directly to a [JSON Schema](https://www.nutrient.io/guides/dws-data-extraction/extract/define-a-schema.md) provided in the request and places the extracted values in the response’s `output.data` object. The request below asks for `invoice_number` and `total_amount`:

```shell

curl --fail-with-body --max-time 180 -X POST https://api.nutrient.io/extraction/extract \
  -H "Authorization: Bearer your_api_key_goes_here" \
  -F "file=@invoice.pdf" \
  -F 'instructions={"schema":{"type":"object","properties":{"invoice_number":{"type":"string","description":"Invoice identifier"},"total_amount":{"type":"number","description":"Total amount including tax"}},"required":["invoice_number","total_amount"]},"parseConfig":{"mode":"understand"}}'

```

Read the extracted invoice fields from `output.data`, not the response root. The response also includes processing information and, when enabled, citation metadata.

The schema’s root must be `type: "object"`, and each field’s `description` guides the extraction. Treat it as an instruction, not documentation. Arrays model repeated structures such as invoice line items:

```json

{
  "type": "object",
  "properties": {
    "line_items": {
      "type": "array",
      "description": "One entry per row in the line-item table",
      "items": {
        "type": "object",
        "properties": {
          "description": { "type": "string" },
          "quantity": { "type": "integer" },
          "unit_price": { "type": "number" }
        },
        "required": ["description", "quantity", "unit_price"]
      }
    }
  }
}

```

The API treats schemas as closed: Only declared properties appear in `output.data`, and fields marked `required` are included. Optional properties may be omitted when the document doesn’t contain them. Schema conformance doesn’t establish that an extracted value is correct; validate amounts, identifiers, and other business rules before using the result. The API can also return per-field citations that point back to the source location, and the [citations and confidence guide](https://www.nutrient.io/guides/dws-data-extraction/extract/citations-and-confidence.md) covers them. The [invoice extraction example](https://www.nutrient.io/guides/dws-data-extraction/examples/extract-invoice-data-with-schema.md) shows a complete schema for a real invoice.

## Review invoice fields before exporting JSON

Try the workflow with this [fictional invoice](https://www.nutrient.io/downloads/pdf-to-json-review/invoice.pdf) and the [Python extraction and review script](https://www.nutrient.io/downloads/pdf-to-json-review/review_invoice.py). Save both files in the same directory and open a terminal in that directory. The script requires Python 3.10 or later and the `requests` package installed earlier.

Use these values from the sample PDF to check the extraction:

| Field               | Value in the sample PDF |
| ------------------- | ----------------------- |
| Invoice number      | `INV-DEMO-1042`         |
| Supplier            | Example Office Supplies |
| Total including tax | USD 176.00              |

This sample uses USD. The script extracts the total as a JSON number for review. Before calculating with extracted amounts, convert them to Python’s `Decimal` rather than `float` to avoid rounding drift. For invoices in multiple currencies, add a currency field to the schema and review it separately.

Set the Data Extraction API key and run the extraction in the same terminal session:

```shell

export NUTRIENT_API_KEY="your_data_extraction_api_key"
python review_invoice.py extract invoice.pdf

```

The script requests those three fields with citation metadata enabled. It saves the original response and a SHA-256 hash of the source PDF in `invoice-extracted.json`, and the review step later checks that the supplied PDF matches the file used for extraction.

Open `invoice.pdf` beside the terminal. Then start the review:

```shell

python review_invoice.py review invoice.pdf invoice-extracted.json

```

For each field, the script prints the extracted value and any available citation metadata. Check the value against the PDF and then accept it or enter a correction and a reason. If a value can’t be verified, quit and resolve it before exporting. A source match helps locate evidence, but the value still needs a check.

The script writes `invoice-reviewed.json` only after all three fields are confirmed, and it never overwrites an existing file. Reviewed values sit under `data`, while the separate `review` object records the original values, citations, decisions, and correction reasons. When a value is corrected, the original citations stay in the file, labeled as evidence for the original extraction.

Nutrient supplies extraction and citation metadata; the Python script collects the reviewer’s decisions. Payment approval and reviewer authentication belong in the application. For a browser interface, use the [citation coordinate guide](https://www.nutrient.io/guides/dws-data-extraction/parsing/coordinate-spaces.md) to map source regions onto a document view.

[Convert your PDF to JSON with Nutrient](https://dashboard.nutrient.io/sign_up/?product=data-extraction)

## Convert scanned PDFs to JSON with OCR

Image-only scanned PDFs have no text layer, so plain text extraction can’t recover their text, although scans processed earlier with OCR may already contain one. The Data Extraction API handles this through its processing modes: `structure`, `understand`, and `agentic` all run OCR automatically before producing output, across 100+ [supported languages](https://www.nutrient.io/guides/dws-data-extraction/supported-languages.md).

Choose a mode based on the document and the required output:

| Mode         | OCR | Best for                                                             |
| ------------ | --- | -------------------------------------------------------------------- |
| `text`       | No  | Existing text layers; Markdown only, no spatial elements             |
| `structure`  | Yes | Scanned documents needing basic layout segmentation                  |
| `understand` | Yes | Tables, charts, and complex document layouts                         |
| `agentic`    | Yes | Generated image descriptions, degraded scans, or cursive handwriting |![Which endpoint and mode? If there are known fields to pull out, such as invoice number, totals, and dates, use /extraction/extract: send a JSON Schema, and values are returned in output.data, where optional fields may be omitted. For the whole document, use /extraction/parse, which returns spatial elements or Markdown depending on the selected mode. Pick the parse mode by input and depth: text for an existing text layer with no OCR and Markdown only; structure for scans with OCR and basic layout; understand for tables, charts, and complex layouts; and agentic for image descriptions, degraded scans, or cursive handwriting.](https://www.nutrient.io/@/assets/images/blog/2026/how-to-convert-pdf-to-json/pdf-to-json-mode-decision.png)

Don’t change the spatial-output request above to `text` mode without also changing `output.format` to `markdown`, because `text` mode doesn’t return `output.elements`.

For known fields from scanned forms, use `/extraction/extract` with a schema and `parseConfig.mode` set to `understand`, which maps the fields to `output.data`. Use `agentic` for generated image descriptions or when testing shows that `understand` misses content. The [processing modes guide](https://www.nutrient.io/guides/dws-data-extraction/parsing/processing-modes.md) compares all four in detail.

## Convert your first PDF to JSON with Nutrient

Use `/extraction/parse` for full-document structure and tables, or `/extraction/extract` with a JSON Schema for known fields. Choose an OCR-enabled mode for scanned input, and review the extracted values against the source PDF before using them in an application.

Sign up on the [Nutrient dashboard](https://dashboard.nutrient.io/sign_up/?product=data-extraction) to try these examples with free credits. Start with the sample invoice, review the extracted values, and save the reviewed JSON. The [Data Extraction API guides](https://www.nutrient.io/guides/dws-data-extraction.md) cover schema definition, citations, and parse configuration, and the [Nutrient Data Extraction API](https://www.nutrient.io/api/data-extraction-api/) page lists supported document types and processing options.

## Related reading

- [Extract data from PDF: A developer guide to structured JSON](https://www.nutrient.io/blog/pdf-data-extraction-developer-guide.md) — A broader look at extraction, comparing structured elements, Markdown, and schema-mapped output across document types

- [Extract tables from PDF with Nutrient Document Web Services API on Zapier](https://www.nutrient.io/blog/nutrient-api-zapier-extract-table/) — A no-code alternative using Nutrient DWS Processor API

- [Multimodal RAG](https://www.nutrient.io/blog/multimodal-rag.md) — Where structured JSON extraction fits in a retrieval-augmented generation pipeline

## FAQ

#### How do I convert a PDF to JSON programmatically?

Send the PDF to the Nutrient Data Extraction API’s `/extraction/parse` endpoint via an HTTP POST request. With spatial output, the response contains detected elements, such as paragraphs and tables, in `output.elements`. Their fields depend on the element type and processing mode, and can include text, coordinates, and confidence scores.

#### Can I extract tables from a PDF as JSON?

Yes. Table elements in the parse response include row and column counts plus per-cell data, so tables arrive as structured JSON rather than positioned text.

#### How do I extract specific fields like invoice numbers to JSON?

The `/extraction/extract` endpoint accepts a JSON Schema describing the fields to extract. The API maps the document to that schema and returns the extracted values in `output.data`. Undeclared properties are excluded; optional properties may be omitted.

#### Does PDF-to-JSON conversion work on scanned PDFs?

Yes. The `structure`, `understand`, and `agentic` processing modes run OCR automatically before extraction, supporting 100+ languages. The `text` mode requires an existing text layer and supports Markdown output only.
---

## 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 Assistant Agent Governance](/blog/ai-assistant-agent-governance.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)
- [Ai Schema Generator Document Extraction](/blog/ai-schema-generator-document-extraction.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)
- [Apryse To Nutrient Migration](/blog/apryse-to-nutrient-migration.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)
- [Electronic signature API: How to sign PDFs programmatically](/blog/electronic-signature-api.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)
- [How To Convert Html To Pdf Using React](/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)
- [How to generate PDFs in C# with Nutrient .NET SDK](/blog/how-to-generate-pdf-in-csharp.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)
- [C# barcode scanner: How to scan and read 1D barcodes and QR codes](/blog/how-to-scan-barcodes-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)
- [Migrating Observability Hyperdx To Dash0](/blog/migrating-observability-hyperdx-to-dash0.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)
- [Multipage Extraction Page Boundaries](/blog/multipage-extraction-page-boundaries.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)
- [Ocr Api Comparison](/blog/ocr-api-comparison.md)
- [Online Document Viewer](/blog/online-document-viewer.md)
- [Open Pdf In Your Web App](/blog/open-pdf-in-your-web-app.md)
- [CPU](/blog/paddleocr-python-guide.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)
- [Pdfplumber Python Guide](/blog/pdfplumber-python-guide.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)
- [Using Javascript In Pdf Form Fields](/blog/using-javascript-in-pdf-form-fields.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)

