---
title: "How to extract tables from PDFs and images in C#"
canonical_url: "https://www.nutrient.io/blog/how-to-extract-tables-from-pdf-and-images/"
md_url: "https://www.nutrient.io/blog/how-to-extract-tables-from-pdf-and-images.md"
last_updated: "2026-08-11T08:08:12.847Z"
description: "Learn how to extract tables from PDFs and images in C# using the GdPicture.NET SDK. View the detailed step-by-step guide with code examples here."
---

**To extract tables from a PDF or image in C#, render each page to a high dots-per-inch (DPI) image; run optical character recognition (OCR) with the GdPicture.NET `GdPictureOCR` class; and then export the detected tables to Excel (XLSX), Markdown, or JSON.**

In this tutorial, you’ll learn how to extract tables from PDFs and images in C# using our [data extraction SDK](https://www.nutrient.io/sdk/ai-document-processing/). You’ll also learn some useful tricks to convert the extracted tables into JSON and Markdown formats.

## Prerequisites

This tutorial uses Visual Studio 2022 with.NET 6. You can follow [this guide](https://learn.microsoft.com/en-us/visualstudio/install/install-visual-studio?view=vs-2022) from Microsoft to install Visual Studio and set up the.NET 6 SDK. (.NET 6 reached end of support in November 2024 — the same steps work on.NET 8, the current long-term support release.)

Make sure you follow this tutorial on a Windows machine, as it’s currently only possible to develop applications using GdPicture.NET on Windows. However, this limitation is only for developing the application; the final binary can be deployed on multiple different platforms (including Mac and Linux).

If you don’t have a sample PDF or an image of a table, you can use [these sample files](https://www.nutrient.io/downloads/sample-files.zip).

## Installing GdPicture.NET SDK

Once you have Visual Studio 2022 and.NET 6 set up, you need to install GdPicture.NET from [our website](https://customers.pspdfkit.com/download/gdpicture/latest/). You’ll be setting up GdPicture.NET in your project via NuGet. This website-based installation step is required not only to get a trial license key via the License Manager that only ships as part of the website-based installation, but also to get access to the OCR resource files.

Make sure you install the GdPicture.NET SDK in an easily findable path like `C:\GdPicture 14`, and once the SDK is installed, run the `LicenseManager.exe` file from the installation directory.

From there, click **Request a trial key**.![Request Trial key](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/license-manager.png)

Fill out the form that opens and click **Send Request**.![Trial key form](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/trial-key-form.png)

You’ll receive an email with a trial license key. Save this key in a safe location, as you’ll need it later.

## Creating a new.NET 6 project

Open Visual Studio and create a new **Console App** project.![New Project](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/new-project.png)

You can name it whatever you want. Click **Next**.![Configure project](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/configure-project.png)

On the next screen of the wizard, select **.NET 6.**![ET SDK selection](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/netsdk-selection.png)

Once you click **Create**, you’ll be greeted by a brand-new.NET 6 project.

## Setting up GdPicture.NET as a dependency

Before you can use GdPicture.NET in your.NET project, you need to install and reference the NuGet package for GdPicture.

Right-click the project name in the solutions explorer and select **Manage NuGet Packages...**.![Manage NuGet](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/manage-nuget.png)

Make sure your Package source is set to `nuget.org`, and search for `GdPicture`. This will return multiple results. Choose `GdPicture.API`.![Install GdPicture.API](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/install-gdpicture.png)

You’ll be warned about the resulting changes. You can safely click **Apply**.![Preview Changes](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/preview-changes.png)

As part of the installation, you’ll also be prompted to accept the GdPicture license.![License Acceptance](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/license-acceptance.png)

Once the installation is finished, navigate to your project’s `csproj` file, where you’ll be able to see the `PackageReference` file that was added to the GdPicture package.![csproj file](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/csproj-file.png)

This next section will demonstrate how you can use GdPicture.NET to extract tables from PDFs and images and convert them into Excel, Markdown, and JSON formats.

## Working with GdPicture.NET

In this section, you’ll learn how to properly import and make use of GdPicture.NET.

### Importing the GdPicture.NET namespace

Start by replacing everything in the default `Program.cs` file with this:

```csharp

using GdPicture14;

```

The 14 at the end of the namespace import might differ if you’re using a newer or older version of GdPicture. This is the major version of the GdPicture package you installed in the previous step.

Before you can use anything from GdPicture.NET, you need to unlock it using the license key you received in your email. You can do so using this code:

```csharp

LicenseManager licenseManager = new LicenseManager();
licenseManager.RegisterKEY("YOUR_LICENSE_KEY");

```

Replace `YOUR_LICENSE_KEY` with the key from your email to unlock GdPicture.NET.

### Extracting the table from PDF

The image below shows what the sample PDF with the table looks like.![survey](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/survey.png)

Table extraction works by first converting the PDF into a high-DPI image (configurable) and then running our proprietary OCR algorithm on top of that image. GdPicture.NET comes with all the required classes and methods for performing these steps.

But first, take a look at how you can perform OCR on a PDF. Then, you’ll see how to convert the OCR output to different formats.

### Converting PDF to image and performing OCR

To convert [PDF to image](https://www.nutrient.io/sdk/solutions/document-conversion/), start by creating two new instances of the [`GdPictureOCR`](https://www.nutrient.io/api/gdpicture/GdPicture.NET.14.API~GdPicture14.GdPictureOCR.html) and [`GdPicturePDF`](https://www.nutrient.io/api/gdpicture/GdPicture.NET.14.API~GdPicture14.GdPicturePDF.html) classes:

```csharp

using GdPictureOCR gdpictureOCR = new GdPictureOCR();
using GdPicturePDF gdpicturePDF = new GdPicturePDF();

```

Next, load the sample PDF via the [`GdPicturePDF`](https://www.nutrient.io/api/gdpicture/GdPicture.NET.14.API~GdPicture14.GdPicturePDF.html) object, navigate to the page with the table, and convert the page into a high-DPI image:

```csharp

// Load the source document.
gdpicturePDF.LoadFromFile(@"C:\temp\source.pdf");
// Select the first page.
gdpicturePDF.SelectPage(1);
// Render the first page to a 300-DPI image.
int imageId = gdpicturePDF.RenderPageToGdPictureImageEx(300, true);

```

Now you can pass this image reference to the [`GdPictureOCR`](https://www.nutrient.io/api/gdpicture/GdPicture.NET.14.API~GdPicture14.GdPictureOCR.html) object and run OCR on it. However, before you can run OCR, you also need to provide the `GdPictureOCR` object with the target language (English in this case) and with the path to the OCR resource folder that was installed as part of the SDK installation at the very beginning:

```csharp

// Pass the image to the `GdPictureOCR` object.
gdpictureOCR.SetImage(imageId);
// Configure the table extraction process.
gdpictureOCR.ResourceFolder = @"C:\GdPicture.NET 14\Redist\OCR";
gdpictureOCR.AddLanguage(OCRLanguage.English);
// Run the table extraction process and save the result ID in a list.
string result = gdpictureOCR.RunOCR();

```

If you followed the default SDK installation options, the GdPicture.NET SDK should be installed at `C:\GdPicture.NET 14\Redist\OCR`.

### Performing OCR on an input image

If you instead have an image as input, you can use the following code to directly perform OCR on it:

```csharp

using GdPictureOCR gdpictureOCR = new GdPictureOCR();
using GdPictureImaging gdpictureImaging = new GdPictureImaging();

// Load the source image.
int imageId = gdpictureImaging.CreateGdPictureImageFromFile(@"C:\temp\source.png");
// Pass the image to the `GdPictureOCR` object.
gdpictureOCR.SetImage(imageId);
// Configure the OCR process.
gdpictureOCR.ResourceFolder = @"C:\GdPicture.NET 14\Redist\OCR";
gdpictureOCR.AddLanguage(OCRLanguage.English);
// Run the table extraction process.
string result = gdpictureOCR.RunOCR();

```

The only difference, in this case, is that instead of loading the input using the `GdPicturePDF` object, you load it using the [`GdPictureImaging`](https://www.nutrient.io/api/gdpicture/GdPicture.NET.14.API~GdPicture14.GdPictureImaging.html) object. The rest of the steps are the same.

### Converting a table to an Excel sheet

Now that you have the OCR output, you can convert it into whatever format you want. In the first example, you’ll see how to convert the OCR output to an Excel sheet.

Here’s the code to convert the OCR output to an Excel sheet:

```csharp

List<string> resultsList = new List<string>();
resultsList.Add(result);
// Configure the output spreadsheet.
GdPictureOCR.SpreadsheetOptions spreadsheetOptions = new GdPictureOCR.SpreadsheetOptions()
{
  SeparateTables = true
};
// Save the output in an Excel spreadsheet.
gdpictureOCR.SaveAsXLSX(resultsList, @"C:\temp\output.xlsx", spreadsheetOptions);
// Release unnecessary resources.
gdpictureOCR.ReleaseOCRResults();
GdPictureDocumentUtilities.DisposeImage(imageId);

```

The code first creates a list to store the OCR result reference. This is because the [`SaveAsXLSX`](https://www.nutrient.io/api/gdpicture/GdPicture.NET.14.API~GdPicture14.GdPictureOCR~SaveAsXLSX.html) method of the `GdPictureOCR` object expects a list of OCR result references instead of a single reference, because you can pass in multiple OCR results to create an Excel file in one go.

Next, the code creates a new [`SpreadsheetOptions`](https://www.nutrient.io/api/gdpicture/GdPicture.NET.14.API~GdPicture14.GdPictureOCR+SpreadsheetOptions.html) object and specifies the `SeparateTables` property as `true`. This instructs `GdPictureOCR` to save each OCR table in a separate sheet in the Excel file.

Lastly, it calls the `SaveAsXLSX` method to save output to an Excel file. Then, it calls a few additional methods to release resources for garbage collection.

If you try opening the `output.xlsx` file in Excel, you’ll see the original table in a spreadsheet.![Excel sheet](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/excel-sheet.png)

Depending on whether you used an image as input or a PDF as input, you also have to release those resources:

```csharp

// If using an image as input, release `GdPictureImage`.
gdpictureImaging.ReleaseGdPictureImage(imageId);

// If using a PDF as input, close the PDF document.
gdpicturePDF.CloseDocument();

```

A few of the next steps need to use the resources that you release in this section. Make sure you add the code from the next sections before these release statements.

### Converting a table to Markdown

If you’ve performed the OCR and want to convert the table into Markdown instead of an Excel sheet, you can use the following code:

```csharp

for (int tableIndex = 0; tableIndex < gdpictureOCR.GetTableCount(result); tableIndex++)
{
    int columnCount = gdpictureOCR.GetTableColumnCount(result, tableIndex);
    int rowCount = gdpictureOCR.GetTableRowCount(result, tableIndex);

    // Print the table to the console.
    Console.Write($"\nTable {tableIndex}");
    for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
    {
        Console.Write("\n| ");
        for (int columnIndex = 0; columnIndex < columnCount; columnIndex++)
        {
            string cellContent = gdpictureOCR.GetTableCellText(result, tableIndex, columnIndex, rowIndex).Replace(Environment.NewLine, "");
            Console.Write($" {cellContent} |");
        }
    }
    Console.WriteLine("");
}

```

The `GdPictureOCR` object provides the [`GetTableCount`](https://www.nutrient.io/api/gdpicture/GdPicture.NET.14.API~GdPicture14.GdPictureOCR~GetTableCount.html) method to find the number of tables in the OCR output, the [`GetTableColumnCount`](https://www.nutrient.io/api/gdpicture/GdPicture.NET.14.API~GdPicture14.GdPictureOCR~GetTableColumnCount.html) method to find the column count of a particular table, the [`GetTableRowCount`](https://www.nutrient.io/api/gdpicture/GdPicture.NET.14.API~GdPicture14.GdPictureOCR~GetTableRowCount.html) method to find the row count of a particular table, and finally, the [`GetTableCellText`](https://www.nutrient.io/api/gdpicture/GdPicture.NET.14.API~GdPicture14.GdPictureOCR~GetTableCellText.html) method to find the text of a particular cell in a table.

The code above uses all of these methods to traverse each cell of the table and puts them in valid Markdown format for a table. Here’s what the output looks like for the sample file you used:

```markdown

Table 0
| 2021 | Dollars (millions) | H01 | Total income | Financial performance | 757,504 |
| 2021 | Dollars (millions) | H04 | Sales, government funding, grants and subsidies | Financial performance | 674,890 |
| 2021 | Dollars (millions) | H05 | Interest, dividends and donations | Financial performance | 49,593 |
| 2021 | Dollars (millions) | H07 | Non-operating income | Financial performance | 33,020 |
| 2021 | Dollars (millions) | H08 | Total expenditure | Financial performance | 654,404 |
| 2021 | Dollars (millions) | H09 | Interest and donations | Financial performance | 26,138 |
| 2021 | Dollars (millions) | H10 | Indirect taxes | Financial performance | 6,991 |
| 2021 | Dollars (millions) | H11 | Depreciation | Financial performance | 27,801 |
| 2021 | Dollars (millions) | H12 | Salaries and wages paid | Financial performance | 123,620 |
| 2021 | Dollars (millions) | H13 | Redundancy and severance | Financial performance | 275 |
| 2021 | Dollars (millions) | H14 | Salaries and wages to self employed commission agents | Financial performance | 2,085 |
| 2021 | Dollars (millions) | H19 | Purchases and other operating expenses | Financial performance | 452,963 |
| 2021 | Dollars (millions) | H20 | Non-operating expenses | Financial performance | 14,806 |
| 2021 | Dollars (millions) | H21 | Opening stocks | Financial performance | 68,896 |
| 2021 | Dollars (millions) | H22 | Closing stocks | Financial performance | 69,127 |
| 2021 | Dollars (millions) | H23 | Surplus before income tax | Financial performance | 103,330 |

```

If the input image had multiple tables, this output would have included all of them. Here’s what the rendered Markdown output would look like:

| Year | Units              | Variable_code | Variable_name                                         | Variable_category     | Value   |
| ---- | ------------------ | ------------- | ----------------------------------------------------- | --------------------- | ------- |
| 2021 | Dollars (millions) | H01           | Total income                                          | Financial performance | 757,504 |
| 2021 | Dollars (millions) | H04           | Sales, government funding, grants and subsidies       | Financial performance | 674,890 |
| 2021 | Dollars (millions) | H05           | Interest, dividends and donations                     | Financial performance | 49,593  |
| 2021 | Dollars (millions) | H07           | Non-operating income                                  | Financial performance | 33,020  |
| 2021 | Dollars (millions) | H08           | Total expenditure                                     | Financial performance | 654,404 |
| 2021 | Dollars (millions) | H09           | Interest and donations                                | Financial performance | 26,138  |
| 2021 | Dollars (millions) | H10           | Indirect taxes                                        | Financial performance | 6,991   |
| 2021 | Dollars (millions) | H11           | Depreciation                                          | Financial performance | 27,801  |
| 2021 | Dollars (millions) | H12           | Salaries and wages paid                               | Financial performance | 123,620 |
| 2021 | Dollars (millions) | H13           | Redundancy and severance                              | Financial performance | 275     |
| 2021 | Dollars (millions) | H14           | Salaries and wages to self employed commission agents | Financial performance | 2,085   |
| 2021 | Dollars (millions) | H19           | Purchases and other operating expenses                | Financial performance | 452,963 |
| 2021 | Dollars (millions) | H20           | Non-operating expenses                                | Financial performance | 14,806  |
| 2021 | Dollars (millions) | H21           | Opening stocks                                        | Financial performance | 68,896  |
| 2021 | Dollars (millions) | H22           | Closing stocks                                        | Financial performance | 69,127  |
| 2021 | Dollars (millions) | H23           | Surplus before income tax                             | Financial performance | 103,330 |

### Converting a table to JSON

It shouldn’t be too hard to predict what the process of converting the table to JSON would look like, as you already have the OCR output. You just need to traverse over each table cell and put it in a JSON object. However, before you continue, make sure you have the `Newtonsoft.Json` NuGet package installed.

You can install this package by again going to **Manage NuGet Packages...** and searching for `Newtonsoft.Json`.![Newtonsoft.Json install](@/assets/images/blog/2024/how-to-extract-tables-from-pdf-and-images/newtonsoft-installation.png)

Once it’s installed, add the following code to the `Program.cs` file right before you release and dispose of all resources:

```csharp

// Create the JSON object that contains the tables on the page and loop through the tables.
int tableCount = gdpictureOCR.GetTableCount(result);
dynamic[] tables = new JObject[tableCount];
for (int tableIndex = 0; tableIndex < tableCount; tableIndex++)
{
    int columnCount = gdpictureOCR.GetTableColumnCount(result, tableIndex);
    int rowCount = gdpictureOCR.GetTableRowCount(result, tableIndex);
    // Create the JSON object that contains the rows in the table and loop through the rows.
    dynamic[] rows = new JObject[rowCount];
    for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
    {
        // Create the JSON object that contains the cells in the row and loop through the cells.
        dynamic[] cells = new JObject[columnCount];
        for (int columnIndex = 0; columnIndex < columnCount; columnIndex++)
        {
            cells[columnIndex] = new JObject();
            cells[columnIndex].RowIndex = rowIndex;
            cells[columnIndex].ColumnIndex = columnIndex;
            // Read the content of the cell and save it in the JSON object.
            cells[columnIndex].Text = gdpictureOCR.GetTableCellText(result, tableIndex, columnIndex, rowIndex);
        }
        rows[rowIndex] = new JObject();
        rows[rowIndex].Cells = new JArray(cells);
    }
    tables[tableIndex] = new JObject();
    tables[tableIndex].Rows = new JArray(rows);
}
dynamic tablesOnPage = new JObject();
tablesOnPage.Tables = new JArray(tables);
// Print the tables to the console in JSON format.
Console.WriteLine(tablesOnPage.ToString());

```

Even though this code might look a bit different from the code you saw in the previous Markdown section, it follows the same general pattern. It uses the `GetTableCount`, `GetTableColumnCount`, and `GetTableRowCount` methods to loop over each cell in the table, and it creates nested `JObject`s and `JArray`s. There’s very little GdPicture.NET-specific code here.

If you run it on the sample input table, it’ll produce a similar JSON output:

```json

{
	"Tables": [
		{
			"Rows": [
				{
					"Cells": [
						{
							"RowIndex": 0,
							"ColumnIndex": 0,
							"Text": "Year"
						},
						{
							"RowIndex": 0,
							"ColumnIndex": 1,
							"Text": "Units"
						},
						{
							"RowIndex": 0,
							"ColumnIndex": 2,
							"Text": "Variable_code"
						},
						{
							"RowIndex": 0,
							"ColumnIndex": 3,
							"Text": "Variable_name"
						},
						{
							"RowIndex": 0,
							"ColumnIndex": 4,
							"Text": "Variable_category"
						},
						{
							"RowIndex": 0,
							"ColumnIndex": 5,
							"Text": "Value"
						}
					]
				},
				{
					"Cells": [
						//...truncated...
					]
				}
			]
		}
	]
}

```

You can read more about all of these different output formats in our [official extraction documentation](https://www.nutrient.io/guides/dotnet/extraction/tables.md). If you’d rather extract table data through a cloud API instead of the SDK, refer to the [Data Extraction API](https://www.nutrient.io/api/data-extraction-api/).

## Conclusion

This tutorial showed how to convert a table from a PDF or an image into an Excel, Markdown, or JSON output. You became acquainted with different classes and methods that are available in GdPicture.NET that can help you in traversing table cells and converting them into whatever output you want. This was just a glimpse of how powerful [GdPicture.NET SDK](https://www.nutrient.io/sdk/dotnet/) is! There’s a reason why many Fortune 500 companies use this SDK to power their products and processes.

If your product requires working with documents, chances are that GdPicture.NET has some sort of support for it. This includes advanced artificial intelligence (AI) and machine learning (ML) techniques and fuzzy logic algorithms. Take our SDK for a spin with a [free trial](https://www.nutrient.io/try) and see if it meets your requirements. If you have any questions, [check out our guides](https://www.nutrient.io/guides/dotnet.md) or reach out to our [Sales](https://www.nutrient.io/contact-sales/?=sdk) and [Support](https://www.nutrient.io/support/request) teams.

## FAQ

#### How do I extract tables from a PDF in C#?

Render each PDF page to a high-DPI image with the `GdPicturePDF` class, pass the image to `GdPictureOCR`, and run OCR. GdPicture.NET detects the table structure during recognition, and the results can be exported to Excel, Markdown, or JSON.

#### Can I extract tables from scanned PDFs and images?

Yes. Because the workflow is OCR-based, it handles scanned PDFs and standalone image files (PNG, TIFF, JPEG). Load an image with `GdPictureImaging` instead of `GdPicturePDF`; the OCR and table-export steps are identical.

#### What formats can extracted tables be exported to?

GdPicture.NET exports detected tables to Excel (XLSX) via `SaveAsXLSX`, and the cell-level API (`GetTableCount`, `GetTableRowCount`, `GetTableCellText`) lets you serialize the same data to Markdown or JSON.

#### How can I improve table extraction accuracy?

Accuracy depends on input quality. Render pages at 300 DPI or higher, set the correct OCR language, and start from clean, deskewed source images. Low-resolution or noisy scans reduce both text and table-structure accuracy.

## Related reading

- [Table extraction guides for.NET](https://www.nutrient.io/guides/dotnet/extraction/tables.md) — API reference and configuration options

- [OCR and data extraction SDK](https://www.nutrient.io/sdk/ai-document-processing/) — How the OCR layer behind table extraction works

- [Convert PDF to image in C#](https://www.nutrient.io/sdk/solutions/document-conversion/) — The rendering step that precedes OCR
---

## Related pages

- [The business case for accessibility: Five ways it drives enterprise value](/blog/5-ways-accessibility-drives-enterprise-value.md)
- [Accessibility Untangled Why It Matters Guide](/blog/accessibility-untangled-why-it-matters-guide.md)
- [Advanced Techniques For React Native Ui Components](/blog/advanced-techniques-for-react-native-ui-components.md)
- [`vector_store` holds your indexed documents (see the multimodal RAG post](/blog/agentic-rag.md)
- [Ai Document Automation Extraction To Action](/blog/ai-document-automation-extraction-to-action.md)
- [Ai Legal Assistant Document Authoring](/blog/ai-legal-assistant-document-authoring.md)
- [Angular File Viewer Pdf Image Office Files](/blog/angular-file-viewer-pdf-image-office-files.md)
- [Auto Tagging And Document Accessibility In Dotnet Sdk](/blog/auto-tagging-and-document-accessibility-in-dotnet-sdk.md)
- [Best Document Ai Platforms](/blog/best-document-ai-platforms.md)
- [Best Document Viewers](/blog/best-document-viewers.md)
- [The CEO’s AI playbook: Why decision architecture beats model selection](/blog/ceo-ai-playbook-decision-architecture.md)
- [1. Extract and chunk the PDF.](/blog/chat-with-pdf.md)
- [Complete Guide To Pdfjs](/blog/complete-guide-to-pdfjs.md)
- [Construction Document Data Extraction](/blog/construction-document-data-extraction.md)
- [Convert One Drive Files To Pdf In Sharepoint](/blog/convert-one-drive-files-to-pdf-in-sharepoint.md)
- [Create And Edit Pdfs In Flutter](/blog/create-and-edit-pdfs-in-flutter.md)
- [Create Pdfs With React](/blog/create-pdfs-with-react.md)
- [Creating A Document Scanner With Ocr In Python](/blog/creating-a-document-scanner-with-ocr-in-python.md)
- [Creating And Filling Pdf Forms Programmatically In Javascript](/blog/creating-and-filling-pdf-forms-programmatically-in-javascript.md)
- [The CTO’s AI playbook: Why accountability architecture beats orchestration](/blog/cto-ai-playbook-accountability-architecture.md)
- [Digital Signatures](/blog/digital-signatures.md)
- [Digital Workflow Automation](/blog/digital-workflow-automation.md)
- [Document Ai Vs Ocr](/blog/document-ai-vs-ocr.md)
- [Document Extraction Confidence Scores](/blog/document-extraction-confidence-scores.md)
- [Document Viewer](/blog/document-viewer.md)
- [Document Watermarking](/blog/document-watermarking.md)
- [Emerging threats: Your logging system may be an agentic threat vector](/blog/emerging-threats-your-logging-system.md)
- [app.py](/blog/extract-text-from-pdf-using-python.md)
- [Fillable Pdf](/blog/fillable-pdf.md)
- [How To Add Digital Signature To Pdf Using React](/blog/how-to-add-digital-signature-to-pdf-using-react.md)
- [How To Build A Dotnet Maui Pdf Viewer](/blog/how-to-build-a-dotnet-maui-pdf-viewer.md)
- [How To Build A Flutter Pdf Viewer](/blog/how-to-build-a-flutter-pdf-viewer.md)
- [or](/blog/how-to-build-a-javascript-pdf-viewer-with-pdfjs.md)
- [How To Build A Javascript Pdf Viewer](/blog/how-to-build-a-javascript-pdf-viewer.md)
- [or](/blog/how-to-build-a-nextjs-pdf-viewer.md)
- [How To Build A Powerpoint Viewer Using Javascript](/blog/how-to-build-a-powerpoint-viewer-using-javascript.md)
- [Using Yarn](/blog/how-to-build-a-react-excel-viewer.md)
- [How To Build A React Native Pdf Viewer](/blog/how-to-build-a-react-native-pdf-viewer.md)
- [How To Build A React Powerpoint Viewer](/blog/how-to-build-a-react-powerpoint-viewer.md)
- [How To Build A Reactjs File Viewer](/blog/how-to-build-a-reactjs-file-viewer.md)
- [or](/blog/how-to-build-a-reactjs-pdf-viewer-with-react-pdf.md)
- [or](/blog/how-to-build-a-reactjs-pdf-viewer.md)
- [How To Build A Reactjs Viewer With Pdfjs](/blog/how-to-build-a-reactjs-viewer-with-pdfjs.md)
- [How To Build A Vuejs Pdf Viewer With Pdfjs](/blog/how-to-build-a-vuejs-pdf-viewer-with-pdfjs.md)
- [How To Build A Vuejs Pdf Viewer](/blog/how-to-build-a-vuejs-pdf-viewer.md)
- [How To Build An Android Pdf Viewer](/blog/how-to-build-an-android-pdf-viewer.md)
- [How To Build An Angular Pdf Viewer With Ng2 Pdf Viewer](/blog/how-to-build-an-angular-pdf-viewer-with-ng2-pdf-viewer.md)
- [How To Build An Angular Pdf Viewer With Pdfjs](/blog/how-to-build-an-angular-pdf-viewer-with-pdfjs.md)
- [How To Convert Docx To Pdf Using Javascript](/blog/how-to-convert-docx-to-pdf-using-javascript.md)
- [How To Convert Docx To Pdf Using Python](/blog/how-to-convert-docx-to-pdf-using-python.md)
- [How To Convert Html To Pdf Using Html2pdf](/blog/how-to-convert-html-to-pdf-using-html2pdf.md)
- [or](/blog/how-to-convert-html-to-pdf-using-react.md)
- [How To Convert Html To Pdf Using Wkhtmltopdf And Csharp](/blog/how-to-convert-html-to-pdf-using-wkhtmltopdf-and-csharp.md)
- [or](/blog/how-to-convert-html-to-pdf-using-wkhtmltopdf-and-python.md)
- [How To Convert Word To Pdf In Nodejs](/blog/how-to-convert-word-to-pdf-in-nodejs.md)
- [or](/blog/how-to-create-a-react-js-signature-pad.md)
- [How To Create Pdfs With React To Pdf](/blog/how-to-create-pdfs-with-react-to-pdf.md)
- [How To Edit Pdfs Using Ios Pdf Library](/blog/how-to-edit-pdfs-using-ios-pdf-library.md)
- [How To Embed A Pdf Viewer In Your Website](/blog/how-to-embed-a-pdf-viewer-in-your-website.md)
- [How To 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)
- [Open an image.](/blog/how-to-use-tesseract-ocr-in-python.md)
- [From an HTML string.](/blog/html-in-pdf-format.md)
- [Javascript Pdf Editors](/blog/javascript-pdf-editors.md)
- [Javascript Pdf Libraries](/blog/javascript-pdf-libraries.md)
- [Linearized Pdf](/blog/linearized-pdf.md)
- [or](/blog/merge-pdfs.md)
- [Swift Package Manager](/blog/mobile-pdf-sdk.md)
- [`elements` come from your document parser — each has a type and content.](/blog/multimodal-rag.md)
- [Nutrient Vs Conga Composer](/blog/nutrient-vs-conga-composer.md)
- [Online Document Viewer](/blog/online-document-viewer.md)
- [Open Pdf In Your Web App](/blog/open-pdf-in-your-web-app.md)
- [Building WCAG 2.2, Section 508, and PDF/UA-compliant PDFs with an SDK](/blog/pdf-accessibility.md)
- [Pdf Data Extraction Developer Guide](/blog/pdf-data-extraction-developer-guide.md)
- [Pdf Extraction Benchmark Opendataloader Bench](/blog/pdf-extraction-benchmark-opendataloader-bench.md)
- [Pdf Extraction Document Case Studies](/blog/pdf-extraction-document-case-studies.md)
- [Pdf Page Labels](/blog/pdf-page-labels.md)
- [Pdf Sdk Compliance Security Checklist](/blog/pdf-sdk-compliance-security-checklist.md)
- [Pdf Sdk Performance Benchmark](/blog/pdf-sdk-performance-benchmark.md)
- [Pdf Ua Compliance Guide](/blog/pdf-ua-compliance-guide.md)
- [Pdfjs Accessibility Structtree Printing](/blog/pdfjs-accessibility-structtree-printing.md)
- [Pdfjs Advanced Loading Streaming Workers](/blog/pdfjs-advanced-loading-streaming-workers.md)
- [Pdfjs Annotation Editor Layer](/blog/pdfjs-annotation-editor-layer.md)
- [Pdfjs Area Annotations Canvas Capture](/blog/pdfjs-area-annotations-canvas-capture.md)
- [Pdfjs Coordinate Systems Pdf To Screen](/blog/pdfjs-coordinate-systems-pdf-to-screen.md)
- [Pdfjs Document Outline Bookmarks Metadata](/blog/pdfjs-document-outline-bookmarks-metadata.md)
- [Pdfjs Eventbus Guide](/blog/pdfjs-eventbus-guide.md)
- [macOS](/blog/pdfjs-file-format-conversion-to-pdf.md)
- [macOS](/blog/pdfjs-generating-pdf-thumbnails-pdf2pic.md)
- [Pdfjs Limitations Commercial Upgrade](/blog/pdfjs-limitations-commercial-upgrade.md)
- [Pdfjs Native Annotation Layer Forms](/blog/pdfjs-native-annotation-layer-forms.md)
- [Pdfjs Navigation Zoom Rotation](/blog/pdfjs-navigation-zoom-rotation.md)
- [Pdfjs Pdf Page Manipulation Pdf Lib](/blog/pdfjs-pdf-page-manipulation-pdf-lib.md)
- [Pdfjs React Viewer Setup](/blog/pdfjs-react-viewer-setup.md)
- [Pdfjs Rendering Overlays React Portals](/blog/pdfjs-rendering-overlays-react-portals.md)
- [Pdfjs Server Side Text Extraction](/blog/pdfjs-server-side-text-extraction.md)
- [Pdfjs Sticky Note Annotations](/blog/pdfjs-sticky-note-annotations.md)
- [Pdfjs Text Highlight Annotations](/blog/pdfjs-text-highlight-annotations.md)
- [Pdfjs Text Search Pdffindcontroller](/blog/pdfjs-text-search-pdffindcontroller.md)
- [Pdfjs Thumbnail Sidebar](/blog/pdfjs-thumbnail-sidebar.md)
- [Process Flows](/blog/process-flows.md)
- [React Native Pdf Annotation](/blog/react-native-pdf-annotation.md)
- [Using Yarn](/blog/react-pdf-editor.md)
- [or](/blog/sample-blog-updated.md)
- [Sdk Product Updates Q2 2026](/blog/sdk-product-updates-q2-2026.md)
- [Add DWS MCP Server to your Claude Code project.](/blog/teaching-llms-to-read-pdfs.md)
- [Open an image file.](/blog/tesseract-python-guide.md)
- [Define the HTML part of the document.](/blog/top-10-ways-to-generate-pdfs-in-python.md)
- [Top 5 Javascript Pdf Viewers](/blog/top-5-javascript-pdf-viewers.md)
- [or](/blog/top-js-pdf-libraries.md)
- [Convert an HTML file to PDF.](/blog/top-ten-ways-to-convert-html-to-pdf.md)
- [Vector Pdf](/blog/vector-pdf.md)
- [Wcag2 Accessibility Requirements Documents](/blog/wcag2-accessibility-requirements-documents.md)
- [Web Sdk Is Now Headless](/blog/web-sdk-is-now-headless.md)
- [What Are Annotations](/blog/what-are-annotations.md)
- [What Is A Vpat](/blog/what-is-a-vpat.md)
- [What Is Document Processing](/blog/what-is-document-processing.md)
- [What Is Intelligent Document Processing](/blog/what-is-intelligent-document-processing.md)
- [What Is Pdf Ua](/blog/what-is-pdf-ua.md)
- [Why Pdfium Is A Trusted Platform For Pdf Rendering](/blog/why-pdfium-is-a-trusted-platform-for-pdf-rendering.md)
- [Why Your Ai Agent Hallucinates Pdf Table Data](/blog/why-your-ai-agent-hallucinates-pdf-table-data.md)

