---
title: "How to extract text from a PDF"
canonical_url: "https://www.nutrient.io/blog/pdf-text-extraction/"
md_url: "https://www.nutrient.io/blog/pdf-text-extraction.md"
last_updated: "2026-11-11T13:02:05.039Z"
description: "Learn how to extract text from a PDF using Python, JavaScript, Java, Swift, and Kotlin. Compare extraction libraries, handle scanned PDFs with OCR, and see code examples for each platform."
---

**TL;DR**

PDF files store rendering commands rather than structured text, which makes text extraction harder than reading a text file. This guide explains how PDFs represent text internally; compares extraction tools across Python, JavaScript, Java, and mobile platforms; and provides working code examples for each — including OCR for scanned documents.

Extracting text from a PDF is harder than it looks. PDF files are designed to preserve document appearance rather than facilitate text extraction. This post covers text extraction across multiple programming languages and compares tools for [Python](https://www.nutrient.io/blog/extract-text-from-pdf-using-python.md), [JavaScript](https://www.nutrient.io/blog/how-to-extract-text-from-a-pdf-using-javascript/), Java, Swift, and Kotlin.

## Why PDF text extraction is difficult

PDFs prioritize consistent rendering across devices, not text readability. They store low-level drawing commands rather than structured content, which makes extraction a heuristic problem.

## How text is represented in a PDF

A PDF file doesn’t simply contain text as you’d be used to in a text file. What it does contain are commands on how to render the given text on the screen without whitespace characters or newlines. Here’s how PDFs represent text internally.

### Content streams

Each page in a PDF has one or more content streams that tell the PDF viewer application how to render a page. A very simple one might look like this:

```

193.95 581.633 Td
(Hello) Tj
30.68 0 Td
(World!) Tj

```

These content streams can be represented differently while accomplishing the same goal, like this:

```

193.95 581.633 Td
<00290046004d004d00500001003800500053004d0045> Tj

```

`Td` instructs the PDF viewer where to draw the next string. `Tj` specifies which string to draw.

## Extracting text from a content stream

The only way to extract text from a PDF is by looking at the rendering commands and making a heuristic attempt to reconstruct it. In the example above, we know we’re supposed to render `Hello`, reposition the text cursor, and then output `World!`.

You might have noticed there’s no whitespace in the first example above. Because the content stream only instructs the rendering engine what to draw on the screen, and because whitespace has no rendering command, we have to infer the spaces and newlines ourselves most of the time.

Doing this reliably across all the different PDF documents out there is difficult, and it’s not uncommon to encounter problems where tweaking the heuristic breaks one document but fixes another.

## Extracting text with the Nutrient SDK

The Nutrient SDK offers APIs to retrieve text from a document across iOS, Android, and Web. All platforms use the same underlying heuristic to determine the layout of the text on the page and how to extract blocks out of it.

### iOS

On iOS, you can use [`PSPDFTextParser`](https://www.nutrient.io/api/ios/documentation/pspdfkit/textparser) to retrieve the text, text blocks, words, or glyphs from a page:

```swift

guard let textParser = documentProvider.textParserForPage(at: 0) else {
    // Handle failure.
    abort()
}
print("Text of page 0: \(textParser.text)")

for textBlock in textParser.textBlocks {
    print("TextBlock at \(textBlock.frame): \(textBlock.content)")
}

```

### Android

On Android, there’s no dedicated text parser class; instead, you retrieve your page text using [`PdfDocument`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.document/-pdf-document/index.html):

```kotlin

val pageText = document.getPageText(0)
print("Text of page 0: $pageText")

for (textRect in document.getPageTextRects(0, 0, pageText.length)) {
    val blockText = document.getPageText(0, textRect)
    print("TextBlock at $textRect: $blockText")
}

```

### Web

Nutrient Web SDK can extract the text from a page using [`textLinesForPageIndex`](https://www.nutrient.io/api/web/NutrientViewer.Instance.html#textLinesForPageIndex), but doesn’t currently support text block extraction:

```js

const textLines = await instance.textLinesForPageIndex(0);
textLines.forEach((textLine) => console.log(textLine.contents));

```

```js

instance.textLinesForPageIndex(0).then(function (textLines) {
	textLines.forEach(function (textLine) {
		console.log(textLine.contents);
	});
});

```

### Python

Python has several extraction libraries, including [PyPDF](https://www.nutrient.io/blog/extract-text-from-pdf-using-python.md) and [PyMuPDF](https://www.nutrient.io/blog/extract-text-from-pdf-pymupdf.md). Compare their output on representative documents to choose one for your workflow. Our [Python PDF text extraction tutorial](https://www.nutrient.io/blog/extract-text-from-pdf-using-python.md) covers both in depth:

```python

from pypdf import PdfReader

reader = PdfReader("document.pdf")
for page in reader.pages:
    text = page.extract_text()
    print(text)

```

For scanned documents, you’ll need OCR. This example uses [Nutrient DWS Processor API](https://www.nutrient.io/api/processor-api/): It sends an OCR action to `/build` and requests `json-content` output. Create a [Processor API account](https://dashboard.nutrient.io/sign_up/?product=processor), install the Python `requests` package, and set `NUTRIENT_API_KEY` to your dashboard API key before running it.

```python

import os
import requests

with open("scanned.pdf", "rb") as f:
    response = requests.post(
        "https://api.nutrient.io/build",
        headers={"Authorization": f"Bearer {os.environ['NUTRIENT_API_KEY']}"},
        files={"file": f},
        data={
            "instructions": '{"parts": [{"file": "file"}], "actions": [{"type": "ocr", "language": "english"}], "output": {"type": "json-content", "plainText": true}}'
        },
        timeout=60,
    )
response.raise_for_status()
print(response.json())

```

### Java

Java developers commonly use Apache PDFBox for text extraction. The example below uses the PDFBox 2.x API (`PDDocument.load`); on PDFBox 3.x, use `Loader.loadPDF(new File(...))` instead:

```java

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

PDDocument document = PDDocument.load(new File("document.pdf"));
PDFTextStripper stripper = new PDFTextStripper();
String text = stripper.getText(document);
System.out.println(text);
document.close();

```

For more control over layout, PDFBox also offers `PDFTextStripperByArea` to extract text from specific regions of a page — useful when processing invoices or forms with known layouts.

## Comparing PDF text extraction tools

Choose based on language, OCR requirements, and document complexity:

| Tool                         | Language        | OCR support                          | Layout handling and output              | License         |
| ---------------------------- | --------------- | ------------------------------------ | --------------------------------------- | --------------- |
| PyPDF                        | Python          | No                                   | Basic                                   | BSD             |
| PyMuPDF                      | Python          | No (add-on)                          | Good                                    | AGPL/Commercial |
| Nutrient DWS Processor API   | Any (REST)      | Yes, with an OCR action              | Structured JSON output                  | Commercial      |
| Nutrient Data Extraction API | Any (REST)      | Yes, in OCR-enabled modes            | Markdown or spatial output              | Commercial      |
| Nutrient SDK                 | iOS/Android/Web | Requires platform-specific OCR setup | Text and position APIs vary by platform | Commercial      |
| Apache PDFBox                | Java            | No (add-on)                          | Good                                    | Apache 2.0      |
| PDF.js                       | JavaScript      | No                                   | Basic                                   | Apache 2.0      |
| Tesseract                    | Python/C++      | Yes (OCR only)                       | N/A (image-based)                       | Apache 2.0      |

For a deeper comparison of Python options, see our [PyMuPDF vs. Nutrient guide](https://www.nutrient.io/blog/extract-text-from-pdf-pymupdf.md). For JavaScript, our [complete guide to PDF.js](https://www.nutrient.io/blog/complete-guide-to-pdfjs.md) covers the PDF.js approach in detail.

## Handling scanned PDFs with OCR

Not all PDFs contain selectable text. Scanned documents store pages as images, so you need optical character recognition (OCR) to extract text from them. Common OCR approaches include [Tesseract](https://www.nutrient.io/blog/how-to-use-tesseract-ocr-in-python.md) for open source workflows and [Nutrient DWS Processor API](https://www.nutrient.io/api/processor-api/) for a hosted OCR and extraction workflow. Our [automated PDF OCR workflows guide](https://www.nutrient.io/blog/how-to-create-automated-pdf-ocr-workflows/) walks through setting up batch processing for scanned documents. If you’re working with C#, see our guide on [OCR for images and PDFs in C#](https://www.nutrient.io/blog/how-to-ocr-images-and-pdfs-using-csharp/).

## When to use the Data Extraction API

[Nutrient Data Extraction API](https://www.nutrient.io/api/data-extraction-api/) is a separate option for applications that need document content as Markdown or structured data. It uses different endpoints and instructions from the Processor API example.

For whole-document Markdown, follow the [Markdown extraction guide](https://www.nutrient.io/guides/dws-data-extraction/parsing/extract-markdown.md). It sends a document to `/extraction/parse` and reads `output.markdown` from the response. Use `text` mode for PDFs with an existing text layer, or `structure` mode for scans that need OCR. The [processing modes guide](https://www.nutrient.io/guides/dws-data-extraction/parsing/processing-modes.md) explains the options.

To try this workflow, [sign up for Data Extraction](https://dashboard.nutrient.io/sign_up/?product=data-extraction) and follow its API key setup. Use the Processor API signup linked with the Python example to run the `/build` request.

## Conclusion

PDF text extraction comes down to two things: how PDFs store text internally, and which tool fits your language and workflow. Whether you use [Python](https://www.nutrient.io/blog/extract-text-from-pdf-using-python.md), [JavaScript](https://www.nutrient.io/blog/how-to-extract-text-from-a-pdf-using-javascript/), Java, or the Nutrient SDK on mobile, the core challenge is the same — PDFs store rendering commands, not structured text. Use the SDK’s text APIs for extraction inside a viewer, the Processor API for the OCR and JSON workflow shown here, or the Data Extraction API for whole-document Markdown. Scanned PDFs need an OCR step; the SDK text methods shown here read an existing text layer. Text extraction also powers [PDF text comparison](https://www.nutrient.io/sdk/text-comparison/) for identifying differences between document versions. For help choosing between extraction platforms, see our [evidence-based guide to evaluating document AI platforms](https://www.nutrient.io/blog/best-document-ai-platforms.md).

## FAQ

#### Why is extracting text from PDFs so difficult?

PDFs are designed for visual consistency rather than text extraction. They store rendering commands (where to draw glyphs on a page) instead of structured text with paragraphs and whitespace. Extracting readable text requires heuristics to reconstruct word spacing, line breaks, and reading order from these low-level drawing instructions.

#### How do I extract text from a PDF in Python?

Use PyPDF for basic extraction (`PdfReader("file.pdf").pages[0].extract_text()`) or evaluate PyMuPDF on the same documents. For scanned pages, use Nutrient DWS Processor API with an OCR action. See our [Python PDF text extraction tutorial](https://www.nutrient.io/blog/extract-text-from-pdf-using-python.md) for complete code examples.

#### How do I extract text from a PDF in JavaScript?

Use PDF.js to parse the PDF and retrieve text content from each page. Our [guide to extracting text with PDF.js](https://www.nutrient.io/blog/how-to-extract-text-from-a-pdf-using-javascript/) walks through the implementation step by step. Nutrient Web SDK also provides the `textLinesForPageIndex` API for client-side extraction.

#### How do I extract text from a scanned PDF?

Scanned PDFs store pages as images, so you need optical character recognition (OCR) to extract text. [Tesseract](https://www.nutrient.io/blog/how-to-use-tesseract-ocr-in-python.md) is a popular open source option, while Nutrient DWS Processor API lets you include an OCR action in a hosted extraction request. The Data Extraction API also supports scans when you choose an OCR-enabled mode such as `structure`.

#### What is the best library for PDF text extraction?

It depends on your language and requirements. For Python, compare PyPDF and PyMuPDF on your documents. Apache PDFBox is an option for Java, and PDF.js runs in browsers. For a hosted workflow, Nutrient’s Processor and Data Extraction APIs accept REST requests from any language; choose based on the output you need.

#### How does Nutrient handle PDF text extraction?

Nutrient SDK text APIs read text inside iOS, Android, and Web applications. The DWS Processor API example in this post combines OCR with JSON extraction through `/build`. The Data Extraction API uses `/extraction/parse` for Markdown or spatial output, with OCR support determined by the processing mode.

#### Can I extract text from a password-protected PDF?

Yes, if you have the password. Most extraction libraries (PyPDF, PDFBox, Nutrient SDK) accept a password parameter when opening the document. Without the correct password, extraction will fail — this is by design to protect the document owner’s content.

#### How do I preserve the original layout when extracting text?

Layout preservation depends on the tool. PyMuPDF and the Nutrient SDK do well at maintaining reading order and paragraph structure. For tabular data, use an output format that represents rows and cells. Check the results against your source documents. See our [PDF data extraction developer guide](https://www.nutrient.io/blog/pdf-data-extraction-developer-guide.md) for advanced techniques.

#### What is the difference between text extraction and OCR?

Text extraction reads the text data already embedded in a PDF’s content streams — it works on PDFs created from digital sources (Word documents, webpages, etc.). Optical character recognition (OCR) converts images of text into machine-readable characters — it’s needed for scanned documents, photographs, or PDFs where text was rasterized into images.

## Related

**Python text extraction**: [Parse PDFs with Python (PyPDF tutorial)](https://www.nutrient.io/blog/extract-text-from-pdf-using-python.md), [extract text from PDFs with PyMuPDF](https://www.nutrient.io/blog/extract-text-from-pdf-pymupdf.md), [top 10 ways to generate PDFs in Python](https://www.nutrient.io/blog/top-10-ways-to-generate-pdfs-in-python.md)

**JavaScript text extraction**: [Extract text from a PDF using JavaScript](https://www.nutrient.io/blog/how-to-extract-text-from-a-pdf-using-javascript/), [complete guide to PDF.js](https://www.nutrient.io/blog/complete-guide-to-pdfjs.md), [JavaScript PDF libraries compared](https://www.nutrient.io/blog/javascript-pdf-libraries.md)

**OCR and scanned PDFs**: [Use Tesseract OCR in Python](https://www.nutrient.io/blog/how-to-use-tesseract-ocr-in-python.md), [automated PDF OCR workflows](https://www.nutrient.io/blog/how-to-create-automated-pdf-ocr-workflows/), [OCR images and PDFs in C#](https://www.nutrient.io/blog/how-to-ocr-images-and-pdfs-using-csharp/)

**Data extraction**: [PDF data extraction developer guide](https://www.nutrient.io/blog/pdf-data-extraction-developer-guide.md), [best document AI platforms: an evaluation guide](https://www.nutrient.io/blog/best-document-ai-platforms.md)

**Document conversion**: [Convert PDF to JPG using Python](https://www.nutrient.io/blog/how-to-convert-pdf-to-jpg-using-python/), [build an HTML5 PDF viewer](https://www.nutrient.io/blog/how-to-build-an-html5-pdf-viewer/)
---

## 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)
- [Adobe Pdf Embed Api Alternatives](/blog/adobe-pdf-embed-api-alternatives.md)
- [Adobe Pdf Services Api Alternatives](/blog/adobe-pdf-services-api-alternatives.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)
- [Automation Platform](/blog/automation-platform.md)
- [Azure Document Intelligence Alternatives](/blog/azure-document-intelligence-alternatives.md)
- [schema.py.](/blog/bank-statement-to-excel.md)
- [Barcode Ocr](/blog/barcode-ocr.md)
- [Best Ai Document Workflow Platforms](/blog/best-ai-document-workflow-platforms.md)
- [Best Csharp Pdf Library](/blog/best-csharp-pdf-library.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 Healthcare Workflow Software Compared](/blog/best-healthcare-workflow-software-compared.md)
- [Best Invoice Data Extraction Apis](/blog/best-invoice-data-extraction-apis.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 Accessibility Apis](/blog/best-pdf-accessibility-apis.md)
- [Best Pdf Parsers For Rag](/blog/best-pdf-parsers-for-rag.md)
- [Best Pdf Processing Apis](/blog/best-pdf-processing-apis.md)
- [Best Pdf Viewer Apis](/blog/best-pdf-viewer-apis.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)
- [or](/blog/best-vue-pdf-viewers.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)
- [Business Process Reengineering Bpr Definition](/blog/business-process-reengineering-bpr-definition.md)
- [Capex Vs Opex](/blog/capex-vs-opex.md)
- [Capital Expenditure Request Form](/blog/capital-expenditure-request-form.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)
- [Nutrient document decision: Why we built a decision model for documents](/blog/decision-model-for-documents.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 Authoring Spreadsheet Editor](/blog/document-authoring-spreadsheet-editor.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)
- [Debian/Ubuntu.](/blog/easyocr-vs-tesseract-python.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)
- [Q3 sales](/blog/excel-to-markdown-for-llms.md)
- [Extend Alternatives](/blog/extend-alternatives.md)
- [Extract Patient Data On Premises](/blog/extract-patient-data-on-premises.md)
- [Extract Tables From Complex Pdfs](/blog/extract-tables-from-complex-pdfs.md)
- [Create and activate a virtual environment (recommended).](/blog/extract-text-from-pdf-pymupdf.md)
- [app.py](/blog/extract-text-from-pdf-using-python.md)
- [Stricter thresholds for fields that move money. Calibrate on your own sample.](/blog/extraction-hallucination-detection.md)
- [Fillable Pdf](/blog/fillable-pdf.md)
- [Google Document Ai Alternatives](/blog/google-document-ai-alternatives.md)
- [Handwriting Recognition Ocr Vlm](/blog/handwriting-recognition-ocr-vlm.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)
- [Using Yarn](/blog/how-to-build-a-react-word-viewer.md)
- [How To Build A Reactjs File Viewer](/blog/how-to-build-a-reactjs-file-viewer.md)
- [How To Build A Reactjs Pdf Viewer With React Pdf](/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)
- [How To Convert Pdf To Json](/blog/how-to-convert-pdf-to-json.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)
- [How To Convert Word To Pdf Using Javascript](/blog/how-to-convert-word-to-pdf-using-javascript.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 digitally sign PDFs in C# with Nutrient .NET SDK](/blog/how-to-digitally-sign-pdf-in-csharp.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 A Pdf With Vuejs](/blog/how-to-generate-a-pdf-with-vuejs.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 Pdf Api](/blog/how-to-ocr-pdf-api.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)
- [Ide Text Editors Cpp Large Scale](/blog/ide-text-editors-cpp-large-scale.md)
- [Numeric and identifier fields: exact single-block matches only.](/blog/insurance-document-extraction.md)
- [Intelligent Data Extraction](/blog/intelligent-data-extraction.md)
- [Introducing Nutrient Data Extraction API: Turn complex documents into structured, reliable data for AI](/blog/introducing-nutrient-data-extraction-api.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)
- [Keep Document Ai Private](/blog/keep-document-ai-private.md)
- [Kyc Onboarding Salesforce](/blog/kyc-onboarding-salesforce.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)
- [Llm Vs Document Parsing Api](/blog/llm-vs-document-parsing-api.md)
- [Low Code No Code Document Integrations](/blog/low-code-no-code-document-integrations.md)
- [One segment per document found, in page order:](/blog/mailroom-automation-api.md)
- [Material Requisition](/blog/material-requisition.md)
- [ICD-10-CM: letter, digit, then digit OR letter (C4A, D3A, M1A are all valid),](/blog/medical-record-extraction.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)
- [Numeric and identifier fields: exact single-block matches only.](/blog/mortgage-document-processing.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)
- [Operations Management Software](/blog/operations-management-software.md)
- [Optical Character Recognition In Scanned Pdfs](/blog/optical-character-recognition-in-scanned-pdfs.md)
- [CPU](/blog/paddleocr-python-guide.md)
- [Pdf Accessibility Checker](/blog/pdf-accessibility-checker.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 Remediation](/blog/pdf-remediation.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 Docx Editor](/blog/react-docx-editor.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)
- [Top Js Pdf Libraries](/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 Pdf Sdk Legal Review](/blog/web-pdf-sdk-legal-review.md)
- [Web Sdk Is Now Headless](/blog/web-sdk-is-now-headless.md)
- [What Are Annotations](/blog/what-are-annotations.md)
- [What Is A Tagged Pdf](/blog/what-is-a-tagged-pdf.md)
- [What Is A Vpat](/blog/what-is-a-vpat.md)
- [What Is Bpms](/blog/what-is-bpms.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)
- [Introducing WholeDoc Bench: A benchmark for parsing whole documents](/blog/wholedoc-bench-parsing-benchmark.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)
- [Workflow Analysis](/blog/workflow-analysis.md)

