---
title: "PDF OCR on the Linux command line: OCRmyPDF, Tesseract, and Nutrient"
canonical_url: "https://www.nutrient.io/blog/how-to-ocr-pdfs-in-linux/"
md_url: "https://www.nutrient.io/blog/how-to-ocr-pdfs-in-linux.md"
last_updated: "2026-08-19T14:10:58.693Z"
description: "Run OCR on PDFs from the Linux terminal with OCRmyPDF on Ubuntu, Debian, and Fedora — install commands, Tesseract languages, and a Nutrient alternative for scale."
---

**To OCR a PDF from the Linux command line, install [OCRmyPDF] and run `ocrmypdf input.pdf output.pdf` — it wraps the [Tesseract] engine to add a searchable text layer. On Ubuntu or Debian, install it with `sudo apt-get install ocrmypdf`; on Fedora, use `dnf install ocrmypdf`.**

If you need to OCR a PDF from the Linux command line — whether on Ubuntu, Debian, or Fedora — the fastest open source option is [OCRmyPDF], a CLI wrapper around the [Tesseract] OCR engine. This post covers the install commands for each distribution, the basic `ocrmypdf input.pdf output.pdf` workflow, multilingual OCR, image preprocessing flags, and batch processing. It also covers [Nutrient Document Engine](https://www.nutrient.io/sdk/document-engine/) as a scalable alternative for teams that need high-volume OCR with multilingual accuracy and the option to run on a server rather than per-developer terminals.

**TL;DR**

OCR a PDF from the Linux terminal with OCRmyPDF:

- **Install** — `sudo apt-get install ocrmypdf` (Ubuntu/Debian) or `dnf install ocrmypdf` (Fedora)

- **Run** — `ocrmypdf input.pdf output.pdf` (adds a searchable text layer, outputs PDF/A)

- **Other languages** — `ocrmypdf -l deu+eng input.pdf output.pdf`

- **Clean up scans** — Add `--deskew`, `--rotate-pages`, or `--clean`

- **At scale** — [Nutrient Document Engine](https://www.nutrient.io/sdk/document-engine/) for server-side, high-volume OCR

## OCR a PDF from the Linux command line with OCRmyPDF

This next section walks through installing OCRmyPDF on Linux and running OCR on a PDF from the terminal.

### Why not use Tesseract directly?![OCRMyPDF Logo](@/assets/images/blog/2023/how-to-ocr-pdfs-in-linux/ocrmypdf-logo.png)

The open source library you’ll use is [OCRmyPDF], which is a multiplatform tool for running OCR on PDF files. It’s a wrapper around Tesseract that does some preprocessing on PDF files before running OCR on them. This preprocessing includes deskewing, noise removal, and cleaning up files to ensure the OCR engine can read the text accurately. OCRmyPDF also does some post-processing to ensure the output is consistent and error-free. You can use Tesseract directly, but in doing so, you’ll miss out on these benefits provided by OCRmyPDF.

### Key features of OCRmyPDF

- **Automatic OCR** — Automatically adds OCR text layers to existing PDFs.

- **Text recognition** — Utilizes Tesseract for high-quality OCR.

- **Multilanguage support** — Supports multiple languages, including English, French, German, and Spanish.

- **PDF/A conversion** — Converts PDFs to the PDF/A format for long-term archiving.

- **Command-line interface** — Provides a simple command-line interface for ease of use.

### Installing OCRmyPDF

Install OCRmyPDF using the following command on Ubuntu- or Debian-based systems:

```

sudo apt-get install ocrmypdf

```

For Fedora, you can use the following command:

```

dnf install ocrmypdf

```

Sometimes, the available package version might not be the latest one, so you can install OCRmyPDF directly from PyPI instead (the project also documents [`uv`](https://docs.astral.sh/uv/) as a faster modern alternative):

```

pip install --user ocrmypdf

```

Just keep in mind that the PIP method won’t install some non-Python dependencies of OCRmyPDF. These dependencies include:

- Python 3.11 or newer (3.12+ recommended)

- Ghostscript 9.54 or newer (optional when `pypdfium2` is available)

- Tesseract 4.1.1 or newer

- jbig2enc 0.29 or newer (optional)

- pngquant 2.5 or newer (optional)

- unpaper 6.1 (optional)

### Basic usage

To use OCRmyPDF, run the following command, replacing `input.pdf` with the path to the PDF file you want to OCR, and `output.pdf` with the path where you want to save the OCR’d PDF:

```bash

ocrmypdf input.pdf output.pdf

```

This will result in a PDF/A output file with an OCR layer. PDF/A is a subset of the PDF standard that prohibits features that aren’t suitable for long-term archiving. This includes JavaScript in PDFs, font linking, and encryption. You can ask OCRmyPDF to output a standard PDF via this command:

```bash

ocrmypdf --output-type pdf input.pdf output.pdf

```

You can even perform OCR only on certain pages:

```bash

ocrmypdf --pages 2,3,13-17 input.pdf output.pdf

```

### OCR in a language other than English

By default, OCRmyPDF assumes a document is in English. If the language is different, the OCR quality will be considerably poor. In such a case, you need to explicitly pass in the language, like so:

```bash

ocrmypdf -l rus russian_doc.pdf russian_doc_ocr.pdf

```

If the document is multilingual, you can pass in multiple languages:

```

ocrmypdf -l rus+eng russian_doc.pdf russian_doc_ocr.pdf

```

Tesseract (the OCR engine used by OCRmyPDF under the hood) supports quite a few different languages. You can take a look at the [Tesseract documentation] to determine if it supports your required language.

You might be required to install additional language packs before you can use them with OCRmyPDF. Follow these [instructions] to figure out how to do so.

### Image processing

As mentioned earlier, OCRmyPDF can perform some image processing on each page of a PDF, if required. It supports multiple options for this purpose. According to [the official documentation], there are five different options. We’ve included the text from the documentation in the list below:

- `--rotate-pages` attempts to determine the correct orientation for each page and rotates the page if necessary.

- `--remove-background` attempts to detect and remove a noisy background from grayscale or color images. Monochrome images are ignored. This should not be used on documents that contain color photos as it may remove them.

- `--deskew` will correct pages were scanned at a skewed angle by rotating them back into place.

- `--clean` uses [unpaper] to clean up pages before OCR, but does not alter the final output. This makes it less likely that OCR will try to find text in background noise.

- `--clean-final` uses unpaper to clean up pages before OCR and inserts the page into the final output. You will want to review each page to ensure that unpaper did not remove something important.

Regardless of the order in which you pass these options, OCRmyPDF will always apply them in this order:

```

rotate -> remove background -> deskew -> clean

```

### File optimization

By default, OCRmyPDF optimizes the output PDF for Fast Web View. This linearizes the PDF file and stores all references in the PDF file in the same order in which they’ll be viewed by the user. This slightly increases the file size as well; however, you can disable optimization by passing in `--optimize 0` or `-O0`.

At the default optimization level, `-O1`, OCRmyPDF also does some lossless image optimization using JBIG2 encoder. You can disable this optimization by passing in `-O0`, or you can enable more aggressive lossy optimization by passing in `-O2` or `-O3`.

### Batch processing PDF files

By default, OCRmyPDF uses all available cores while processing PDF files. You can limit this by using the `-j` or `--jobs` option. This limits the number of concurrent threads used:

```bash

ocrmypdf -j 4 input.pdf output.pdf

```

The authors of the program also conveniently created a [`watcher.py` file] for watching folders and performing OCR on any new PDF file. You might need to update the contents of the watcher file to suit your specific needs. Because this file has some additional dependencies, you might need to install `ocrmypdf` using the `watcher` tag:

```bash

pip install ocrmypdf[watcher]

```

You can then run the watcher like this:

```bash

env OCR_INPUT_DIRECTORY=./input-pdfs \
    OCR_OUTPUT_DIRECTORY=./output-pdfs \
    python3 watcher.py

```

This will OCR any new PDF files that are placed in the `input-pdfs` folder and place the resulting PDFs in the `output-pdfs` folder. Note that this won’t process any files that were already in the `input-pdfs` folder before the watcher was run.

## How to OCR a PDF on Linux using Nutrient Document Engine

[Nutrient Document Engine](https://www.nutrient.io/sdk/document-engine/) offers a powerful and scalable solution for performing OCR and managing document workflows. It’s PDF server software designed for processing documents and powering PDF automation workflows. Operating as a headless service, it can be deployed within your own infrastructure or hosted via Nutrient.

### Key features of Nutrient Document Engine

- **HTTP-based API** — Operates as a headless service for easy integration.

- **Flexible deployment** — Deploy within your infrastructure or host via Nutrient.

- **Frontend SDKs** — Works alongside Nutrient’s web and mobile frontend SDKs.

- **Prebuilt features** — Includes the ability to annotate, edit, sign, form fill, redact, and more.

### OCR capabilities with Document Engine

Document Engine includes custom-built OCR technology to accurately recognize text and patterns, generating searchable PDF/A files. OCR-processed PDFs can be opened in Nutrient’s Web, iOS, Android, React Native, and Flutter client SDKs.

### Key features of Nutrient Document Engine for OCR

- **Highly accurate OCR** — Document Engine includes a custom-built AI- and ML-powered OCR engine that delivers highly accurate text and pattern recognition. This enables you to convert images, scanned documents, and unstructured data into searchable and editable content.

- **Multilanguage support** — It supports multiple languages, including English, French, German, and Spanish, making it versatile for global applications.

- **Searchable PDF generation** — Turn any scanned document or image into a searchable PDF or PDF/A document. This is ideal for archiving and indexing documents for quick retrieval.

- **[Data extraction](https://www.nutrient.io/sdk/ocr/)** — The OCR engine can extract key-value pairs from unstructured documents, which can be particularly useful for automating workflows in industries like healthcare, finance, and legal.

- **Post-processing capabilities** — After processing a document with OCR, you can add signatures and annotations, and even perform document assembly, enhancing your document management workflows.

- **Integrated viewing options** — Document Engine integrates seamlessly with Nutrient’s Web, iOS, Android, React Native, and Flutter client SDKs, enabling you to open and display processed PDFs within your applications.

### System requirements

To run Nutrient Document Engine, your system must meet the following criteria:

- **macOS** — Sequoia, Sonoma, or Ventura

- **Linux** — Ubuntu, Fedora, Debian, CentOS, or derivatives like Kubuntu or Xubuntu; 64-bit Intel (x86_64) and ARM (AArch64) processors are supported.

You should have a minimum of 4 GB RAM available, regardless of the operating system.

### Setting up Docker

Document Engine is provided as a Docker container. To deploy it, install Docker for your operating system:

- **macOS** — Install and start Docker Desktop for Mac. Refer to the [Docker website](https://docs.docker.com/desktop/install/mac-install/) for instructions.

- **Windows** — Install and start Docker Desktop for Windows. Refer to the [Docker website](https://docs.docker.com/desktop/install/windows-install/) for instructions.

- **Linux** — Install Docker Engine. Refer to the [Docker website](https://docs.docker.com/desktop/install/linux-install/) for instructions.

### Launching Document Engine

Once Docker is installed, follow the steps outlined below to start Document Engine.

1. Open your terminal:
   - **macOS** — You can use a terminal integrated within your IDE or standalone applications like `Terminal.app` or `iTerm2`.
   - **Windows/Linux** — Use any terminal emulator or the one provided in your IDE.

2. Enter the following command to start the service:

```bash

docker run --rm -t -p 5000:5000 -e API_AUTH_TOKEN=secret pspdfkit/document-engine:1.16.0

```

The initialization might take some time, depending on your network speed. Wait until you see a message like the following one:

```bash

[info]  2026-05-29 18:56:45.286  Running Document Engine version 1.16.0

```

### Installing curl

To interact with Document Engine, you need to use its HTTP API by sending commands and documents in HTTP requests. For this, ensure you have `curl` installed:

- macOS — `curl` is preinstalled, so no additional steps are required.

- Windows — Download and install `curl` from the [official site](https://curl.se/windows/).

- Linux — Use your package manager (e.g. `sudo apt-get install curl` for Debian/Ubuntu).

### Performing OCR with Nutrient Document Engine

Once Document Engine is running, you can perform OCR on your PDFs by sending requests to its API.

1. Running OCR on document upload

   To perform OCR when uploading a new document, use the `ocr` action within the `instructions` parameter in your API request:

   ```shell

   curl -X POST http://localhost:5000/api/documents \
     -H "Authorization: Token token=<API token>" \
     -F instructions='{
       "parts": [
         {
           "file": "file-part"
         }
       ],
       "actions": [
         {
           "type": "ocr",
           "language": "english"
         }
       ]
     }' \
     -F document=@/path/to/ExampleDocument.pdf \
     -o result.pdf
   ```

   ```http

   POST /api/documents HTTP/1.1
   Content-Type: multipart/form-data; boundary=customboundary
   Authorization: Token token=<API token>

   --customboundary
   Content-Disposition: form-data; name="instructions"
   Content-Type: application/json

   {
     "parts": [
       {
         "file": "file-part"
       }
     ],
     "actions": [
       {
         "type": "ocr",
         "language": "english"
       }
     ]
   }
   --customboundary
   Content-Disposition: form-data; name="document"; filename="Example Document.pdf"
   Content-Type: application/pdf

   <PDF data>
   --customboundary--
   ```

   This command uploads `ExampleDocument.pdf`, applies OCR in English, and outputs a searchable PDF named `result.pdf`.

2. Applying OCR to existing documents

   If you have a document already uploaded to Document Engine, you can apply OCR using the `apply_instructions` endpoint:

   ```shell

   curl -X POST http://localhost:5000/api/documents/:document_id/apply_instructions \
     -H 'Authorization: Token token=<API token>' \
     -H "Content-Type: application/json" \
     -d '{
       "parts": [
         {
           "document": {
             "id": "#self"

           }
         }
       ],
       "actions": [
         {
           "type": "ocr",
           "language": "english"
         }
       ]
     }' \
     -o result.pdf
   ```

   ```http

   POST /api/documents/:document_id/apply_instructions HTTP/1.1
   Content-Type: application/json
   Authorization: Token token=<API token>

   {
     "parts": [
       {
         "document": {
           "id": "#self"

         }
       }
     ],
     "actions": [
       {
         "type": "ocr",
         "language": "english"
       }
     ]
   }
   ```

   Replace `:document_id` with your document’s ID. The `#self` anchor is used to refer to the current document.

3. Running OCR and retrieving the result without storing

To perform OCR on a document and retrieve the result without storing it in Document Engine’s storage, use the `/build` endpoint:

```shell

curl -X POST http://localhost:5000/api/build \
  -H "Authorization: Token token=<API token>" \
  -F instructions='{
    "parts": [
      {
        "file": "file-part"
      }
    ],
    "actions": [
      {
        "type": "ocr",
        "language": "english"
      }
    ]
  }' \
  -F document=@/path/to/ExampleDocument.pdf \
  -o result.pdf

```

```http

POST /api/build HTTP/1.1
Content-Type: multipart/form-data; boundary=customboundary
Authorization: Token token=<API token>

--customboundary
Content-Disposition: form-data; name="instructions"
Content-Type: application/json

{
  "parts": [
    {
      "file": "file-part"
    }
  ],
  "actions": [
    {
      "type": "ocr",
      "language": "english"
    }
  ]
}
--customboundary
Content-Disposition: form-data; name="document"; filename="Example Document.pdf"
Content-Type: application/pdf

<PDF data>
--customboundary--

```

### Performance considerations

Running OCR is a CPU-bound single-threaded operation. Performing many parallel OCR operations on a single Document Engine instance can cause a high load for extended periods. Some performance benchmarks on development hardware are as follows:

- 6-page document — ~35–40 seconds for the entire document, ~6–11 seconds per page.

- 1-page document — ~3–4 seconds per page.

Factors affecting performance include the number of pages, content complexity, and server hardware capabilities.

## OCRmyPDF vs. Tesseract vs. Nutrient Document Engine

The three tools in this guide sit at different points on the setup-versus-scale spectrum.

| Criteria             | OCRmyPDF (CLI)                           | Tesseract (direct)                 | Nutrient Document Engine             |
| -------------------- | ---------------------------------------- | ---------------------------------- | ------------------------------------ |
| Setup                | One-line `apt`/`dnf`/`pip` install       | Manual; no PDF handling            | Server (Docker/Kubernetes) or hosted |
| PDF input            | Native (wraps Tesseract + preprocessing) | Images only — no PDF text layer    | Native PDF and image input           |
| Preprocessing        | Built in (deskew, denoise, clean)        | Do it yourself                     | Built in                             |
| Output               | Searchable PDF/PDF/A                     | Plain text or hOCR                 | Searchable PDF plus structured data  |
| Scale and automation | Per-machine CLI and batch scripts        | DIY                                | Server API for high-volume pipelines |
| Best for             | Local or one-off command-line OCR        | Low-level control over recognition | Production and enterprise workflows  |

## Conclusion

Both OCRmyPDF and Nutrient Document Engine offer robust OCR solutions for converting scanned documents into searchable PDFs. OCRmyPDF is a great choice for those who prefer an open source, command-line-based tool with simple setup and usage. In contrast, [Nutrient Document Engine](https://www.nutrient.io/sdk/document-engine/) provides a more integrated, scalable, and feature-rich approach for enterprise applications.

For more information on setting up and using Nutrient Document Engine, visit the [Nutrient documentation](https://www.nutrient.io/sdk/document-engine/getting-started.md) or [reach out](https://www.nutrient.io/contact-sales/?=sdk) to our team to get more information.

## Related reading

- [Tesseract OCR in Python](https://www.nutrient.io/blog/tesseract-python-guide.md) — The Python path to the same engine, with configuration and tuning

- [OCR a PDF with the Nutrient OCR API](https://www.nutrient.io/blog/how-to-ocr-pdf-api/) — A hosted REST alternative to running OCR locally

- [Document AI vs. OCR](https://www.nutrient.io/blog/document-ai-vs-ocr.md) — How OCR relates to broader document understanding

- [PDF data extraction developer guide](https://www.nutrient.io/blog/pdf-data-extraction-developer-guide.md) — Approaches for extracting text and structured data from PDFs

- [Barcode and OCR extraction](https://www.nutrient.io/blog/barcode-ocr/) — Reading barcodes alongside text during OCR

## FAQ

#### What is OCRmyPDF?

OCRmyPDF is an open source tool that adds OCR layers to PDF files, making them searchable and editable. It uses Tesseract for text recognition and performs preprocessing like deskewing and noise removal.

#### How do I install OCRmyPDF on Linux?

You can install OCRmyPDF on Ubuntu/Debian with `sudo apt-get install ocrmypdf`, on Fedora with `dnf install ocrmypdf`, or via PIP with `pip install --user ocrmypdf`.

#### How can I OCR a PDF in a language other than English?

You can specify the language using the `-l` flag. For example, to OCR in Russian:

`ocrmypdf -l rus input.pdf output.pdf`

#### How do I OCR a scanned PDF on Linux?

OCRmyPDF handles scanned, image-only PDFs directly — run `ocrmypdf input.pdf output.pdf` and it rasterizes each page, runs Tesseract, and adds a searchable text layer without changing the visual appearance. For skewed or noisy scans, add `--deskew` and `--clean` to improve recognition.

#### How do I batch OCR multiple PDFs?

Loop over the files from the shell — `for f in *.pdf; do ocrmypdf "$f" "ocr_$f"; done` — or use OCRmyPDF’s `watcher.py` to OCR any PDF dropped into a folder. Use the `-j` flag to control how many pages process in parallel.

#### What is Nutrient Document Engine and how is it different?

Nutrient Document Engine is an enterprise-grade, scalable solution for OCR and document management. It offers a more feature-rich OCR experience, including AI-powered text recognition, multi-language support, and integration with frontend SDKs for web and mobile.

#### How do I use Nutrient Document Engine for OCR?

You can deploy Document Engine using Docker and perform OCR via its HTTP API. Here’s an example using `curl`:

```shell

curl -X POST http://localhost:5000/api/documents \
-H "Authorization: Token token=<API token>" \
-F document=@/path/to/file.pdf \
-F instructions='{"actions":[{"type":"ocr","language":"english"}]}' \
-o result.pdf

```
---

## 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)
- [Best Document Ai Platforms](/blog/best-document-ai-platforms.md)
- [Best Document Viewers](/blog/best-document-viewers.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)
- [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 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 Print Pdf In Csharp](/blog/how-to-print-pdf-in-csharp.md)
- [Open an image.](/blog/how-to-use-tesseract-ocr-in-python.md)
- [From an HTML string.](/blog/html-in-pdf-format.md)
- [Html To Pdf In Javascript](/blog/html-to-pdf-in-javascript.md)
- [Javascript Pdf Editors](/blog/javascript-pdf-editors.md)
- [Javascript Pdf Libraries](/blog/javascript-pdf-libraries.md)
- [Linearized Pdf](/blog/linearized-pdf.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 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)
- [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)

