---
title: "Build an Android PDF viewer with Nutrient (step-by-step)"
canonical_url: "https://www.nutrient.io/blog/how-to-build-an-android-pdf-viewer/"
md_url: "https://www.nutrient.io/blog/how-to-build-an-android-pdf-viewer.md"
last_updated: "2026-07-03T08:55:55.439Z"
description: "Build an Android PDF viewer with Nutrient. This step-by-step guide shows how to integrate, customize, and extend the Android PDF viewer library in your app."
---

**TL;DR**

This step-by-step guide demonstrates how to integrate Nutrient’s Android PDF SDK to build a feature-rich PDF viewer in Android applications. It covers project setup in Android Studio, adding the SDK dependency, displaying PDFs from assets and local storage, and accessing advanced features like annotations and form filling. The solution provides a customizable UI, 30+ built-in features, and high-fidelity PDF rendering using PDFium, making it suitable for enterprise applications requiring robust PDF viewing capabilities.

In this post, you’ll use our [Android PDF SDK](https://www.nutrient.io/sdk/android/) to integrate a PDF viewer into your Android application. With more than [3 billion active Android devices](https://www.theverge.com/2021/5/18/22440813/android-devices-active-number-smartphones-google-2021), in-app handling of PDF documents is a common requirement.

To kick off, we’ll [start](#getting-started) by setting up a new project in Android Studio to build your Android PDF viewer using Nutrient. We’ll walk you through opening a PDF document from the `android-assets` folder and later, how to access files from your [device’s local storage](#opening-a-local-pdf-file-on-android).

## What is an Android PDF viewer?

An Android PDF viewer allows you to render and display PDF documents inside your app without your users needing to download them or use an external application like a PDF reader. You can build one from scratch, or you can save dev time by deploying a commercial Android PDF viewer library, like the one Nutrient offers.

## Nutrient Android PDF viewer library

Nutrient’s [Android PDF viewer library](https://www.nutrient.io/guides/android/viewer.md) uses a high-fidelity, reliable, PDFium-based rendering engine that’s fast, precise, and feature rich. It enables you to quickly and painlessly embed a fully configurable PDF viewer in your Android application.

Nutrient SDKs are deployed in some of the world’s most popular applications, including Autodesk, Disney, Dropbox, IBM, and Lufthansa.

Key capabilities include:

- A customizable UI — Hide or add buttons, and match your look and feel.

- 30+ features — Easily add features like PDF editing, digital signatures, form filling, real-time document collaboration, and more.

- Dedicated support — Deploy faster by working 1-on-1 with our developers.

- Page modes and transition — Use single- or double-page modes and multiple scroll modes.

- Outline — Supports all custom variants and PDF action types.

- Bookmarks — Users can add, remove, and sort bookmarks.

- Reader view — Reflow text to present it in a single-column view.

- PNG and JPG — Open images in the viewer (in addition to PDFs).

You can [view our demo](https://www.nutrient.io/guides/android/viewer.md) to see what Nutrient is capable of and determine how you can use it for your project.

## Requirements

To get started, you’ll need:

- [Android Studio](https://developer.android.com/studio) — The official integrated development environment for Android

## How to integrate Nutrient for Android PDF viewing

The next few sections will walk you through the getting started process.

### Step 1 — Create a new Android project in Android Studio

1. Launch Android Studio and select **New Project**. Navigate to **File** > **New** > **New Project...** to start creating a new project for your Android app.![Screenshot of Android Studio’s 'New Project' setup wizard for creating an Android PDF viewer using Nutrient](@/assets/images/blog/2022/how-to-build-an-android-pdf-viewer/android-studio-new-project.png)

2. Select **Empty Activity** as the template for your project.![Image showing a menu in Android Studio that lets user choose an activity](@/assets/images/blog/2022/how-to-build-an-android-pdf-viewer/android-studio-select-activity.png)

3. Configure your project by setting the **App Name** (e.g. Nutrient Demo), choosing a **Save Location**, and selecting a **Build Configuration Language**. Ensure that the **Minimum SDK** is set to **API 23** or higher.![Image showing a wizard for project setup](@/assets/images/blog/2022/how-to-build-an-android-pdf-viewer/android-studio-new-project-wizard.png)

4. Click **Finish** to create your project in the specified directory.

### Step 2 — Add Nutrient’s PDF viewer library to your Android project

1. Open the `settings.gradle.kts` file located at the root of your project and add the Nutrient Maven repository:

```kotlin

dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://my.nutrient.io/maven")
        }
    }
}

```

2. Add the Nutrient dependency to your `app/build.gradle.kts` file:

```kotlin

dependencies {
    implementation("io.nutrient:nutrient:11.5.1")
}

```

### Step 3 — Display a PDF file using Nutrient in your Android app

To verify that Nutrient is successfully integrated into your application, open a PDF file with the ready-to-use [`PdfActivity`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui/-pdf-activity/index.html).

1. Place a PDF document in the `assets` directory of your Android project — for example, `src/main/assets/my-document.pdf`.

2. **Optional**— If you have a trial key or license key, add it to your `AndroidManifest.xml`. Otherwise, skip this step:

```xml

<application>
    <meta-data
        android:name="nutrient_license_key"
        android:value="YOUR_LICENSE_KEY_GOES_HERE" />...
</application>

```

3. Add `PdfActivity` to your app’s `AndroidManifest.xml`:

```xml

<application>
    <activity
        android:name="com.pspdfkit.ui.PdfActivity"
        android:windowSoftInputMode="adjustNothing" />
</application>

```

4. You can now start `PdfActivity` with the document from your `assets` directory:

```kotlin

val uri = Uri.parse("file:///android_asset/my-document.pdf")
val config = PdfActivityConfiguration.Builder(context).build()
PdfActivity.showDocument(this, uri, config)

```

```java

final Uri uri = Uri.parse("file:///android_asset/my-document.pdf");
final PdfActivityConfiguration config = new PdfActivityConfiguration.Builder(context).build();
PdfActivity.showDocument(this, uri, config);

```

5. [`PdfActivity`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui/-pdf-activity/index.html) will now present the document from your `assets` directory.![GIF showing the application running on the Android emulator](@/assets/images/blog/2022/how-to-build-an-android-pdf-viewer/displaying-doc-from-assets-dir.gif)

This is a simple demonstration using the `android_assets` folder. This folder is a read-only directory that, during the build process, gets built into the `.apk` file in most Android applications. For more information on its use, refer to the following section.

## How to open a local PDF file on Android

This section will guide you through displaying a PDF file from the device’s local storage. Before starting, it’s essential to understand the types of local storage available on Android devices.

### Understanding Android storage types

Android devices offer two primary types of storage locations:

- **Internal storage** — Smaller and always available. Ideal for app-specific data.

- **External storage** — Larger but may not always be available. Useful for files that need to be shared or stored long-term.

### How to open a PDF from app-specific storage

Absolute paths must never be hardcoded. Directories where your app stores files aren’t guaranteed to be stable between different devices or even between app restarts. As such, we recommend using methods from [`Context`](https://developer.android.com/reference/android/content/Context.html) to access different special file system directories.

1. Opening a PDF from internal storage

Use the [`getFilesDir`](https://developer.android.com/reference/android/content/Context.html#getFilesDir()) method from `Context` to get the path to the file system directory where your internal files are stored:

```kotlin

// This will fail if "my-document.pdf" isn't created in
// advance using `openFileOutput(String, int)`.

val uri = Uri.fromFile(File(getFilesDir(), "my-document.pdf"))
val config = PdfActivityConfiguration.Builder(context).build()
PdfActivity.showDocument(this, uri, config)

```

```java

// This will fail if "my-document.pdf" isn't created in
// advance using `openFileOutput(String, int)`.

final Uri uri = Uri.fromFile(new File(getFilesDir(), "my-document.pdf"));
final PdfActivityConfiguration config = new PdfActivityConfiguration.Builder(context).build();
PdfActivity.showDocument(this, uri, config);

```

Learn more about `openFileOutput(String, int)` [here](https://developer.android.com/reference/android/content/Context#openFileOutput(java.lang.String,%20int)).

2. Opening a PDF from external storage

Use [`Context#getExternalFilesDir(null)`](https://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String)) to access the directory that the system provides for your app on external storage:

```kotlin

// This will fail if external storage is not mounted correctly
// or if "my-document.pdf" isn't present in the directory.
// returned by getExternalFilesDir(null)

val uri = Uri.fromFile(File(getExternalFilesDir(null), "my-document.pdf"))
val config = PdfActivityConfiguration.Builder(context).build()
PdfActivity.showDocument(this, uri, config)

```

```java

// This will fail if external storage is not mounted correctly
// or if "my-document.pdf" isn't present in the directory.
// returned by getExternalFilesDir(null)

final Uri uri = Uri.fromFile(new File(getExternalFilesDir(null), "my-document.pdf"));
final PdfActivityConfiguration config = new PdfActivityConfiguration.Builder(context).build();
PdfActivity.showDocument(this, uri, config);

```

### How to open a PDF from shared storage

As the name suggests, shared storage is shared between all the applications running on a device. Shared storage directories and their data aren’t affected by a particular app’s uninstall.

The recommended method for accessing shared storage is through the [Storage Access Framework](https://developer.android.com/guide/topics/providers/document-provider.html) (SAF). According to the documentation, “the SAF makes it simple for users to browse and open documents, images, and other files across all of their preferred document storage providers. A standard, easy-to-use UI lets users browse files and access recents in a consistent way across apps and providers.”

To open a PDF using SAF, invoke the [`ACTION_OPEN_DOCUMENT`](https://developer.android.com/reference/android/content/Intent#ACTION_OPEN_DOCUMENT) intent as follows:

```kotlin

package com.example.yourappid; // Replace with your actual app ID or package name.

import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import com.pspdfkit.configuration.activity.PdfActivityConfiguration
import com.pspdfkit.ui.PdfActivity

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()

        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply{
            addCategory(Intent.CATEGORY_OPENABLE)
            type = "application/pdf"
        }

        registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
            onDone(result)
        }.launch(intent)

    }

    private fun onDone(result: ActivityResult){
        if(result.resultCode == Activity.RESULT_OK) {
            val resultData = result.data
            resultData?.data?.also { uri ->
                val documentUri = Uri.parse(uri.toString())
                val config = PdfActivityConfiguration.Builder(this).build()
                PdfActivity.showDocument(this, documentUri, config)

            }
        }
    }
}

```

```java

package com.example.yourappid; // Replace with your actual app ID or package name.

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import androidx.activity.ComponentActivity;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import com.pspdfkit.configuration.activity.PdfActivityConfiguration;
import com.pspdfkit.ui.PdfActivity;

public class MainActivity extends AppCompatActivity {

    private ActivityResultLauncher<Intent> launcher;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        launcher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                this::onDone);

        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("application/pdf");

        launcher.launch(intent);

    }

    private void onDone(ActivityResult result) {
        if (result.getResultCode() == Activity.RESULT_OK) {
            Intent resultData = result.getData();
            if (resultData!= null) {
                Uri uri = resultData.getData();
                if (uri!= null) {
                    Uri documentUri = Uri.parse(uri.toString());
                    PdfActivityConfiguration config = new PdfActivityConfiguration.Builder(this).build();
                    PdfActivity.showDocument(this, documentUri, config);
                }
            }
        }
    }
}

```![GIF showing the application running on the Android emulator](@/assets/images/blog/2022/how-to-build-an-android-pdf-viewer/displaying-doc-from-shared-storage.gif)

Since the user is browsing and selecting the document through a file picker, they’re completely aware of what files your app has access to. Hence, your application doesn’t need to ask for runtime permissions.

### Advanced PDF handling with Nutrient

Nutrient’s Android library isn’t just limited to opening and manipulating documents from local storage. Nutrient can also open documents:

- From remote storage

- From Nutrient Document Engine

- From a custom data provider

- That are password protected

To learn more about [opening PDF documents](https://www.nutrient.io/blog/open-pdf-android/) in Android apps, refer to our related blog post.

## Open source options vs. Nutrient

If you only need to display PDFs, Android has free options:

- `PdfRenderer` is built into Android (API 21+). It renders PDF pages to bitmaps that you draw yourself — there’s no built-in UI, text selection, annotation, or form support, so you build everything around it.

- `AndroidPdfViewer` is a widely used open source view widget built on PdfiumAndroid. The original `barteksc` project is no longer actively maintained — a community fork (`DImuthuUpe/AndroidPdfViewer`) continues it. It gives you a scrollable, zoomable viewer with far less setup, but it’s view-focused — it doesn’t handle annotation editing, form filling, or signing.

Both are a good fit for read-only display. What they don’t cover is document interaction — creating and editing annotations, filling and submitting forms, electronic and digital signatures, redaction, and a configurable UI. Nutrient’s Android PDF SDK builds on the same PDFium engine but adds that editing and UI layer on top, with commercial support.

Use `PdfRenderer` or `AndroidPdfViewer` for simple, read-only viewing; reach for Nutrient when users need to annotate, fill, sign, or edit documents.

## Conclusion

This post demonstrated how to integrate Nutrient’s Android PDF viewer library into an Android application and present a PDF document from local directories. If you hit any snags, don’t hesitate to [reach out](https://www.nutrient.io/support/) to our Support team for help.

At Nutrient, we offer a commercial, feature-rich, and completely customizable Android PDF library that’s easy to integrate and comes with well-documented APIs to handle advanced use cases. Try it for free, or visit [our demo](https://www.nutrient.io/guides/android/viewer.md) to see it in action.

## FAQ

#### What is an intent in Android?

Intents are messages you pass to the Android OS. They describe actions you want the system to perform on your behalf. After describing an intent, you pass it to the OS and act on the result. Usually, the result is passed to a callback function.

#### What’s a request code used for in Android?

In Android, request codes help identify intents and their corresponding results. The best place to declare a request code is in a separate file that holds all your constants.

#### More about PdfActivity

`PdfActivity` is a public class that extends [`AppCompatActivity`](https://developer.android.com/reference/kotlin/androidx/appcompat/app/AppCompatActivity.html) and implements [`PdfUi`], [`PdfActivityListener`], and `PdfActivityComponentsApi`. It’s an activity with fully integrated views and behavior, and it can be invoked by the simple helper methods [`showDocument`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui/-pdf-activity/show-document.html?query=open%20fun%20showDocument\(context:%20Context,%20documentUri:%20Uri,%20password:%20String,%20configuration:%20PdfActivityConfiguration\)) and [`showImage`](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui/-pdf-activity/show-image.html?query=open%20fun%20showImage\(context:%20Context,%20imageUri:%20Uri,%20configuration:%20PdfActivityConfiguration\)).

#### More about the showDocument helper method

The `showDocument(Context context, Uri documentUri, PdfActivityConfiguration configuration)` helper method opens a new `PdfActivity` displaying a passed document. If the document is password protected, Nutrient will prompt the user to enter the password. If you want to supply the password programmatically, use the `showDocument(Context context, Uri documentUri, String password, PdfActivityConfiguration configuration)` method overload, which has been documented [here](https://www.nutrient.io/api/android/nutrient/com.pspdfkit.ui/-pdf-activity/show-document.html?query=open%20fun%20showDocument\(context:%20Context,%20documentUri:%20Uri,%20password:%20String,%20configuration:%20PdfActivityConfiguration\)).

## Related reading

- [How to build a Flutter PDF viewer](https://www.nutrient.io/blog/how-to-build-a-flutter-pdf-viewer.md) — Complete Flutter PDF integration tutorial

- [How to build a React Native PDF viewer](https://www.nutrient.io/blog/how-to-build-a-react-native-pdf-viewer.md) — Cross-platform PDF viewing with React Native

- [Top five document viewers for developers](https://www.nutrient.io/blog/top-doc-viewers/) — Compare DOCX and PDF viewer libraries side by side

Explore all available platforms on the [mobile SDK overview](https://www.nutrient.io/sdk/mobile-overview/).
---

## Related pages

- [Accessibility Untangled Why It Matters Guide](/blog/accessibility-untangled-why-it-matters-guide.md)
- [The business case for accessibility: Five ways it drives enterprise value](/blog/5-ways-accessibility-drives-enterprise-value.md)
- [Advanced Techniques For React Native Ui Components](/blog/advanced-techniques-for-react-native-ui-components.md)
- [Auto Tagging And Document Accessibility In Dotnet Sdk](/blog/auto-tagging-and-document-accessibility-in-dotnet-sdk.md)
- [Ai Document Automation Extraction To Action](/blog/ai-document-automation-extraction-to-action.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)
- [Convert One Drive Files To Pdf In Sharepoint](/blog/convert-one-drive-files-to-pdf-in-sharepoint.md)
- [Complete Guide To Pdfjs](/blog/complete-guide-to-pdfjs.md)
- [Construction Document Data Extraction](/blog/construction-document-data-extraction.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)
- [The CTO’s AI playbook: Why accountability architecture beats orchestration](/blog/cto-ai-playbook-accountability-architecture.md)
- [Digital Workflow Automation](/blog/digital-workflow-automation.md)
- [Digital Signatures](/blog/digital-signatures.md)
- [Document Ai Vs Ocr](/blog/document-ai-vs-ocr.md)
- [How To Build A Dotnet Maui Pdf Viewer](/blog/how-to-build-a-dotnet-maui-pdf-viewer.md)
- [Document Viewer](/blog/document-viewer.md)
- [How To Build A Flutter Pdf Viewer](/blog/how-to-build-a-flutter-pdf-viewer.md)
- [Emerging threats: Your logging system may be an agentic threat vector](/blog/emerging-threats-your-logging-system.md)
- [or](/blog/how-to-build-a-javascript-pdf-viewer-with-pdfjs.md)
- [How To Build A Powerpoint Viewer Using Javascript](/blog/how-to-build-a-powerpoint-viewer-using-javascript.md)
- [or](/blog/how-to-build-a-nextjs-pdf-viewer.md)
- [How To Build A React Powerpoint Viewer](/blog/how-to-build-a-react-powerpoint-viewer.md)
- [How To Build A React Native Pdf Viewer](/blog/how-to-build-a-react-native-pdf-viewer.md)
- [or](/blog/how-to-build-a-reactjs-pdf-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)
- [How To Build A Reactjs Viewer With Pdfjs](/blog/how-to-build-a-reactjs-viewer-with-pdfjs.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)
- [How To Create Pdfs With React To Pdf](/blog/how-to-create-pdfs-with-react-to-pdf.md)
- [or](/blog/how-to-convert-html-to-pdf-using-react.md)
- [How To Embed A Pdf Viewer In Your Website](/blog/how-to-embed-a-pdf-viewer-in-your-website.md)
- [How To Convert Html To Pdf Using Html2pdf](/blog/how-to-convert-html-to-pdf-using-html2pdf.md)
- [How To Edit Pdfs Using Ios Pdf Library](/blog/how-to-edit-pdfs-using-ios-pdf-library.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)
- [From an HTML string.](/blog/html-in-pdf-format.md)
- [Swift Package Manager](/blog/mobile-pdf-sdk.md)
- [Pdf Page Labels](/blog/pdf-page-labels.md)
- [`elements` come from your document parser — each has a type and content.](/blog/multimodal-rag.md)
- [Linearized Pdf](/blog/linearized-pdf.md)
- [Pdf Ua Compliance Guide](/blog/pdf-ua-compliance-guide.md)
- [Open Pdf In Your Web App](/blog/open-pdf-in-your-web-app.md)
- [Online Document Viewer](/blog/online-document-viewer.md)
- [Nutrient Vs Conga Composer](/blog/nutrient-vs-conga-composer.md)
- [Pdfjs Area Annotations Canvas Capture](/blog/pdfjs-area-annotations-canvas-capture.md)
- [Pdf Sdk Performance Benchmark](/blog/pdf-sdk-performance-benchmark.md)
- [Pdfjs Eventbus Guide](/blog/pdfjs-eventbus-guide.md)
- [Pdfjs Coordinate Systems Pdf To Screen](/blog/pdfjs-coordinate-systems-pdf-to-screen.md)
- [Pdf Sdk Compliance Security Checklist](/blog/pdf-sdk-compliance-security-checklist.md)
- [Pdfjs Navigation Zoom Rotation](/blog/pdfjs-navigation-zoom-rotation.md)
- [Pdfjs Annotation Editor Layer](/blog/pdfjs-annotation-editor-layer.md)
- [Pdfjs Limitations Commercial Upgrade](/blog/pdfjs-limitations-commercial-upgrade.md)
- [Pdfjs Native Annotation Layer Forms](/blog/pdfjs-native-annotation-layer-forms.md)
- [Pdfjs Rendering Overlays React Portals](/blog/pdfjs-rendering-overlays-react-portals.md)
- [Pdfjs React Viewer Setup](/blog/pdfjs-react-viewer-setup.md)
- [Pdfjs Server Side Text Extraction](/blog/pdfjs-server-side-text-extraction.md)
- [Pdfjs Pdf Page Manipulation Pdf Lib](/blog/pdfjs-pdf-page-manipulation-pdf-lib.md)
- [Pdfjs Sticky Note Annotations](/blog/pdfjs-sticky-note-annotations.md)
- [Pdfjs Thumbnail Sidebar](/blog/pdfjs-thumbnail-sidebar.md)
- [Pdfjs Text Search Pdffindcontroller](/blog/pdfjs-text-search-pdffindcontroller.md)
- [Pdfjs Text Highlight Annotations](/blog/pdfjs-text-highlight-annotations.md)
- [Process Flows](/blog/process-flows.md)
- [React Native Pdf Annotation](/blog/react-native-pdf-annotation.md)
- [Vector Pdf](/blog/vector-pdf.md)
- [or](/blog/sample-blog-updated.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)
- [Convert an HTML file to PDF.](/blog/top-ten-ways-to-convert-html-to-pdf.md)
- [What Is A Vpat](/blog/what-is-a-vpat.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)
- [What Is Pdf Ua](/blog/what-is-pdf-ua.md)

