---
title: "LlamaIndex vs. LangChain vs. Haystack for RAG"
canonical_url: "https://www.nutrient.io/blog/llamaindex-vs-langchain-vs-haystack/"
md_url: "https://www.nutrient.io/blog/llamaindex-vs-langchain-vs-haystack.md"
last_updated: "2026-09-21T17:29:38.857Z"
description: "Compare LlamaIndex, LangChain, and Haystack for RAG in 2026, including retrieval, agents, evaluation, deployment, and document parsing tradeoffs in practice."
---

**TL;DR**

- **LlamaIndex** — Start here when the application is centered on indexing and retrieving private data.

- **LangChain** — Start here when the application needs agents, tools, and integrations built on the LangGraph runtime.

- **Haystack** — Start here when an explicit component pipeline, evaluation, and deployment flexibility are priorities.

- **Test document parsing separately** — The configured parser affects retrieval quality when the source material includes PDFs, scans, tables, or complex layouts.

Retrieval-augmented generation (RAG) connects a large language model (LLM) to external information at query time. LlamaIndex, LangChain, and Haystack can all build that workflow, but they expose different abstractions and make different tradeoffs.

The practical difference shows up when you change the application: replace a retriever, add a tool call, or inspect a failed answer. The examples below show how each framework connects those steps. The comparison then covers evaluation, deployment, and the cost of switching.

## What each framework is for

