---
title: "How to convert HTML to PDF in C# using wkhtmltopdf"
canonical_url: "https://www.nutrient.io/blog/how-to-convert-html-to-pdf-using-wkhtmltopdf-and-csharp/"
md_url: "https://www.nutrient.io/blog/how-to-convert-html-to-pdf-using-wkhtmltopdf-and-csharp.md"
last_updated: "2026-08-19T14:10:58.693Z"
description: "Learn two reliable ways to convert HTML to PDF in C#: with the open source wkhtmltopdf tool and the enterprise-ready Nutrient API. Includes installation steps, C# code examples, and integration tips."
---

**TL;DR**

Need to convert HTML to PDF in C#? This article walks you through two reliable methods:

- **[wkhtmltopdf](https://wkhtmltopdf.org/)** — A free, open source command-line tool that uses the WebKit engine to convert HTML to high-quality PDFs in your C# apps.

- **[Nutrient API](https://www.nutrient.io/api/html-to-pdf-api/)** — A commercial, REST-based solution offering robust HTML-to-PDF conversion with better support, asset handling, and customization.

It includes installation instructions, full C# code samples, and comparison insights to help you choose the right tool for your use case.

**wkhtmltopdf was [archived on 2 January 2023](https://github.com/wkhtmltopdf/wkhtmltopdf/issues/5160)** and is now read-only. The library still works, but it receives no security patches, browser-engine updates, or bug fixes. For new projects, consider maintained alternatives — [PuppeteerSharp](https://www.puppeteersharp.com/) (.NET port of Puppeteer, MIT) for an open source path, or [Nutrient’s HTML-to-PDF API](https://www.nutrient.io/api/html-to-pdf-api/) for a managed cloud option (covered later in this guide).

## Why convert HTML to PDF in C#?

The need to generate PDFs from HTML is common in C# applications involving reports, invoices, contracts, or web content archiving. By using tools like wkhtmltopdf or the Nutrient API, developers can render styled HTML content into precise, print-ready PDF files — all from within a C# backend or console app.

This tutorial provides two effective methods for performing HTML-to-PDF conversion in C#:

- A free command-line tool (wkhtmltopdf)

- A cloud-based and self-hosted solution via the Nutrient PDF API

## Development considerations

Before getting started, note that wkhtmltopdf is a command-line tool with no built-in graphical user interface (GUI). It’s an open source tool created in 2008 by Jakob Truelsen, and it was [archived on 2 January 2023](https://github.com/wkhtmltopdf/wkhtmltopdf/issues/5160) — the project is read-only and no longer receives bug fixes, security patches, or browser-engine updates.

If you’re considering a commercial solution, Nutrient offers some options for you:

- [HTML-to-PDF in C# API](https://www.nutrient.io/api/html-to-pdf-api/) — A REST API/hosted solution that gives you 50 free conversions per month and offers additional packages for a higher processing quota.

- [HTML to PDF in C#](https://www.nutrient.io/guides/dotnet/conversion/html-to-pdf.md) — Our self-hosted solution backed by our GdPicture.NET library.

Our solutions are regularly maintained, with releases occurring multiple times throughout the year. We also offer one-on-one support to handle any issues or challenges you may encounter.

### Requirements

- [Visual Studio Code](https://code.visualstudio.com/) installed on your machine.

- The [C# extension](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) for Visual Studio Code.

- Basic knowledge of C# and.NET console applications.

## Installing wkhtmltopdf

To install wkhtmltopdf, follow the steps for your machine below.

### On Windows

1. Download the wkhtmltopdf binary from the [official website](https://wkhtmltopdf.org/downloads.html).

2. Once the download is complete, extract the files to a directory of your choice.

3. Add the directory containing the wkhtmltopdf binary to your system’s `PATH` environment variable. This will allow you to run the wkhtmltopdf command from anywhere on your system.

4. Verify that wkhtmltopdf is installed correctly by running the following command in your terminal:

```bash

where wkhtmltopdf

```

The wkhtmltopdf executable will be located in the installation directory — by default, it’s `C:\Program Files\wkhtmltopdf\bin`.

### On macOS

1. You can install wkhtmltopdf using [Homebrew](https://formulae.brew.sh/cask/wkhtmltopdf):

   ```bash

   brew install --cask wkhtmltopdf
   ```

2. Or, you can download the binary from the [official website](https://wkhtmltopdf.org/downloads.html).

   If you choose to download the binary from the official website, you may see an error message that says the following:

   > "wkhtmltox-0.12.6-2.macos-cocoa.pkg" cannot be opened because it is from an unidentified developer.

   This means your Mac’s security settings are preventing you from installing the package.

   To install the package, you’ll need to change your security settings to allow installation of packages from unidentified developers. Follow the steps below:

   - Right-click the `wkhtmltox-0.12.6-2.macos-cocoa.pkg` file and select **Open**.
   - A warning message will appear. Click **Open**.
   - The package installer will open. Follow the prompts to complete the installation.

3. Verify that wkhtmltopdf is installed correctly by running the following command in your terminal:

```bash

which wkhtmltopdf

```

The wkhtmltopdf executable will be located in the installation directory — by default, it’s `/usr/local/bin`.

### On Ubuntu

If you’re using Ubuntu, you can install wkhtmltopdf by running the following command:

```bash

sudo apt-get install wkhtmltopdf

```

## Creating a C# project for HTML-to-PDF conversion

Once wkhtmltopdf is installed, follow the steps below to set up a project.

1. Create a new directory for your project and open it in Visual Studio Code.

2. Open the terminal (press Control-backtick or Command-backtick).

3. Run the following command to create a new.NET console project:

   ```bash

   dotnet new console --framework net8.0
   ```

4. Replace the contents of `Program.cs` with the following code:

```cs

  class Program
  {
      static void Main(string[] args)
      {
          Console.WriteLine("Hello, World!");
      }
  }

```

### Method 1 — Using wkhtmltopdf to convert HTML to PDF in C#

1. Add the following namespace to the top of your `Program.cs` file:

   ```cs

   using System.Diagnostics
   ```

   The `System.Diagnostics` namespace provides classes and methods that allow you to interact with system processes, event logs, and performance counters.

2. In your `Main` method, create a new instance of the `ProcessStartInfo` class and set the `FileName` property to the path of the wkhtmltopdf binary:

   ```cs

     var processStartInfo = new ProcessStartInfo
           {
               // Pass the path of the wkhtmltopdf executable.
               FileName = "/usr/local/bin/wkhtmltopdf",
           };
   ```

   You can search for the executable in the file explorer. By default, it’s located in `C:\Program Files\wkhtmltopdf\bin` on Windows and in `/usr/local/bin` on Mac.

   If you’ve installed wkhtmltopdf using a package manager like `apt-get`, `yum`, or `brew`, you can check the path using these commands:

   - On Linux, type `whereis wkhtmltopdf`.
   - On macOS, type `brew info wkhtmltopdf`.

   Another solution is to use the full path of the executable. You can find the full path of the wkhtmltopdf executable by running the following command in your terminal:

   ```bash

   find / -name wkhtmltopdf 2>/dev/null
   ```

   This will search for the executable in the entire file system and print its location.

   Once you’ve found the path to the wkhtmltopdf executable, you can use it in the `ProcessStartInfo` class to run the process.

3. Set the `Arguments` property to include the input HTML file and the output PDF file, in that order:

   ```cs

   var inputHtml = "/Users/<username>/Desktop/<your-project-name>/bin/Debug/net8.0/input.html";
   var outputPdf = "output.pdf";

   var processStartInfo = new ProcessStartInfo
      {
         FileName = "/usr/local/bin/wkhtmltopdf",
         Arguments = $"{inputHtml} {outputPdf}",
      };
   ```

   The `input.html` file must be located in the same directory as the wkhtmltopdf executable. Make sure to use an absolute path to specify the location of the input HTML file and the output PDF file.

   For example, you created the `input.html` file in the `/Users/<username>/Desktop/<your-project-name>/bin/Debug/net8.0/input.html` directory.

4. Set the `UseShellExecute` property to `false` and `RedirectStandardOutput` to `true`:

   ```cs

   var processStartInfo = new ProcessStartInfo
           {
               // Pass the path of the wkhtmltopdf executable.
               FileName = "/usr/local/bin/wkhtmltopdf",
               Arguments = $"{inputHtml} {outputPdf}",
               UseShellExecute = false,
               RedirectStandardOutput = true,
               WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory
           };
   ```

   `UseShellExecute = false` allows the process to be started without creating a new window, and `RedirectStandardOutput = true` enables the output of the process to be read.

   The `WorkingDirectory` property is used to set the current directory of the process.

   `AppDomain.CurrentDomain.BaseDirectory` is used to set the current directory as the base directory of the application’s domain. This is necessary to ensure that the input and output files are located in the correct directory within the project.

5. Start the process using the `Process.Start` method, and wait for it to complete using the `WaitForExit` method:

```cs

using (var process = Process.Start(processStartInfo))
        {
            process?.WaitForExit();
            if (process?.ExitCode == 0)
            {
                Console.WriteLine("HTML to PDF conversion successful!");
            }
            else
            {
                Console.WriteLine("HTML to PDF conversion failed!");
                Console.WriteLine(process?.StandardOutput.ReadToEnd());
            }
        }

```

Once the process exits, check the `ExitCode` property to see if the conversion was successful. If the `ExitCode` is `0`, it means the conversion was successful, and a success message is printed. If the `ExitCode` isn’t `0`, it means the conversion failed and a failure message is printed, along with the standard output of the process, using the `StandardOutput.ReadToEnd()` method.

Find the complete code below:

```cs

// Program.cs

// See https://aka.ms/new-console-template for more information.
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        var inputHtml = "/Users/<username>/Desktop/<your-project-name>/bin/Debug/net8.0/input.html";
        var outputPdf = "output.pdf";

        if (!System.IO.File.Exists(inputHtml))
        {
            Console.WriteLine($"{inputHtml} file not found!");
            return;
        }

        var processStartInfo = new ProcessStartInfo
        {
            // Pass the path of the wkhtmltopdf executable.
            FileName = "/usr/local/bin/wkhtmltopdf",
            Arguments = $"{inputHtml} {outputPdf}",
            UseShellExecute = false,
            RedirectStandardOutput = true,
            WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory
        };

        Console.WriteLine($"Starting process with FileName: {processStartInfo.FileName} and Arguments: {processStartInfo.Arguments}");

       using (var process = Process.Start(processStartInfo))
        {
            process?.WaitForExit();
            if (process?.ExitCode == 0)
            {
                Console.WriteLine("HTML to PDF conversion successful!");
            }
            else
            {
                Console.WriteLine("HTML to PDF conversion failed!");
                Console.WriteLine(process?.StandardOutput.ReadToEnd());
            }
        }
    }
}

```

### Running the project

Run the project using the `dotnet run` command in the terminal.

## Method 2 — HTML to PDF in C# using Nutrient API

In addition to using wkhtmltopdf, you can also leverage the [Nutrient API](https://www.nutrient.io/api/html-to-pdf-api/) to convert HTML to PDF. The Nutrient API offers a robust and flexible solution for generating high-quality PDFs with various customization options. Below is a step-by-step guide on how to integrate Nutrient API into your C# project.

### Setting up Nutrient API

1. First, ensure you have an API key from [Nutrient API](https://dashboard.nutrient.io/sign_up/?product=processor). You’ll use this key to authenticate your requests.

2. Open VS Code and open a terminal in VS Code (Control-backtick).

3. Create a new directory for your project and navigate into it:

   ```bash

   mkdir nutrientApiDemo
   cd nutrientApiDemo
   ```

4. Initialize a new C# project:

   ```bash

   dotnet new console
   ```

5. Install the RestSharp package:

   ```bash

   dotnet add package RestSharp
   ```

6. Replace the contents of `Program.cs` with the provided code:

   ```csharp

   using System;
   using System.IO;
   using RestSharp;

   class Program
   {
   	static void Main(string[] args)
   	{
   		var apiKey = "your_api_key_here"; // Replace with your actual key
   		var client = new RestClient("https://api.nutrient.io/build");

   		var request = new RestRequest().AddHeader("Authorization", $"Bearer {apiKey}").AddFile("index.html", "index.html").AddParameter("instructions",
   				"{\"parts\": [{\"html\": \"index.html\"}]}",
   				ParameterType.RequestBody);

   		var response = client.PostAsync(request).Result;

   		if (response.IsSuccessful)
   		{
   			File.WriteAllBytes("result.pdf", response.RawBytes);
   			Console.WriteLine("PDF created successfully.");
   		}
   		else
   		{
   			Console.WriteLine($"Error: {response.StatusCode}");
   			Console.WriteLine(response.Content);
   		}
   	}
   }
   ```

   Replace "your_api_key_here" with your actual Nutrient API key. Make sure you have `index.html` in the same directory as your `Program.cs` file.

7. Run the project using the terminal:

   ```sh

   dotnet run
   ```

8. Check the output directory for `result.pdf` to see your newly generated PDF.

### Why use Nutrient API?

- **SOC 2 Type 2 audited** — Build secure workflows with encrypted API endpoints.

- **Easy integration** — Well-documented APIs and code samples make integration straightforward.

- **Robust and flexible** — Access more than 30 tools to process documents in multiple ways.

- **Simple and transparent pricing** — Choose a package based on your needs, with clear credit costs for each API tool and action.

## wkhtmltopdf vs. Nutrient API: Which to choose

| Criteria       | wkhtmltopdf                            | Nutrient API                                |
| -------------- | -------------------------------------- | ------------------------------------------- |
| Cost           | Free, open source                      | Commercial (50 free conversions/month)      |
| Maintenance    | Archived January 2023 — no updates     | Actively maintained, multiple releases/year |
| Setup          | Install and invoke a local binary      | REST API call, no local binary              |
| CSS/JS support | Older WebKit; struggles with modern JS | Current rendering engine                    |
| Asset handling | Manual                                 | Built in                                    |
| Support        | Community forums only                  | Dedicated team with SLA                     |
| Best for       | Simple, budget, or offline conversions | Production workloads needing reliability    |

## Conclusion

In this tutorial, you learned how to perform HTML-to-PDF conversion in C# using wkhtmltopdf. With this tool, you can easily convert HTML files to high-quality PDFs with various options for styling and formatting.

wkhtmltopdf is an open source command-line tool that offers a straightforward method for converting HTML to high-quality PDFs, though it may lack active maintenance.

Nutrient API, on the other hand, provides a commercial solution with advanced features and customization options, suitable for more complex PDF needs.

Get started with our [API product for free](https://www.nutrient.io/api/pricing/), or integrate a [free trial](https://www.nutrient.io/sdk/dotnet/getting-started.md) of our [.NET PDF SDK](https://www.nutrient.io/sdk/dotnet/).

## FAQ

#### Which method is better: wkhtmltopdf or Nutrient API?

It depends on your needs. wkhtmltopdf is great for simple, free HTML-to-PDF conversions, while Nutrient API offers robust features, cloud and on-premises support, and better reliability for production use.

#### Can I convert a string of HTML to PDF in C# without saving it to a file?

Yes. Using the Nutrient API or other libraries that accept raw HTML input in the request body allows you to convert HTML strings directly without writing temporary files.

#### Does wkhtmltopdf support CSS and JavaScript?

wkhtmltopdf supports most CSS styles and inline JavaScript but may struggle with modern JS frameworks or dynamic content rendered client-side.

#### Is wkhtmltopdf still maintained?

No. wkhtmltopdf was archived on 2 January 2023 and is now read-only. The library still functions, but it no longer receives security patches, bug fixes, or browser-engine updates. For new or mission-critical applications, a commercial alternative like the Nutrient API is recommended.

#### How can I debug failed HTML-to-PDF conversions in C#?

Check that all file paths are correct and wkhtmltopdf is accessible in your environment, and use `process.StandardOutput.ReadToEnd()` to view error messages from the wkhtmltopdf process.

#### Is the Nutrient API secure for sensitive HTML content?

Yes. The Nutrient API is SOC 2 Type 2 audited with encrypted endpoints, making it suitable for sensitive or regulated documents.
---

## Related pages

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

