---
title: "PaddleOCR in Python: Setup, PDF input, and production use"
canonical_url: "https://www.nutrient.io/blog/paddleocr-python-guide/"
md_url: "https://www.nutrient.io/blog/paddleocr-python-guide.md"
last_updated: "2026-10-12T15:36:38.427Z"
description: "Use PaddleOCR 3.7 in Python: Install the runtime, read PDFs with predict(), inspect OCR results, and compare Nutrient APIs for your document workflow needs."
---

**TL;DR**

PaddleOCR is an Apache-2.0 optical character recognition (OCR) toolkit that accepts images and PDFs. This guide uses PaddleOCR 3.7.0, covers the separate PaddlePaddle runtime installation, and replaces the old `ocr(img, cls=True)` pattern with `predict()`. It also shows how to inspect recognized text, coordinates, and confidence scores, and how local OCR compares with Nutrient’s hosted document APIs.

Text recognition is only half of a document workflow. PaddleOCR reads PDFs and images and returns the recognized text, but the surrounding application still has to validate that text, produce the final output, and deliver records to another system. This guide starts with the OCR pipeline and then looks at the integration options.

## What is PaddleOCR?

PaddleOCR is an open source toolkit built on the PaddlePaddle deep learning framework. This tutorial focuses on its general OCR pipeline, though the broader project also includes document parsing tools such as PP-StructureV3. When choosing between [Tesseract](https://www.nutrient.io/blog/how-to-use-tesseract-ocr-in-python.md) and PaddleOCR, compare them on document types, languages, hardware, and required output; preprocessing isnt the only difference.

A single call runs a pipeline rather than one model:

1. **Text detection** — Locates text regions and returns polygon boxes.

2. **Text line orientation classification** (optional) — Corrects rotated lines.

3. **Text recognition** — Reads the characters in each detected region.

Document-level orientation classification and unwarping are optional preprocessing stages, and the example below disables them explicitly. PP-OCRv5 also supports handwriting scenarios, but results vary, so test with real handwriting samples before relying on it or switching models. See the [PaddleOCR model documentation](https://github.com/PaddlePaddle/PaddleOCR/blob/v3.7.0/docs/version3.x/pipeline_usage/OCR.en.md) and our [handwriting recognition guide](https://www.nutrient.io/blog/handwriting-recognition-ocr-vlm/).

## Prerequisites

- Python supported by both the chosen PaddleOCR package and the PaddlePaddle wheel for your platform; check the [installation guide](https://github.com/PaddlePaddle/PaddleOCR/blob/v3.7.0/docs/version3.x/installation.en.md) before creating the environment

- A virtual environment — PaddlePaddle pulls a large dependency tree and conflicts are common

- Disk space for the model set, which downloads on first run — size varies by the models selected

## Installation

Install the inference runtime separately from PaddleOCR. PaddlePaddle CPU wheels are available on [PyPI](https://pypi.org/project/paddlepaddle/3.2.0/); the vendor also provides platform-specific CPU and CUDA package indexes. The commands below use PaddlePaddle 3.2.0, so confirm wheel availability and driver compatibility for the target operating system and Python version.

For a supported CPU environment, install the framework from its CPU index:

```bash

# CPU

python -m pip install paddlepaddle==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/

```

For an NVIDIA GPU environment, choose the wheel and package index for a supported CUDA runtime and driver combination. Follow PaddlePaddle’s installation instructions for any additional dependencies:

```bash

# GPU, CUDA 12.6

python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/

```

Install either the CPU or the GPU build, but never both into the same environment.

Then install PaddleOCR itself, which is a normal PyPI package:

```bash

python -m pip install paddleocr==3.7.0

```

### Verifying the installation

Check the imported package versions and whether PaddlePaddle was compiled with CUDA support:

```python

import paddle
import paddleocr

print(f"PaddleOCR version: {paddleocr.__version__}")
print(f"Paddle version: {paddle.__version__}")
print(f"CUDA-enabled build: {paddle.is_compiled_with_cuda()}")

```

If `import paddle` fails, check that the runtime was installed in the same environment. A CUDA-enabled build doesn’t prove that a compatible GPU is available or used for inference. Check the driver and device configuration, and run a small prediction on the intended device.

## Basic usage

The current API instantiates `PaddleOCR` and calls `predict()`:

```python

from paddleocr import PaddleOCR

ocr = PaddleOCR(
    use_doc_orientation_classify=False,  # skip page-orientation detection

    use_doc_unwarping=False,             # skip dewarping for photographed pages

    use_textline_orientation=False,      # skip per-line rotation classification

)

result = ocr.predict("./invoice.png")

for res in result:
    res.print()
    res.save_to_img("output")
    res.save_to_json("output")

```

Each enabled preprocessing stage adds processing time, so start with all three disabled for clean, upright scans. Then compare the results with the stages enabled for photographed, rotated, or warped inputs.

To select English and a GPU explicitly, use the following configuration after verifying that the GPU runtime works:

```python

ocr = PaddleOCR(lang="en", device="gpu")

```

Model selection and language support vary by release. PaddleOCR 3.7.0 defaults to PP-OCRv6 when no model is specified. Its [release documentation](https://github.com/PaddlePaddle/PaddleOCR/releases/tag/v3.7.0) describes a unified multilingual recognition model; other model families support additional languages. Check the language list for the chosen model and select PP-OCRv5 explicitly when appropriate:

```python

ocr = PaddleOCR(lang="korean", ocr_version="PP-OCRv5")

```

### Replacing the deprecated OCR call

Older v2 examples may use the following call, which is incompatible with the v3 interface:

```python

# Deprecated — do not use

result = ocr.ocr(img_path, cls=True)

```

`ocr()` is a deprecated wrapper around `predict()` in the pinned release. It forwards keyword arguments, but `predict()` doesn’t accept `cls`, so passing `cls=True` can emit a deprecation warning and then raise `TypeError`. The constructor flag replaces `cls=True`:

```python

ocr = PaddleOCR(use_textline_orientation=True)
result = ocr.predict("./rotated.png")

```

## Reading the result

`predict()` returns a list of result objects, including one result per PDF page when a PDF is supplied. Each exposes recognized text, coordinates, and confidence scores. Save results in a structured form:

```python

result = ocr.predict("./invoice.png")

for res in result:
    res.print()                    # human-readable dump

    res.save_to_json("output")     # structured output for downstream code

    res.save_to_img("output")      # annotated image, useful for debugging detection

```

Use the result’s structured fields rather than parsing its printed representation:

```python

for res in result:
    for text, score, box in zip(
        res["rec_texts"], res["rec_scores"], res["rec_polys"]
    ):
        print(text, float(score), box.tolist())

```

`rec_texts`, `rec_scores`, and `rec_polys` describe recognized text and its matching scores and polygons. `page_index` identifies the PDF page when present. Keep the package and model versions with saved results; serialized JSON isn’t a guarantee of an unchanged schema across upgrades.

### Reading PDFs directly

Pass a PDF path directly to the pipeline:

```python

result = ocr.predict("./document.pdf")
for res in result:
    res.save_to_json("output")

```

PaddleOCR renders PDF pages internally for OCR, so no separate rasterizer is needed. The general OCR pipeline returns recognition results only; creating a searchable PDF text layer is a separate output step. For mixed digital and scanned archives, decide when existing text can be reused instead of running OCR.

## Model versions

PaddleOCR 3.7.0 defaults to PP-OCRv6. Defaults differed in earlier v3 releases, so record the package release as well as the model family. Earlier model sets remain selectable:

```python

ocr = PaddleOCR(ocr_version="PP-OCRv5")

```

Server-side model variants trade speed for accuracy:

```python

ocr = PaddleOCR(
    text_detection_model_name="PP-OCRv5_server_det",
    text_recognition_model_name="PP-OCRv5_server_rec",
)

```

Pin the version in production. Model defaults change between releases, and an unpinned upgrade shifts accuracy numbers with no change to the code.

## Common errors

Most setup problems come from the separate runtime installation, leftover v2 code, or model downloads. The following sections cover each case.

### PaddleOCR imports but the framework is missing

A missing runtime can produce this error:

```text

ModuleNotFoundError: No module named 'paddle'

```

PaddleOCR is installed but PaddlePaddle isn’t. Install `paddlepaddle` from the PaddlePaddle index as shown above.

### The cls argument raises a TypeError

An older call signature can produce this error:

```text

TypeError: PaddleOCR.predict() got an unexpected keyword argument 'cls'

```

This indicates code written against the v2 API. Remove `cls` and set `use_textline_orientation` on the constructor instead.

### First run hangs or times out

Models download on first use. On a slow or restricted network, this looks like a hang. Prewarm the cache during image build rather than at request time.

### GPU build installed but inference runs on CPU

Use `paddle.is_compiled_with_cuda()` to identify whether the build supports CUDA. Then check device availability, driver compatibility, and the configured inference device. Keep CPU and GPU package variants out of the same environment.

## Where PaddleOCR fits in a document pipeline

PaddleOCR suits teams that want local OCR and can manage the inference runtime. It accepts PDFs and images, returns coordinates and scores, and offers configurable recognition models. Its broader document parsing pipelines can produce richer structure, so evaluate the specific pipeline instead of assuming the project only converts images to text.![PaddleOCR handles PDF or image input, text detection, and recognition. Application work includes result validation, final output integration, model operations, and throughput testing.](https://www.nutrient.io/@/assets/images/blog/2026/paddleocr-python-guide/where-paddleocr-stops.png)

The application still needs to cover four areas:

- **Input policy** — Decide which pages need OCR and whether existing digital text should be reused.

- **Output integration** — Validate recognized values, map them to destination records, and add searchable-PDF generation if that’s the required output.

- **Model operations** — Prepare model resources, pin versions, size the hardware, and handle cold starts.

- **Quality and throughput** — Benchmark representative documents before choosing confidence thresholds or committing to batch windows.

The [PDF data extraction guide](https://www.nutrient.io/blog/pdf-data-extraction-developer-guide.md) explains how recognition fits into a broader workflow, and the requirements of each project determine how much application code is needed.

## Reaching the same outcome with Nutrient

Nutrient provides hosted APIs for document processing without a local OCR runtime. Choose the endpoint by its output: The [OCR API](https://www.nutrient.io/api/pdf-ocr-api/) creates searchable PDFs, while the [Data Extraction API](https://www.nutrient.io/api/data-extraction-api/) returns structured document content. The application still handles validation, permissions, and delivery to the destination system.

The following request returns structured spatial elements from a PDF, but it doesn’t create a searchable PDF. Install `requests`, obtain a Data Extraction API key, and provide a local input file before running it:

```python

import requests

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

response.raise_for_status()
print(response.json())

```

This is a minimal synchronous example, so adjust timeouts and error handling for the workload. Spatial output includes detected elements and source coordinates; per-field match labels belong to the separate [schema extraction and citation workflow](https://www.nutrient.io/guides/dws-data-extraction/extract/citations-and-confidence.md). Refer to the [Data Extraction API guide](https://www.nutrient.io/guides/dws-data-extraction/getting-started.md) for request and response details.

### Choose the Nutrient integration

| Required output or deployment              | Nutrient option                                               | What to validate                                                              |
| ------------------------------------------ | ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| Searchable PDFs from scans                 | [OCR API](https://www.nutrient.io/api/pdf-ocr-api/)                                            | Text-layer quality, language settings, and output files                       |
| Structured document elements and tables    | [Data Extraction API](https://www.nutrient.io/api/data-extraction-api/)                         | Output schema, coordinates, confidence, and destination mapping               |
| Processing within your infrastructure      | [Python SDK](https://www.nutrient.io/sdk/python/)                                      | Supported operations, local resources, licensing, and deployment requirements |
| Document interaction inside an application | [Web](https://www.nutrient.io/sdk/web-overview/), [iOS](https://www.nutrient.io/sdk/ios/), or [Android](https://www.nutrient.io/sdk/android/) SDK | Platform-specific features and integration behavior                           |

Hosted APIs remove local model deployment and hardware management, but they still require quality checks, error handling, and workload testing. Measure cost and throughput on the documents that will actually be processed, because delivery time and output can change across service updates.

The Python SDK is a separate integration for local processing; it doesn’t make the hosted HTTP endpoints run on-premises. For offline environments, confirm model preparation and license requirements before deployment.

[Get searchable PDFs without running an OCR stack](https://dashboard.nutrient.io/sign_up/?product=processor)

## Conclusion

PaddleOCR fits teams that want control over local OCR and its runtime. When a hosted service fits the deployment, Nutrient’s OCR API covers searchable PDFs and the Data Extraction API covers structured content. Either way, compare output quality, processing time, cost, and integration effort on the same representative files.

## FAQ

#### Is PaddleOCR free for commercial use?

Yes. PaddleOCR is released under the Apache 2.0 license, which permits commercial use. The operational cost is infrastructure and engineering time, not licensing.

#### Why does <code>pip install paddleocr</code> not work on its own?

For the PaddlePaddle-backed pipeline shown here, install the runtime separately from `paddleocr`. CPU wheels are available on PyPI and through the vendor’s package indexes. Choose a runtime build supported by your platform and driver configuration.

#### Why does <code>ocr(img, cls=True)</code> raise a <code>TypeError</code>?

`ocr()` is deprecated in favor of `predict()`, and `predict()` doesn’t accept a `cls` argument. Set `use_textline_orientation=True` on the `PaddleOCR` constructor instead.

#### Do I still need PaddleOCR if I use a document API?

A separate PaddleOCR deployment isn’t needed when a Nutrient API supplies the required OCR or extraction operation. Use the OCR API for searchable PDFs and the Data Extraction API for structured results. Evaluate the Python SDK separately if processing must run locally.

#### Can PaddleOCR read PDFs directly?

Yes. The general OCR pipeline accepts a PDF path and processes its pages internally. Its recognition output doesn’t automatically create a searchable PDF text layer, so that result needs a separate output step or a service built for it.

#### How many languages does PaddleOCR support?

Language coverage depends on the model family and release. The project supports more than 100 languages across its models, while PP-OCRv6 has a smaller unified language set. Check the release-specific language list and select a compatible model with `lang` and `ocr_version`.

## Related reading

- [Tesseract OCR in Python](https://www.nutrient.io/blog/how-to-use-tesseract-ocr-in-python.md)

- [Handwriting recognition with OCR and VLMs](https://www.nutrient.io/blog/handwriting-recognition-ocr-vlm/)

- [Document AI vs. traditional OCR](https://www.nutrient.io/blog/document-ai-vs-ocr.md)

- [PDF data extraction: A developer guide](https://www.nutrient.io/blog/pdf-data-extraction-developer-guide.md)

- [Confidence scores and source grounding](https://www.nutrient.io/blog/document-extraction-confidence-scores.md)

- [PDF extraction case studies](https://www.nutrient.io/blog/pdf-extraction-document-case-studies.md)
---

## 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)
- [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)
- [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)