**LlamaIndex** describes its open source framework as a way to build agents over private data. Its indexes, retrievers, query engines, and data connectors make it a natural option for retrieval-centered applications. Workflows add event-driven orchestration for agents. See the [LlamaIndex framework documentation](https://developers.llamaindex.ai/python/framework/).

**LangChain** provides standard interfaces for models, tools, retrieval, and agents. Since LangChain v1, its main Python package has focused on a high-level agent abstraction that runs on LangGraph. Retrieval components remain available for both two-step and agentic RAG. See the [LangChain v1 overview](https://docs.langchain.com/oss/python/releases/langchain-v1) and [retrieval documentation](https://docs.langchain.com/oss/python/langchain/retrieval).

**Haystack**, maintained by deepset, is an open source AI orchestration framework for agents, RAG, and multimodal search. Applications are assembled as explicit pipelines of components such as converters, retrievers, routers, prompt builders, generators, and evaluators. See the [Haystack introduction](https://docs.haystack.deepset.ai/docs/intro).

## The frameworks at a glance

| Dimension                    | LlamaIndex                                 | LangChain                                     | Haystack                                      |
| ---------------------------- | ------------------------------------------ | --------------------------------------------- | --------------------------------------------- |
| Primary abstraction          | Indexes, retrievers, and query engines     | Agents, tools, and runnable components        | Components connected in explicit pipelines    |
| RAG support                  | Retrieval-centered APIs and managed tools  | Two-step, agentic, and hybrid RAG patterns    | Modular retrieval and generation pipelines    |
| Agent support                | Workflows and agent APIs                   | High-level agents on the LangGraph runtime    | Agent and tool components                     |
| Evaluation and observability | Evaluation modules and integrations        | LangSmith tracing and evaluation              | Evaluator components and tracing integrations |
| API deployment               | Custom services or LlamaCloud              | Custom services or LangSmith Deployment       | Hayhooks or Haystack Enterprise Platform      |
| Core license                 | MIT                                        | MIT                                           | Apache-2.0                                    |
| Good starting point          | Data-intensive, retrieval-centered systems | Tool-heavy agents and mixed application flows | Explicit, inspectable production pipelines    |

The licenses in the table apply to the core open source repositories: [LlamaIndex](https://github.com/run-llama/llama_index/blob/main/LICENSE), [LangChain](https://github.com/langchain-ai/langchain/blob/master/LICENSE), and [Haystack](https://github.com/deepset-ai/haystack/blob/main/LICENSE). Managed services have separate commercial terms.

## Architecture and programming model

LlamaIndex offers high-level retrieval defaults. A developer can load documents, build a vector index, and create a query engine with a small amount of code. The framework also exposes lower-level retrievers, storage integrations, and Workflows when the application needs more control.

LangChain v1 centers on agents built on LangGraph, while `langchain-core` provides composable interfaces for prompts, models, tools, and runnable sequences. Legacy chain APIs moved to the separate `langchain-classic` package, so older examples that import chains from `langchain.chains` are no longer current.

Haystack treats the pipeline as the main application object. Components declare their inputs and outputs, and the pipeline connects them as a directed graph. This structure makes intermediate stages visible and allows teams to test or replace individual components.

## A minimal RAG pipeline in each framework

The following examples use the same `data.txt` source, OpenAI embeddings, and question. They demonstrate programming style rather than performance because default chunking, retrieval parameters, and model behavior still differ.

Before running an example, use Python 3.10 or later, set `OPENAI_API_KEY`, and create a UTF-8 text file named `data.txt`. Install only the packages for the framework being tested:

```bash

python -m pip install llama-index
python -m pip install langchain langchain-community langchain-openai langchain-text-splitters
python -m pip install haystack-ai

```

**LlamaIndex — High-level retrieval defaults:**

```py

from llama_index.core import Settings, SimpleDirectoryReader, VectorStoreIndex
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI

Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
Settings.llm = OpenAI(model="gpt-4.1-mini")

documents = SimpleDirectoryReader(input_files=["data.txt"]).load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()

print(query_engine.query("What changed in Q2 revenue?"))

```

**LangChain — Composable runnable pipeline:**

```py

from langchain_community.document_loaders import TextLoader
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

documents = TextLoader("data.txt", encoding="utf-8").load()
splits = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
).split_documents(documents)
retriever = InMemoryVectorStore.from_documents(
    splits,
    OpenAIEmbeddings(model="text-embedding-3-small"),
).as_retriever()

def format_documents(retrieved_documents):
    return "\n\n".join(document.page_content for document in retrieved_documents)

prompt = ChatPromptTemplate.from_template(
    "Answer from the context only:\n\n{context}\n\nQuestion: {question}"
)
chain = (
    {
        "context": retriever | format_documents,
        "question": RunnablePassthrough(),
    }
    | prompt
    | ChatOpenAI(model="gpt-4.1-mini")
    | StrOutputParser()
)

print(chain.invoke("What changed in Q2 revenue?"))

```

**Haystack — Explicit component pipeline:**

This example uses Haystack 3.x. Its [migration guide](https://github.com/deepset-ai/haystack/blob/main/MIGRATION.md) replaces the removed `OpenAIGenerator` with `OpenAIChatGenerator`.

```py

from pathlib import Path

from haystack import Pipeline, Document
from haystack.components.builders import PromptBuilder
from haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.preprocessors import DocumentSplitter
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever

store = InMemoryDocumentStore(embedding_similarity_function="cosine")
documents = [Document(content=Path("data.txt").read_text(encoding="utf-8"))]
documents = DocumentSplitter(
    split_by="word",
    split_length=1000,
    split_overlap=200,
).run(documents=documents)["documents"]
documents = OpenAIDocumentEmbedder(
    model="text-embedding-3-small"
).run(documents=documents)["documents"]
store.write_documents(documents)

prompt_template = """
Answer from the context only.

Context:
{{ documents | map(attribute="content") | join("\n\n") }}

Question: {{ query }}
"""

pipeline = Pipeline()
pipeline.add_component(
    "query_embedder",
    OpenAITextEmbedder(model="text-embedding-3-small"),
)
pipeline.add_component(
    "retriever",
    InMemoryEmbeddingRetriever(document_store=store),
)
pipeline.add_component("prompt_builder", PromptBuilder(template=prompt_template))
pipeline.add_component("llm", OpenAIChatGenerator(model="gpt-4.1-mini"))
pipeline.connect("query_embedder.embedding", "retriever.query_embedding")
pipeline.connect("retriever.documents", "prompt_builder.documents")
pipeline.connect("prompt_builder.prompt", "llm.messages")

question = "What changed in Q2 revenue?"
result = pipeline.run(
    {
        "query_embedder": {"text": question},
        "prompt_builder": {"query": question},
    }
)

print(result["llm"]["replies"][0].text)

```

## Agents and orchestration

LangChain v1 provides a high-level agent API on the LangGraph runtime. LangGraph adds state, durable execution, streaming, persistence, and human-in-the-loop controls for workflows that need them.

LlamaIndex offers agent APIs and event-driven Workflows that integrate with its data and retrieval features. Haystack provides an `Agent` component and tool abstractions that can run inside a pipeline.

## Evaluation, observability, and deployment

All three can be operated in production, but they package the supporting tools differently.

- **LlamaIndex** — Includes evaluation modules and observability integrations. LlamaCloud adds managed parsing, ingestion, indexing, and a hosted retrieval API applications can call directly instead of self-hosting that layer.

- **LangChain** — Integrates with LangSmith for tracing, evaluation, and agent deployment. LangSmith’s tracing SDK also works with the other two frameworks for teams standardizing on one observability tool.

- **Haystack** — Includes statistical and model-based [evaluator components](https://docs.haystack.deepset.ai/docs/evaluation). It supports [tracing integrations](https://docs.haystack.deepset.ai/docs/tracing), while [Hayhooks](https://docs.haystack.deepset.ai/docs/hayhooks) can expose pipelines as REST APIs.

Before choosing a deployment option, check how it handles persistent state, access control, failed requests, and trace retention. These requirements extend beyond the framework’s pipeline API.

## Ecosystem, managed services, and licensing

The three core frameworks can be self-hosted under their open source licenses; infrastructure and model usage still have costs. Their surrounding managed products include [LlamaCloud](https://developers.api.llamaindex.ai/getting-started/), [LangSmith](https://docs.langchain.com/langsmith/deployment), and [Haystack Enterprise Platform](https://www.deepset.ai/solutions/enterprise), which adds a visual pipeline builder and managed deployment on top of the open source framework. Each product has its own pricing, deployment options, and service limits, so compare those separately from the open source license.

LangChain and LlamaIndex both maintain broad integration catalogs. Haystack also supports model providers, document stores, retrievers, evaluators, and deployment integrations. Count the integrations the project will actually use instead of choosing from the size of a catalog.

## How to choose

Use the main requirement to narrow the shortlist:

| If the main requirement is…                           | Start by evaluating…         |
| ----------------------------------------------------- | ---------------------------- |
| High-level indexing and retrieval over private data   | LlamaIndex                   |
| Agent and tool orchestration on LangGraph             | LangChain                    |
| An explicit, inspectable component pipeline           | Haystack                     |
| Managed parsing and ingestion in the LlamaIndex stack | LlamaCloud                   |
| Tracing and evaluation across mixed frameworks        | LangSmith                    |
| Visual pipeline development and managed deployment    | Haystack Enterprise Platform |

Treat this as a starting point, not a verdict. Build the same small workflow in the leading options. Then evaluate it with representative documents and queries.

### What switching later costs

Plain-text prompts, application-owned schemas, and evaluation datasets are easier to reuse than framework-specific objects. Prompt templates and structured-output schemas may still need adaptation. Retrieval concepts also map across frameworks, but their implementations need to be rewritten against different interfaces. Orchestration code is more coupled because a LangGraph state graph, LlamaIndex Workflow, and Haystack pipeline represent control flow differently.

To limit that coupling, keep domain logic in plain Python functions and use framework components as adapters around it. Additionally, store prompts and evaluation data outside framework-specific objects when practical.

## Why document parsing needs a separate test

The framework coordinates ingestion and retrieval, but it doesn’t determine the quality of every configured parser. LlamaIndex offers its first-party LlamaParse service, while LangChain document loaders and Haystack converters can use several built-in or third-party parsing tools. An accuracy number for an unqualified framework would therefore be misleading.

Parsing errors propagate through the rest of a RAG pipeline. Lost reading order, flattened tables, or missing optical character recognition (OCR) text can produce incomplete chunks and poor retrieval, even when the framework is configured correctly.

Use a representative test set to compare the actual parser configuration. Measure structure preservation, retrieval relevance, answer faithfulness, latency, and cost rather than attributing parsing accuracy to the orchestration framework.

For a reproducible extraction evaluation example, see our [benchmark methodology](https://www.nutrient.io/blog/pdf-extraction-benchmark-opendataloader-bench.md).

## Where Nutrient fits

Nutrient Data Extraction API is one parsing option for document-heavy RAG pipelines. Its [spatial output](https://www.nutrient.io/guides/dws-data-extraction/parsing.md) contains typed elements with coordinates, detection confidence, and page references. A separate schema-based extraction request can return [source citations and confidence signals](https://www.nutrient.io/guides/dws-data-extraction/extract/citations-and-confidence.md) for individual fields.

The managed API accepts PDFs, scans, images, and Office files. To use its output in any of the three frameworks, map the extracted text and metadata into that framework’s document objects before indexing.

### Try it on a document

Install the Python `requests` package with `python -m pip install requests`, save a PDF as `document.pdf`, and replace `YOUR_API_KEY` with a Nutrient API key. The following request parses the PDF into spatial elements:

```py

import json

import requests

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

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

```

[Get an API key](https://dashboard.nutrient.io/sign_up/?product=data-extraction) and follow the [RAG ingestion guide](https://www.nutrient.io/guides/dws-data-extraction/examples/build-rag-ingestion-pipeline.md) to connect the output to an existing pipeline.

## Conclusion

Build one representative workflow in your two leading options. Inspect the retrieved chunks and failed answers. Then compare latency, cost, and the work needed to change a pipeline step. For document-heavy applications, test the parser on the same files before committing to the rest of the stack.

## FAQ

#### Which RAG framework is easiest to get started with?

The LlamaIndex example above uses fewer lines because its query engine supplies more defaults. That is a property of these examples, not a measure of development effort across projects. The easiest option for a production project still depends on existing integrations, deployment requirements, and team experience.

#### Should I use LlamaIndex or LangChain?

Use LlamaIndex when data ingestion, indexing, and retrieval are central. Evaluate LangChain when the application needs agents and tools across several systems.

#### Can you use LlamaIndex, LangChain, and Haystack together?

Yes, but combine them only when a specific capability justifies the extra dependencies and operational complexity. Keep the boundary explicit: Pass plain text and metadata between components, and adapt each framework’s document types at that boundary.

#### Which RAG framework is best for production?

There is no universal winner. Compare the frameworks against the project’s hosting, security, observability, latency, evaluation, and maintenance requirements. Use the same documents and queries when testing each implementation.
---

## Related pages

- [The business case for accessibility: Five ways it drives enterprise value](/blog/5-ways-accessibility-drives-enterprise-value.md)
- [Accessibility Untangled Why It Matters Guide](/blog/accessibility-untangled-why-it-matters-guide.md)
- [Advanced Techniques For React Native Ui Components](/blog/advanced-techniques-for-react-native-ui-components.md)
- [`vector_store` holds your indexed documents (see the multimodal RAG post](/blog/agentic-rag.md)
- [How to build an AI agent for contract redlining against a compliance playbook](/blog/ai-contract-redlining-compliance-playbook.md)
- [Ai Document Automation Extraction To Action](/blog/ai-document-automation-extraction-to-action.md)
- [Ai 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)
- [Amazon Textract Alternatives](/blog/amazon-textract-alternatives.md)
- [Start (clears any prior buffer), navigate the document, then stop into a file.](/blog/android-faster-pdf-rendering.md)
- [Android Pdf Out Of Memory Handling](/blog/android-pdf-out-of-memory-handling.md)
- [Angular File Viewer Pdf Image Office Files](/blog/angular-file-viewer-pdf-image-office-files.md)
- [Approval Workflow Software](/blog/approval-workflow-software.md)
- [Approvals Matrix](/blog/approvals-matrix.md)
- [Auto Tagging And Document Accessibility In Dotnet Sdk](/blog/auto-tagging-and-document-accessibility-in-dotnet-sdk.md)
- [Simple PII redaction.](/blog/automated-pii-removal.md)
- [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 Viewer](/blog/document-viewer.md)
- [Document Watermarking](/blog/document-watermarking.md)
- [Emerging threats: Your logging system may be an agentic threat vector](/blog/emerging-threats-your-logging-system.md)
- [Extend Alternatives](/blog/extend-alternatives.md)
- [Extract Patient Data On Premises](/blog/extract-patient-data-on-premises.md)
- [app.py](/blog/extract-text-from-pdf-using-python.md)
- [Fillable Pdf](/blog/fillable-pdf.md)
- [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)
- [or](/blog/how-to-convert-html-to-pdf-using-react.md)
- [How To Convert Html To Pdf Using Wkhtmltopdf And Csharp](/blog/how-to-convert-html-to-pdf-using-wkhtmltopdf-and-csharp.md)
- [or](/blog/how-to-convert-html-to-pdf-using-wkhtmltopdf-and-python.md)
- [How To Convert Html To Pptx](/blog/how-to-convert-html-to-pptx.md)
- [Quarterly report](/blog/how-to-convert-pdf-to-markdown-using-python.md)
- [How To Convert Word To Pdf In Nodejs](/blog/how-to-convert-word-to-pdf-in-nodejs.md)
- [or](/blog/how-to-create-a-react-js-signature-pad.md)
- [How To Create Pdfs With React To Pdf](/blog/how-to-create-pdfs-with-react-to-pdf.md)
- [How To Edit Pdfs Using Ios Pdf Library](/blog/how-to-edit-pdfs-using-ios-pdf-library.md)
- [How To Embed A Pdf Viewer In Your Website](/blog/how-to-embed-a-pdf-viewer-in-your-website.md)
- [How To Extract Tables From Pdf And Images](/blog/how-to-extract-tables-from-pdf-and-images.md)
- [How To Generate Pdf From Html With Nodejs](/blog/how-to-generate-pdf-from-html-with-nodejs.md)
- [base_url tells WeasyPrint where to resolve relative asset paths](/blog/how-to-generate-pdf-reports-from-html-in-python.md)
- [How To Merge Pdfs Using Javascript](/blog/how-to-merge-pdfs-using-javascript.md)
- [How To Ocr Pdfs In Linux](/blog/how-to-ocr-pdfs-in-linux.md)
- [How To Print Pdf In Csharp](/blog/how-to-print-pdf-in-csharp.md)
- [How To Programmatically Create And Fill Pdf Form In Angular](/blog/how-to-programmatically-create-and-fill-pdf-form-in-angular.md)
- [Open an image.](/blog/how-to-use-tesseract-ocr-in-python.md)
- [From an HTML string.](/blog/html-in-pdf-format.md)
- [Html To Pdf In Javascript](/blog/html-to-pdf-in-javascript.md)
- [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 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)
- [Swift Package Manager](/blog/mobile-pdf-sdk.md)
- [`elements` come from your document parser — each has a type and content.](/blog/multimodal-rag.md)
- [Nutrient Flutter 6 Bindings Api](/blog/nutrient-flutter-6-bindings-api.md)
- [Nutrient Flutter Bindings Architecture](/blog/nutrient-flutter-bindings-architecture.md)
- [Nutrient Vs Conga Composer](/blog/nutrient-vs-conga-composer.md)
- [Online Document Viewer](/blog/online-document-viewer.md)
- [Open Pdf In Your Web App](/blog/open-pdf-in-your-web-app.md)
- [PDF accessibility for developers: Meeting WCAG 2.2, Section 508, and PDF/UA with an SDK](/blog/pdf-accessibility.md)
- [Extract data from PDF files: A developer guide to structured data from PDFs and scans](/blog/pdf-data-extraction-developer-guide.md)
- [Pdf Extraction Benchmark Opendataloader Bench](/blog/pdf-extraction-benchmark-opendataloader-bench.md)
- [Pdf Extraction Document Case Studies](/blog/pdf-extraction-document-case-studies.md)
- [Pdf Page Labels](/blog/pdf-page-labels.md)
- [Pdf Sdk Compliance Security Checklist](/blog/pdf-sdk-compliance-security-checklist.md)
- [Pdf Sdk Performance Benchmark](/blog/pdf-sdk-performance-benchmark.md)
- [Pdf Ua Compliance Guide](/blog/pdf-ua-compliance-guide.md)
- [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)
- [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)

