---
title: "Excel to Markdown for LLMs without losing structure"
canonical_url: "https://www.nutrient.io/blog/excel-to-markdown-for-llms/"
md_url: "https://www.nutrient.io/blog/excel-to-markdown-for-llms.md"
last_updated: "2026-10-27T18:24:49.189Z"
description: "Convert Excel to Markdown for LLMs and RAG without losing tables or headings. How Nutrient reads workbooks cell by cell and splits each sheet into regions."
---

<!-- The example output is illustrative and follows the documented output format (checked 30 September 2026). -->

**TL;DR**

- Excel-to-Markdown conversion usually flattens a sheet into one grid or renders it as an image and runs optical character recognition (OCR) first.

- Nutrient Data Extraction API now reads XLSX workbooks cell by cell and returns tables, headings, and notes as separate sections.

- In an internal test, it converted workbooks 76 times faster than the previous render-and-OCR path.

- It opened all 408 files in a test corpus built from the Apache POI test suite.

A spreadsheet looks like the most structured file a pipeline will ever receive. It has a grid, named sheets, and often tables that are explicitly defined with names and ranges. Even so, many retrieval-augmented generation (RAG) pipelines lose data in Excel without noticing. The losses come from the content around the cells: the title above a table, the note in cell A1, the blank spacer row, and the second table further down the same sheet.

Nutrient Data Extraction API now reads XLSX workbooks from their cells. Nutrient engineer Costinel Mitrea built the change and summed it up: “Workbooks are now read as workbooks, not as pictures of workbooks.” This post covers what that means for the Markdown a large language model (LLM) receives.

## Why spreadsheets break LLM pipelines

A typical business workbook isn’t one table. A single sheet often holds:

- A title in a merged cell across the top

- A note such as “All amounts in USD thousands”

- Two or three tables, separated by blank spacer rows

- Totals, footnotes, and a comment column someone added later

A person reads that layout at a glance. A converter has to decide where one table ends and the next begins, which row is the header, and whether a blank cell means zero, unknown, or nothing at all.

Each wrong decision ends up in the model’s context. A merged banner read as a data row pushes the real header row down, so every column gets the wrong name. A blank cell exported as `NaN` looks like a value. A whole number exported as `412.0` looks like a measurement with a decimal part.

Large sheets add a second problem. A converter that renders pages turns a long sheet into a long stack of images, and every image has to be recognized before any text comes back.

## Two common approaches, and what each loses

Most Excel-to-Markdown converters take one of two routes. Both return text, but neither returns the layout a person sees.

### Render and OCR

The first approach treats a workbook like a scanned document. The converter paginates each sheet as if printing it, renders every page as an image, and runs OCR on the pixels.

This is what the Data Extraction API did with spreadsheets until this change, and it still does for Excel formats other than XLSX. Sheets were rendered at 200 dots per inch (DPI) and sent through the same recognition pipeline as scans.

Text comes back, but rendering discards the structure stored in the file: sheet names, the cell grid, merged ranges, defined tables, and number formats. Table boundaries then have to be rediscovered from pixels. Wide sheets are cut at the edges of the printed page, so one table can arrive in two halves.

### Data frame conversion

The second approach loads each sheet into a data frame and prints it as a table. MarkItDown, Microsoft’s open source converter, handles Excel files this way. Its converter reads every sheet with `pandas` and presents “each sheet … as a separate Markdown table.”

That keeps the cells, but it inherits the data frame defaults. MarkItDown’s issue tracker documents the side effects, and all four items below were still open on 30 September 2026:

- Blank cells become `NaN` ([#183](https://github.com/microsoft/markitdown/issues/183) and [#2498](https://github.com/microsoft/markitdown/issues/2498)).

- Literal text such as “NA” or “NULL” also becomes `NaN` ([#2498](https://github.com/microsoft/markitdown/issues/2498)).

- One blank cell makes its whole column numeric with decimals, so `412` renders as `412.0` ([#2484](https://github.com/microsoft/markitdown/issues/2484)).

- Worksheets marked hidden are included in the output ([pull request #2456](https://github.com/microsoft/markitdown/pull/2456)).

Because each sheet becomes one table, the title, the note, and both tables on a sheet also end up as rows of the same grid.

## How the Data Extraction API reads a workbook

The new path skips rendering and OCR and reads values, merged ranges, and table definitions from the file itself. Each visible sheet becomes one page of output, which is then cut into the regions a person would see: tables, the titles above them, and standalone lines of text.

The cuts follow a few rules:

- **Empty rows first, then empty columns.** A completely empty row that crosses the sheet is a boundary. Inside each strip, a completely empty column is the next boundary.

- **Defined tables are never cut.** A table defined in Excel keeps its full range, whatever the blank rows inside it suggest.

- **Narrow blank columns are gutters.** A blank column narrower than its neighbors counts as spacing inside one table, not as a gap between two.

- **Matching strips go back together.** Two strips a blank column would separate, covering exactly the same rows, are rejoined.

- **Merged banners become headings.** A merged title directly above a table becomes a heading, and the real header row below it becomes header cells.

Regions are then read in order, by starting row and then by column. One or two lone values become paragraphs, and three or more become a list. A label above many values becomes a one-column table.

The gutter and rejoin rules fix failures in an earlier version. That version split an ordinary calendar into a header table, five stray paragraphs, and two unrelated grids.

The regions go into the same document structure the API builds for PDFs. Parse and extract return the same JSON elements and Markdown for a workbook as for a PDF, so one schema and one pipeline cover both.

## What the Markdown looks like

Take this example workbook, which has one visible sheet with a note, two titled tables, a blank cell, and a literal “NA,” plus one hidden sheet:

```text

Workbook: q3-report.xlsx

Sheet "Q3 sales"
  A1        All amounts in USD thousands. Figures are unaudited.
  A3:E3     Q3 2026 regional sales                    (merged title)
  A4:E7     Region | Orders | Revenue | Returns | Status   (Excel table)
            North  | 412    | 1284.5  | 12      | On track
            South  |        | 978.0   | 9       | NA
            East   | 388    | 1102.3  | 15      | On track
  A9:C9     Top products                              (merged title)
  A10:C12   Product  | Units | Share
            Widget A | 1020  | 34%
            Widget B | 870   | 29%

Sheet "Internal" (hidden)

```

The Markdown below illustrates the output format for that workbook; it isn’t a captured response:

```markdown

# Q3 sales

All amounts in USD thousands. Figures are unaudited.

## Q3 2026 regional sales

<table>
 <tr><th>Region</th><th>Orders</th><th>Revenue</th><th>Returns</th><th>Status</th></tr>
 <tr><td>North</td><td>412</td><td>1284.5</td><td>12</td><td>On track</td></tr>
 <tr><td>South</td><td></td><td>978.0</td><td>9</td><td>NA</td></tr>
 <tr><td>East</td><td>388</td><td>1102.3</td><td>15</td><td>On track</td></tr>
</table>

## Top products

<table>
 <tr><th>Product</th><th>Units</th><th>Share</th></tr>
 <tr><td>Widget A</td><td>1020</td><td>34%</td></tr>
 <tr><td>Widget B</td><td>870</td><td>29%</td></tr>
</table>

```

Compared with a one-grid conversion, the output changes in these ways:

- The sheet name becomes the top-level heading.

- The note in A1 becomes a paragraph instead of the first row of a table.

- Each merged title is a heading, with the real header row as header cells below it.

- The two tables stay separate.

- The blank cell stays blank, and “NA” stays “NA.”

- `34%` comes back as displayed, not as `0.34`.

- The hidden sheet doesn’t appear.

## Speed and reliability

Reading cells is far less work than rendering pages. In internal tests in September 2026, the same 40 workbooks ran with the same script on the same machine, before and after the change. They converted 76 times faster than on the previous render-and-OCR path. Both runs used debug builds, so the ratio matters more than the absolute times.

Three of those 40 workbooks used to hit a two-minute timeout and never convert. They now finish in seconds.

The robustness tests used a larger corpus of 408 workbooks: the spreadsheet files from the Apache POI test suite, plus 14 generated files. All 408 converted with zero failures, including files saved in the Strict Open XML format. Across 987 sheets, the conversion produced 1,582 tables, 90 headings, and 465 paragraphs.

The work also fixed two file-opening bugs. Damaged packages are now repaired and read again. Table styles that lack optional flags no longer fail the load, which mostly affected files written by tools other than Excel.

These are spreadsheet results. For PDF accuracy, see the [Data Extraction API benchmarks](https://www.nutrient.io/api/data-extraction-api/benchmarks/).

## What it doesn’t do yet

The following limits apply to the current output:

- **Only XLSX takes the new path.** Other Excel formats, such as XLS, are still accepted and go through the previous conversion path.

- **Hidden sheets aren’t converted.** This matches what printing the workbook shows. A workbook that keeps its source data on a hidden sheet returns only the visible sheets.

- **Cells return displayed values.** Each cell carries the text Excel shows, not the stored number or the formula. A cell that holds 1.25 formatted to one decimal comes back as 1.3.

- **Side-by-side tables of identical height stay merged.** Two tables next to each other that cover exactly the same rows come back as one table.

## Convert Excel to Markdown with one request

Send the workbook to the parse endpoint and request Markdown output:

### curl

```shell

curl -X POST https://api.nutrient.io/extraction/parse \
  -H "Authorization: Bearer your_api_key_goes_here" \
  -F "file=@q3-report.xlsx" \
  -F 'instructions={"output":{"format":"markdown"}}'

```

### Python

```python

import requests

response = requests.post(
    "https://api.nutrient.io/extraction/parse",
    headers={"Authorization": "Bearer your_api_key_goes_here"},
    files={"file": open("q3-report.xlsx", "rb")},
    data={"instructions": '{"output":{"format":"markdown"}}'},
)

print(response.json()["output"]["markdown"])

```

The Markdown string is in the response’s `output.markdown` field, with one section per visible sheet. For typed fields instead of Markdown, send the workbook to the extract endpoint with a JSON Schema, the same way as a PDF.

Each sheet arrives with headings above its tables and notes, so the heading-based chunking used for PDFs works for workbooks too. A folder that mixes PDFs, scans, and spreadsheets can go through one parser and one chunking strategy. The [RAG ingestion example](https://www.nutrient.io/guides/dws-data-extraction/examples/build-rag-ingestion-pipeline.md) walks through that pipeline with PDFs.

## Conclusion

A spreadsheet holds more structure than its grid of cells, and a converter that keeps that structure gives an LLM cleaner context. Nutrient Data Extraction API now reads XLSX workbooks cell by cell. Titles and notes come back as headings and paragraphs, separate tables stay separate, and blank cells stay blank.

In internal tests, the cell-by-cell path was 76 times faster than the previous render-and-OCR path. The same parser, schema, and chunking strategy now cover PDFs and spreadsheets.

Check the limits against your own files. Only XLSX takes the new path, hidden sheets aren’t converted, and cells return displayed values rather than stored numbers or formulas. You can test the conversion on your own workbooks with [5,000 free credits every month](https://dashboard.nutrient.io/sign_up/?product=data-extraction).

## FAQ

#### How do I convert Excel to Markdown for an LLM?

Send the workbook to Nutrient Data Extraction API’s parse endpoint with `output.format` set to `markdown`. The response’s `output.markdown` field holds one section per visible sheet. Each section has headings, paragraphs, and tables that a chunker can split on headings.

#### Does the API keep merged cells and headers?

Yes. A merged title directly above a table becomes a heading, and the real header row below it becomes header cells. Tables defined in Excel keep their full range.

#### Are hidden sheets included?

No. Hidden sheets aren’t converted, which matches what printing the workbook shows.

#### Which Excel formats are supported?

XLSX workbooks are read cell by cell. Other Excel formats, such as XLS, are still accepted and go through the previous conversion path. The [supported file types guide](https://www.nutrient.io/guides/dws-data-extraction/file-types.md) lists every accepted format. CSV files aren’t a listed input type.

## Related reading

- [Data Extraction API for Excel](https://www.nutrient.io/api/data-extraction-api/excel/)

- [Nutrient vs. MarkItDown: PDF and Excel to Markdown compared](https://www.nutrient.io/api/data-extraction-api/vs/markitdown/)

- [Extract data from spreadsheets](https://www.nutrient.io/guides/dws-data-extraction/parsing/spreadsheets.md)

- [Build a RAG ingestion pipeline](https://www.nutrient.io/guides/dws-data-extraction/examples/build-rag-ingestion-pipeline.md)
---

## Related pages

- [The business case for accessibility: Five ways it drives enterprise value](/blog/5-ways-accessibility-drives-enterprise-value.md)
- [Accessibility Untangled Why It Matters Guide](/blog/accessibility-untangled-why-it-matters-guide.md)
- [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)
- [Azure Document Intelligence Alternatives](/blog/azure-document-intelligence-alternatives.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 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)
- [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)
- [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 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)
- [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)
- [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)
- [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)
- [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 Pdf From Html With Nodejs](/blog/how-to-generate-pdf-from-html-with-nodejs.md)
- [How to generate PDFs in C# with Nutrient .NET SDK](/blog/how-to-generate-pdf-in-csharp.md)
- [base_url tells WeasyPrint where to resolve relative asset paths](/blog/how-to-generate-pdf-reports-from-html-in-python.md)
- [How To Merge Pdfs Using Javascript](/blog/how-to-merge-pdfs-using-javascript.md)
- [How To Ocr Pdfs In Linux](/blog/how-to-ocr-pdfs-in-linux.md)
- [How To Print Pdf In Csharp](/blog/how-to-print-pdf-in-csharp.md)
- [How To Programmatically Create And Fill Pdf Form In Angular](/blog/how-to-programmatically-create-and-fill-pdf-form-in-angular.md)
- [C# barcode scanner: How to scan and read 1D barcodes and QR codes](/blog/how-to-scan-barcodes-in-csharp.md)
- [Open an image.](/blog/how-to-use-tesseract-ocr-in-python.md)
- [From an HTML string.](/blog/html-in-pdf-format.md)
- [Html To Pdf In Javascript](/blog/html-to-pdf-in-javascript.md)
- [Intelligent Data Extraction](/blog/intelligent-data-extraction.md)
- [Invoice Approval Software](/blog/invoice-approval-software.md)
- [Javascript Document Editor](/blog/javascript-document-editor.md)
- [Javascript Pdf Editors](/blog/javascript-pdf-editors.md)
- [Javascript Pdf Libraries](/blog/javascript-pdf-libraries.md)
- [Landing Ai Alternatives](/blog/landing-ai-alternatives.md)
- [Langextract Vs Llamaindex Extraction Comparison](/blog/langextract-vs-llamaindex-extraction-comparison.md)
- [Linearized Pdf](/blog/linearized-pdf.md)
- [Uses OpenAI by default — set OPENAI_API_KEY.](/blog/llamaindex-vs-langchain-rag.md)
- [Llamaindex Vs Langchain Vs Haystack](/blog/llamaindex-vs-langchain-vs-haystack.md)
- [Llamaindex Workflows Vs Langgraph](/blog/llamaindex-workflows-vs-langgraph.md)
- [Llamaparse Alternatives](/blog/llamaparse-alternatives.md)
- [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)
- [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 for developers: Meeting WCAG 2.2, Section 508, and PDF/UA with an SDK](/blog/pdf-accessibility.md)
- [Extract data from PDF files: A developer guide to structured data from PDFs and scans](/blog/pdf-data-extraction-developer-guide.md)
- [Pdf Extraction Benchmark Opendataloader Bench](/blog/pdf-extraction-benchmark-opendataloader-bench.md)
- [Pdf Extraction Document Case Studies](/blog/pdf-extraction-document-case-studies.md)
- [Pdf Page Labels](/blog/pdf-page-labels.md)
- [Pdf Sdk Compliance Security Checklist](/blog/pdf-sdk-compliance-security-checklist.md)
- [Pdf Sdk Performance Benchmark](/blog/pdf-sdk-performance-benchmark.md)
- [Pdf Ua Compliance Guide](/blog/pdf-ua-compliance-guide.md)
- [Pdf Ua Validation](/blog/pdf-ua-validation.md)
- [Pdfjs Accessibility Structtree Printing](/blog/pdfjs-accessibility-structtree-printing.md)
- [Pdfjs Advanced Loading Streaming Workers](/blog/pdfjs-advanced-loading-streaming-workers.md)
- [Pdfjs Annotation Editor Layer](/blog/pdfjs-annotation-editor-layer.md)
- [Pdfjs Area Annotations Canvas Capture](/blog/pdfjs-area-annotations-canvas-capture.md)
- [Pdfjs Coordinate Systems Pdf To Screen](/blog/pdfjs-coordinate-systems-pdf-to-screen.md)
- [Pdfjs Document Outline Bookmarks Metadata](/blog/pdfjs-document-outline-bookmarks-metadata.md)
- [Pdfjs Eventbus Guide](/blog/pdfjs-eventbus-guide.md)
- [macOS](/blog/pdfjs-file-format-conversion-to-pdf.md)
- [macOS](/blog/pdfjs-generating-pdf-thumbnails-pdf2pic.md)
- [Pdfjs Limitations Commercial Upgrade](/blog/pdfjs-limitations-commercial-upgrade.md)
- [Pdfjs Native Annotation Layer Forms](/blog/pdfjs-native-annotation-layer-forms.md)
- [Pdfjs Navigation Zoom Rotation](/blog/pdfjs-navigation-zoom-rotation.md)
- [Pdfjs Pdf Page Manipulation Pdf Lib](/blog/pdfjs-pdf-page-manipulation-pdf-lib.md)
- [Pdfjs React Viewer Setup](/blog/pdfjs-react-viewer-setup.md)
- [Pdfjs Rendering Overlays React Portals](/blog/pdfjs-rendering-overlays-react-portals.md)
- [Pdfjs Server Side Text Extraction](/blog/pdfjs-server-side-text-extraction.md)
- [Pdfjs Sticky Note Annotations](/blog/pdfjs-sticky-note-annotations.md)
- [Pdfjs Text Highlight Annotations](/blog/pdfjs-text-highlight-annotations.md)
- [Pdfjs Text Search Pdffindcontroller](/blog/pdfjs-text-search-pdffindcontroller.md)
- [Pdfjs Thumbnail Sidebar](/blog/pdfjs-thumbnail-sidebar.md)
- [Pdfplumber Python Guide](/blog/pdfplumber-python-guide.md)
- [People Process Tools](/blog/people-process-tools.md)
- [Process Flows](/blog/process-flows.md)
- [React 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 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)
- [Workflow Analysis](/blog/workflow-analysis.md)

