---
description: Capacitor plugin to display PDF documents in a fullscreen native viewer with paging, zoom, and password support. Supports Android and iOS.
title: Capacitor PDF Viewer Plugin for Android and iOS - Capawesome
image: https://capawesome.io/docs/assets/images/social/sdks/capacitor/pdf-viewer.png
---

<!doctype html> 

[Skip to content ](#capacitor-pdf-viewer-plugin) 

[📲 Introducing **Build Sharing** — get your builds onto testers' devices with a link & QR code. No account required. ](/blog/share-mobile-app-builds-with-testers/) 

* [ SDKs ](/docs/sdks/)
* [ Formbricks ](/docs/sdks/capacitor/formbricks/)
* [ Geocoder ](/docs/sdks/capacitor/geocoder/)
* [ Google Sign-In ](/docs/sdks/capacitor/google-sign-in/)
* [ Grafana Faro ](/docs/sdks/capacitor/grafana-faro/)
* [ Gyroscope ](/docs/sdks/capacitor/gyroscope/)
* [ Haptics ](/docs/sdks/capacitor/haptics/)
* [ Home Indicator ](/docs/sdks/capacitor/home-indicator/)
* [ In-App Browser ](/docs/sdks/capacitor/in-app-browser/)
* [ Install Referrer ](/docs/sdks/capacitor/install-referrer/)
* [ Intercom ](/docs/sdks/capacitor/intercom/)
* [ Intune ](/docs/sdks/capacitor/intune/)
* [ Keep Awake ](/docs/sdks/capacitor/keep-awake/)
* [ libSQL ](/docs/sdks/capacitor/libsql/)
* [ Light Sensor ](/docs/sdks/capacitor/light-sensor/)
* [ Live Update ](/docs/sdks/capacitor/live-update/)
* [ Localization ](/docs/sdks/capacitor/localization/)
* [ Mail Composer ](/docs/sdks/capacitor/mail-composer/)
* [ Managed Configurations ](/docs/sdks/capacitor/managed-configurations/)
* [ Maps Launcher ](/docs/sdks/capacitor/maps-launcher/)
* [ Media Session ](/docs/sdks/capacitor/media-session/)
* [ ML Kit ](/docs/sdks/capacitor/mlkit/)
* [ Navigation Bar ](/docs/sdks/capacitor/navigation-bar/)
* [ Network ](/docs/sdks/capacitor/network/)
* [ NFC ](/docs/sdks/capacitor/nfc/)
* [ Node.js ](/docs/sdks/capacitor/nodejs/)
* [ OAuth ](/docs/sdks/capacitor/oauth/)
* [ Passkeys ](/docs/sdks/capacitor/passkeys/)
* [ Password Autofill ](/docs/sdks/capacitor/password-autofill/)
* [ PDF Generator ](/docs/sdks/capacitor/pdf-generator/)
* PDF Viewer [ PDF Viewer ](/docs/sdks/capacitor/pdf-viewer/)
* [ iOS ](#ios)
* [ Web ](#web)
* [ Configuration ](#configuration)
* [ Usage ](#usage)
* [ API ](#api)
* [ FAQ ](#faq)
* [ Related Plugins ](#related-plugins)
* [ Newsletter ](#newsletter)
* [ Changelog ](#changelog)
* [ License ](#license)
* [ Pedometer ](/docs/sdks/capacitor/pedometer/)
* [ Permissions ](/docs/sdks/capacitor/permissions/)
* [ Phone Dialer ](/docs/sdks/capacitor/phone-dialer/)
* [ Photo Editor ](/docs/sdks/capacitor/photo-editor/)
* [ Photo Manipulator ](/docs/sdks/capacitor/photo-manipulator/)
* [ PixLive ](/docs/sdks/capacitor/pixlive/)
* [ PostHog ](/docs/sdks/capacitor/posthog/)
* [ Printer ](/docs/sdks/capacitor/printer/)
* [ Privacy Screen ](/docs/sdks/capacitor/privacy-screen/)
* [ Proximity Sensor ](/docs/sdks/capacitor/proximity-sensor/)
* [ Purchases ](/docs/sdks/capacitor/purchases/)
* [ RealtimeKit ](/docs/sdks/capacitor/realtimekit/)
* [ Root Detection ](/docs/sdks/capacitor/root-detection/)
* [ Screen Brightness ](/docs/sdks/capacitor/screen-brightness/)
* [ Screen Orientation ](/docs/sdks/capacitor/screen-orientation/)
* [ Screen Reader ](/docs/sdks/capacitor/screen-reader/)
* [ Screenshot ](/docs/sdks/capacitor/screenshot/)
* [ Secure Preferences ](/docs/sdks/capacitor/secure-preferences/)
* [ Settings Launcher ](/docs/sdks/capacitor/settings-launcher/)
* [ Shake ](/docs/sdks/capacitor/shake/)
* [ Silent Mode ](/docs/sdks/capacitor/silent-mode/)
* [ SIM ](/docs/sdks/capacitor/sim/)
* [ SMS Composer ](/docs/sdks/capacitor/sms-composer/)
* [ Speech Recognition ](/docs/sdks/capacitor/speech-recognition/)
* [ Speech Synthesis ](/docs/sdks/capacitor/speech-synthesis/)
* [ Share Target ](/docs/sdks/capacitor/share-target/)
* [ Square Mobile Payments ](/docs/sdks/capacitor/square-mobile-payments/)
* [ SQLite ](/docs/sdks/capacitor/sqlite/)
* [ Superwall ](/docs/sdks/capacitor/superwall/)
* [ System WebView ](/docs/sdks/capacitor/system-webview/)
* [ Tauri ](/docs/sdks/capacitor/tauri/)
* [ Text Interaction ](/docs/sdks/capacitor/text-interaction/)
* [ Text Zoom ](/docs/sdks/capacitor/text-zoom/)
* [ Thermal State ](/docs/sdks/capacitor/thermal-state/)
* [ Toast ](/docs/sdks/capacitor/toast/)
* [ Torch ](/docs/sdks/capacitor/torch/)
* [ Vault ](/docs/sdks/capacitor/vault/)
* [ Volume ](/docs/sdks/capacitor/volume/)
* [ Wallet ](/docs/sdks/capacitor/wallet/)
* [ Wifi ](/docs/sdks/capacitor/wifi/)
* [ YouTube Player ](/docs/sdks/capacitor/youtube-player/)
* [ Zip ](/docs/sdks/capacitor/zip/)
* [ Cordova ](/docs/sdks/cordova/)
* [ Cloud ](/docs/cloud/)
* [ Integrations ](/docs/cloud/live-updates/integrations/)
* Concepts
* Reference
* [ Troubleshooting ](/docs/cloud/live-updates/troubleshooting/)
* [ FAQ ](/docs/cloud/live-updates/faq/)
* [ Native Builds ](/docs/cloud/native-builds/)
* [ Set Up Environments ](/docs/cloud/native-builds/environments/)
* [ Overwrite Native Configurations ](/docs/cloud/native-builds/native-configurations/)
* [ Auto-Increment Build Numbers ](/docs/cloud/native-builds/auto-incrementing-build-numbers/)
* [ Configure the Web Build Script ](/docs/cloud/native-builds/web-build-script/)
* [ Build from a Monorepo ](/docs/cloud/native-builds/monorepo/)
* [ Use pnpm, Yarn, or bun ](/docs/cloud/native-builds/package-managers/)
* [ Install Private npm Packages ](/docs/cloud/native-builds/npm-private-registry/)
* [ Override the Java Version ](/docs/cloud/native-builds/override-java-version/)
* [ Custom iOS Provisioning Profiles ](/docs/cloud/native-builds/custom-ios-provisioning-profiles/)
* [ Build without Git ](/docs/cloud/native-builds/build-without-git/)
* [ Access Git Behind a Firewall ](/docs/cloud/native-builds/firewall-access/)
* [ Integrations ](/docs/cloud/native-builds/integrations/)
* Reference
* [ Troubleshooting ](/docs/cloud/native-builds/troubleshooting/)
* [ FAQ ](/docs/cloud/native-builds/faq/)
* [ App Store Publishing ](/docs/cloud/app-store-publishing/)
* [ Submit a Build ](/docs/cloud/app-store-publishing/submit-a-build/)
* [ Submit Automatically After a Build ](/docs/cloud/app-store-publishing/submit-automatically/)
* [ Troubleshooting ](/docs/cloud/app-store-publishing/troubleshooting/)
* [ FAQ ](/docs/cloud/app-store-publishing/faq/)
* [ Automations ](/docs/cloud/automations/)
* [ Reference ](/docs/cloud/automations/reference/)
* [ Troubleshooting ](/docs/cloud/automations/troubleshooting/)
* [ FAQ ](/docs/cloud/automations/faq/)
* [ Assist ](/docs/cloud/assist/)
* [ CLI ](/docs/cloud/cli/)
* APIs and SDKs
* [ Webhooks ](/docs/cloud/webhooks/)
* [ Integrations ](/docs/cloud/integrations/)
* Notifications
* Account
* [ Organization ](/docs/cloud/organizations/)
* [ Two-Factor Enforcement ](/docs/cloud/organizations/two-factor-authentication/)
* [ Audit Logs ](/docs/cloud/organizations/audit-logs/)
* [ Billing ](/docs/cloud/organizations/billing/)
* [ License Keys ](/docs/cloud/license-keys/)
* [ AI ](/docs/ai/)
* [ Insiders ](/docs/insiders/)
* [ Billing & Plans ](/docs/insiders/billing-and-plans/)
* [ FAQ ](/docs/insiders/faq/)
* [ License ](https://capawesome.io/legal/eula/)
* [ Support ](/docs/support/)
* [ Contributing ](/docs/contributing/)
* Contributing code
* [ Code of Conduct ](/docs/contributing/code-of-conduct/)
* [ Questions ](https://docs.github.com/en/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion#creating-a-discussion)
* [ Blog ](/blog/)
* Categories

* [ iOS ](#ios)
* [ Web ](#web)
* [ Configuration ](#configuration)
* [ Usage ](#usage)
* [ API ](#api)
* [ FAQ ](#faq)
* [ Related Plugins ](#related-plugins)
* [ Newsletter ](#newsletter)
* [ Changelog ](#changelog)
* [ License ](#license)

# Capacitor PDF Viewer Plugin[¶](#capacitor-pdf-viewer-plugin "Permanent link")

Capacitor plugin to display PDF documents in a fullscreen native viewer.

[ ![Deliver Live Updates to your Capacitor app with Capawesome Cloud](../../../assets/external/cloud.capawesome.io/assets/banners/cloud-build-and-deploy-capacitor-apps.69628c3f.png) ](https://cloud.capawesome.io/) 

## Features[¶](#features "Permanent link")

* 📄 **Fullscreen Viewer**: Display PDF documents in a fullscreen native viewer with a toolbar.
* 📖 **Paging**: Scroll through pages and jump to an initial page.
* 🔍 **Zoom**: Pinch to zoom in and out.
* 🔑 **Password Protection**: Open password-protected PDF documents.
* 🔔 **Events**: Listen for page changes and the closing of the viewer.
* 🔒 **App Store safe**: Uses only official platform APIs.
* 🤝 **Compatibility**: Works alongside the [File Opener](https://capawesome.io/docs/sdks/capacitor/file-opener/) and [File Picker](https://capawesome.io/docs/sdks/capacitor/file-picker/) plugins.
* 📦 **CocoaPods & SPM**: Supports CocoaPods and Swift Package Manager for iOS.
* 🔁 **Up-to-date**: Always supports the latest Capacitor version.

Missing a feature? Just [open an issue](https://github.com/capawesome-team/capacitor-plugins/issues) and we'll take a look!

## Use Cases[¶](#use-cases "Permanent link")

The PDF Viewer plugin is typically used whenever an app needs to present a PDF document to the user, for example:

* **Invoices and receipts**: Display invoices or receipts that your app has generated or downloaded.
* **Reports and manuals**: Let users read reports, product manuals, or other multi-page documents with paging and zoom.
* **Confidential documents**: Open password-protected PDF documents such as payslips or bank statements.
* **Reading progress**: Use the `pageChange` event to remember the last read page and reopen the document there via the `page` option.

## Compatibility[¶](#compatibility "Permanent link")

| Plugin Version | Capacitor Version | Status         |
| -------------- | ----------------- | -------------- |
| 0.x.x          | \>=8.x.x          | Active support |

## Installation[¶](#installation "Permanent link")

You can use our **AI-Assisted Setup** to install the plugin. Add the [Capawesome Skills](https://github.com/capawesome-team/skills) to your AI tool using the following command:

`[](#%5F%5Fcodelineno-0-1)npx skills add capawesome-team/skills --skill capacitor-plugins
`

Then use the following prompt:

`` [](#%5F%5Fcodelineno-1-1) Use the `capacitor-plugins` skill from `capawesome-team/skills` to install the `@capawesome/capacitor-pdf-viewer` plugin in my project.
 ``

If you prefer **Manual Setup**, install the plugin by running the following commands and follow the platform-specific instructions below:

`[](#%5F%5Fcodelineno-2-1)npm install @capawesome/capacitor-pdf-viewer
[](#%5F%5Fcodelineno-2-2)npx cap sync
`

### Android[¶](#android "Permanent link")

On Android, this plugin uses the [android-pdf-viewer](https://github.com/oothp/AndroidPdfViewer) library, which renders PDF documents with [Pdfium](https://pdfium.googlesource.com/pdfium/). Be aware that the library bundles the Pdfium native libraries, which add about 10 to 16 MB (uncompressed, across all ABIs) to your app. If you publish your app as an [Android App Bundle](https://developer.android.com/guide/app-bundle), each device only downloads the native libraries for its own ABI, which significantly reduces the download size. Also note that the viewer does not support text selection on Android.

#### Share Button[¶](#share-button "Permanent link")

If you use the share button (see the `showShareButton` option), you need to specify the directories that contain the PDF files you want to share. To do this, create a new file named `file_paths.xml` in the `res/xml` directory of your Android project (e.g. `android/app/src/main/res/xml/file_paths.xml`). Here is an example of the content of the file:

`[](#%5F%5Fcodelineno-3-1)<?xml version="1.0" encoding="utf-8"?>
[](#%5F%5Fcodelineno-3-2)<paths xmlns:android="http://schemas.android.com/apk/res/android">
[](#%5F%5Fcodelineno-3-3)    <files-path name="files" path="." />
[](#%5F%5Fcodelineno-3-4)    <cache-path name="cache" path="." />
[](#%5F%5Fcodelineno-3-5)    <external-files-path name="external-files" path="." />
[](#%5F%5Fcodelineno-3-6)    <external-cache-path name="external-cache" path="." />
[](#%5F%5Fcodelineno-3-7)    <external-path name="external" path="." />
[](#%5F%5Fcodelineno-3-8)</paths>
`

More information can be found in the [Android documentation](https://developer.android.com/training/secure-file-sharing/setup-sharing#DefineMetaData).

#### Variables[¶](#variables "Permanent link")

This plugin will use the following project variables (defined in your app’s `variables.gradle` file):

* `$androidPdfViewerVersion` version of `io.github.oothp:android-pdf-viewer` (default: `3.2.0-beta06`)

### iOS[¶](#ios "Permanent link")

On iOS, this plugin uses the [PDFKit](https://developer.apple.com/documentation/pdfkit) framework. No additional configuration is required.

### Web[¶](#web "Permanent link")

This plugin is not available on the web. Browsers ship with a built-in PDF viewer, so you can simply render a PDF document using an `<iframe>` or `<object>` element.

## Configuration[¶](#configuration "Permanent link")

No configuration required for this plugin.

## Usage[¶](#usage "Permanent link")

The following examples show how to open a PDF document, unlock a password-protected file, close the viewer, and listen for page changes and the viewer being closed.

The plugin only supports local files. Remote URLs must be downloaded first, for example with the `downloadFile(...)` method of the [Filesystem](https://capacitorjs.com/docs/apis/filesystem) plugin.

### Open a PDF document[¶](#open-a-pdf-document "Permanent link")

Open a local PDF file in a fullscreen native viewer. You can set a custom toolbar title and the page to display initially. Only available on Android and iOS:

`[](#%5F%5Fcodelineno-4-1)import { PdfViewer } from '@capawesome/capacitor-pdf-viewer';
[](#%5F%5Fcodelineno-4-2)
[](#%5F%5Fcodelineno-4-3)const open = async () => {
[](#%5F%5Fcodelineno-4-4)  await PdfViewer.open({
[](#%5F%5Fcodelineno-4-5)    path: 'file:///path/to/document.pdf',
[](#%5F%5Fcodelineno-4-6)    title: 'Invoice',
[](#%5F%5Fcodelineno-4-7)    page: 1,
[](#%5F%5Fcodelineno-4-8)  });
[](#%5F%5Fcodelineno-4-9)};
`

### Open a password-protected PDF document[¶](#open-a-password-protected-pdf-document "Permanent link")

Use the `password` option to unlock a password-protected PDF file:

`[](#%5F%5Fcodelineno-5-1)import { PdfViewer } from '@capawesome/capacitor-pdf-viewer';
[](#%5F%5Fcodelineno-5-2)
[](#%5F%5Fcodelineno-5-3)const openWithPassword = async () => {
[](#%5F%5Fcodelineno-5-4)  await PdfViewer.open({
[](#%5F%5Fcodelineno-5-5)    path: 'file:///path/to/document.pdf',
[](#%5F%5Fcodelineno-5-6)    password: 'secret',
[](#%5F%5Fcodelineno-5-7)  });
[](#%5F%5Fcodelineno-5-8)};
`

### Close the viewer[¶](#close-the-viewer "Permanent link")

Close the currently open viewer from code. If no viewer is open, this method does nothing:

`[](#%5F%5Fcodelineno-6-1)import { PdfViewer } from '@capawesome/capacitor-pdf-viewer';
[](#%5F%5Fcodelineno-6-2)
[](#%5F%5Fcodelineno-6-3)const close = async () => {
[](#%5F%5Fcodelineno-6-4)  await PdfViewer.close();
[](#%5F%5Fcodelineno-6-5)};
`

### Listen for page changes and the viewer being closed[¶](#listen-for-page-changes-and-the-viewer-being-closed "Permanent link")

Use the `pageChange` and `closed` events to react to the user scrolling through the document or closing the viewer:

`[](#%5F%5Fcodelineno-7-1)import { PdfViewer } from '@capawesome/capacitor-pdf-viewer';
[](#%5F%5Fcodelineno-7-2)
[](#%5F%5Fcodelineno-7-3)const addListeners = async () => {
[](#%5F%5Fcodelineno-7-4)  await PdfViewer.addListener('closed', () => {
[](#%5F%5Fcodelineno-7-5)    console.log('Viewer closed');
[](#%5F%5Fcodelineno-7-6)  });
[](#%5F%5Fcodelineno-7-7)  await PdfViewer.addListener('pageChange', event => {
[](#%5F%5Fcodelineno-7-8)    console.log('Current page:', event.page);
[](#%5F%5Fcodelineno-7-9)  });
[](#%5F%5Fcodelineno-7-10)};
`

## API[¶](#api "Permanent link")

* [close()](#close)
* [open(...)](#open)
* [addListener('closed', ...)](#addlistenerclosed-)
* [addListener('pageChange', ...)](#addlistenerpagechange-)
* [removeAllListeners()](#removealllisteners)
* [Interfaces](#interfaces)

### close()[¶](#close "Permanent link")

`[](#%5F%5Fcodelineno-8-1)close() => Promise<void>
`

Close the currently open viewer.

If no viewer is open, this method does nothing.

Only available on Android and iOS.

**Since:** 0.1.0

---

### open(...)[¶](#open "Permanent link")

`[](#%5F%5Fcodelineno-9-1)open(options: OpenOptions) => Promise<void>
`

Open a PDF file in a fullscreen native viewer.

If a viewer is already open, it is closed before the new one is presented.

Only available on Android and iOS.

| Param       | Type                        |
| ----------- | --------------------------- |
| **options** | [OpenOptions](#openoptions) |

**Since:** 0.1.0

---

### addListener('closed', ...)[¶](#addlistenerclosed "Permanent link")

`[](#%5F%5Fcodelineno-10-1)addListener(eventName: 'closed', listenerFunc: () => void) => Promise<PluginListenerHandle>
`

Called when the viewer is closed.

Only available on Android and iOS.

| Param            | Type       |
| ---------------- | ---------- |
| **eventName**    | 'closed'   |
| **listenerFunc** | () => void |

**Returns:** `Promise<[PluginListenerHandle](#pluginlistenerhandle)>`

**Since:** 0.1.0

---

### addListener('pageChange', ...)[¶](#addlistenerpagechange "Permanent link")

`[](#%5F%5Fcodelineno-11-1)addListener(eventName: 'pageChange', listenerFunc: (event: PageChangeEvent) => void) => Promise<PluginListenerHandle>
`

Called when the current page of the viewer changes.

Only available on Android and iOS.

| Param            | Type                                                 |
| ---------------- | ---------------------------------------------------- |
| **eventName**    | 'pageChange'                                         |
| **listenerFunc** | (event: [PageChangeEvent](#pagechangeevent)) => void |

**Returns:** `Promise<[PluginListenerHandle](#pluginlistenerhandle)>`

**Since:** 0.1.0

---

### removeAllListeners()[¶](#removealllisteners "Permanent link")

`[](#%5F%5Fcodelineno-12-1)removeAllListeners() => Promise<void>
`

Remove all listeners for this plugin.

**Since:** 0.1.0

---

### Interfaces[¶](#interfaces "Permanent link")

#### OpenOptions[¶](#openoptions "Permanent link")

| Prop                | Type    | Description                                                                                                                                                                         | Default                        | Since |
| ------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ | ----- |
| **page**            | number  | The page (1-based) to display initially.                                                                                                                                            | 1                              | 0.1.0 |
| **password**        | string  | The password to unlock the PDF file if it is password-protected.                                                                                                                    |                                | 0.1.0 |
| **path**            | string  | The path of the local PDF file to display. Remote URLs are not supported. Download the file first, for example to the cache directory, and pass the local file path to this method. |                                | 0.1.0 |
| **showShareButton** | boolean | Whether to display a share button in the toolbar of the viewer. Only available on Android and iOS.                                                                                  | false                          | 0.1.2 |
| **title**           | string  | The title to display in the toolbar of the viewer.                                                                                                                                  | The file name of the PDF file. | 0.1.0 |

#### PluginListenerHandle[¶](#pluginlistenerhandle "Permanent link")

| Prop       | Type                |
| ---------- | ------------------- |
| **remove** | () => Promise<void> |

#### PageChangeEvent[¶](#pagechangeevent "Permanent link")

| Prop     | Type   | Description                                     | Since |
| -------- | ------ | ----------------------------------------------- | ----- |
| **page** | number | The page (1-based) that is currently displayed. | 0.1.0 |

## FAQ[¶](#faq "Permanent link")

### How is this plugin different from other similar plugins?[¶](#how-is-this-plugin-different-from-other-similar-plugins "Permanent link")

It displays PDF documents in a fullscreen native viewer with a toolbar, paging, pinch-to-zoom, and support for password-protected files, backed by PDFKit on iOS and Pdfium on Android for a genuinely native reading experience. Page-change and closed events let you track reading progress and reopen a document where the user left off, all through a fully typed API that uses only official platform APIs. Actively maintained against the latest Capacitor version, it also pairs naturally with the PDF Generator and File Picker plugins.

### Can I display a PDF from a remote URL?[¶](#can-i-display-a-pdf-from-a-remote-url "Permanent link")

No, the plugin only supports local files. Download the file first, for example with the `downloadFile(...)` method of the official [Filesystem](https://capacitorjs.com/docs/apis/filesystem) plugin, and then pass the local file path to the `open(...)` method.

### Why is the plugin not available on the Web?[¶](#why-is-the-plugin-not-available-on-the-web "Permanent link")

Browsers ship with a built-in PDF viewer, so a plugin is not needed there. On the Web, you can simply render a PDF document using an `<iframe>` or `<object>` element.

### How do I open a password-protected PDF document?[¶](#how-do-i-open-a-password-protected-pdf-document "Permanent link")

Pass the password using the `password` option of the `open(...)` method. The viewer then unlocks and displays the document. See [Open a password-protected PDF document](#open-a-password-protected-pdf-document) for an example.

### How much does the plugin add to my Android app size?[¶](#how-much-does-the-plugin-add-to-my-android-app-size "Permanent link")

On Android, the plugin uses the [android-pdf-viewer](https://github.com/oothp/AndroidPdfViewer) library, which bundles the Pdfium native libraries. These add about 10 to 16 MB (uncompressed, across all ABIs) to your app. If you publish your app as an Android App Bundle, each device only downloads the native libraries for its own ABI, which significantly reduces the download size.

### Can I select text in the viewer on Android?[¶](#can-i-select-text-in-the-viewer-on-android "Permanent link")

No, the viewer does not support text selection on Android. On iOS, the plugin uses the PDFKit framework, which provides the native viewer experience of the platform.

### Why does the share button not work on Android?[¶](#why-does-the-share-button-not-work-on-android "Permanent link")

The share button is hidden by default. Enable it by setting the `showShareButton` option to `true`. On Android, the file is then shared using a [FileProvider](https://developer.android.com/reference/androidx/core/content/FileProvider). Make sure that the directory containing the PDF file is declared in the `file_paths.xml` file of your Android project, as described in the [Installation](#android) section. Without this configuration, the file can not be shared.

### Can I use this plugin with Ionic, React, Vue or Angular?[¶](#can-i-use-this-plugin-with-ionic-react-vue-or-angular "Permanent link")

Yes, the plugin is framework-agnostic. It works in any Capacitor app regardless of the web framework, including Ionic with Angular, React, or Vue, as well as plain JavaScript projects.

## Related Plugins[¶](#related-plugins "Permanent link")

* [File Opener](https://capawesome.io/docs/sdks/capacitor/file-opener/): Open a file with the default application instead of an in-app viewer.
* [File Picker](https://capawesome.io/docs/sdks/capacitor/file-picker/): Let the user select a PDF file from the device's file system.
* [PDF Generator](https://capawesome.io/docs/sdks/capacitor/pdf-generator/): Generate paginated PDF files from HTML content or URLs.
* [Printer](https://capawesome.io/docs/sdks/capacitor/printer/): Print PDF documents on Android and iOS.

## Newsletter[¶](#newsletter "Permanent link")

Stay up to date with the latest news and updates about the Capawesome, Capacitor, and Ionic ecosystem by subscribing to our [Capawesome Newsletter](https://cloud.capawesome.io/newsletter/).

## Changelog[¶](#changelog "Permanent link")

See [CHANGELOG.md](https://github.com/capawesome-team/capacitor-plugins/blob/main/packages/pdf-viewer/CHANGELOG.md).

## License[¶](#license "Permanent link")

See [LICENSE](https://github.com/capawesome-team/capacitor-plugins/blob/main/packages/pdf-viewer/LICENSE).

July 8, 2026 

Back to top

```json
{"@context": "https://schema.org", "@graph": [{"@type": "TechArticle", "@id": "https://capawesome.io/docs/sdks/capacitor/pdf-viewer/#article", "headline": "Capacitor PDF Viewer Plugin for Android and iOS", "name": "Capacitor PDF Viewer Plugin for Android and iOS", "description": "Capacitor plugin to display PDF documents in a fullscreen native viewer with paging, zoom, and password support. Supports Android and iOS.", "inLanguage": "en", "url": "https://capawesome.io/docs/sdks/capacitor/pdf-viewer/", "mainEntityOfPage": "https://capawesome.io/docs/sdks/capacitor/pdf-viewer/", "author": {"@type": "Organization", "name": "Capawesome", "url": "https://capawesome.io", "logo": {"@type": "ImageObject", "url": "https://capawesome.io/assets/images/logo.svg"}}, "publisher": {"@type": "Organization", "name": "Capawesome", "url": "https://capawesome.io", "logo": {"@type": "ImageObject", "url": "https://capawesome.io/assets/images/logo.svg"}}, "about": {"@id": "https://capawesome.io/docs/sdks/capacitor/pdf-viewer/#software"}}, {"@type": "SoftwareSourceCode", "@id": "https://capawesome.io/docs/sdks/capacitor/pdf-viewer/#software", "name": "Capacitor PDF Viewer Plugin for Android and iOS", "description": "Capacitor plugin to display PDF documents in a fullscreen native viewer with paging, zoom, and password support. Supports Android and iOS.", "url": "https://capawesome.io/docs/sdks/capacitor/pdf-viewer/", "programmingLanguage": "TypeScript", "runtimePlatform": "Capacitor", "codeRepository": "https://github.com/capawesome-team", "author": {"@type": "Organization", "name": "Capawesome", "url": "https://capawesome.io", "logo": {"@type": "ImageObject", "url": "https://capawesome.io/assets/images/logo.svg"}}, "publisher": {"@type": "Organization", "name": "Capawesome", "url": "https://capawesome.io", "logo": {"@type": "ImageObject", "url": "https://capawesome.io/assets/images/logo.svg"}}}]}
{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "How is this plugin different from other similar plugins?", "acceptedAnswer": {"@type": "Answer", "text": "It displays PDF documents in a fullscreen native viewer with a toolbar, paging, pinch-to-zoom, and support for password-protected files, backed by PDFKit on iOS and Pdfium on Android for a genuinely native reading experience. Page-change and closed events let you track reading progress and reopen a document where the user left off, all through a fully typed API that uses only official platform APIs. Actively maintained against the latest Capacitor version, it also pairs naturally with the PDF Generator and File Picker plugins."}}, {"@type": "Question", "name": "Can I display a PDF from a remote URL?", "acceptedAnswer": {"@type": "Answer", "text": "No, the plugin only supports local files. Download the file first, for example with the downloadFile(...) method of the official Filesystem plugin, and then pass the local file path to the open(...) method."}}, {"@type": "Question", "name": "Why is the plugin not available on the Web?", "acceptedAnswer": {"@type": "Answer", "text": "Browsers ship with a built-in PDF viewer, so a plugin is not needed there. On the Web, you can simply render a PDF document using an <iframe> or <object> element."}}, {"@type": "Question", "name": "How do I open a password-protected PDF document?", "acceptedAnswer": {"@type": "Answer", "text": "Pass the password using the password option of the open(...) method. The viewer then unlocks and displays the document. See Open a password-protected PDF document for an example."}}, {"@type": "Question", "name": "How much does the plugin add to my Android app size?", "acceptedAnswer": {"@type": "Answer", "text": "On Android, the plugin uses the android-pdf-viewer library, which bundles the Pdfium native libraries. These add about 10 to 16 MB (uncompressed, across all ABIs) to your app. If you publish your app as an Android App Bundle, each device only downloads the native libraries for its own ABI, which significantly reduces the download size."}}, {"@type": "Question", "name": "Can I select text in the viewer on Android?", "acceptedAnswer": {"@type": "Answer", "text": "No, the viewer does not support text selection on Android. On iOS, the plugin uses the PDFKit framework, which provides the native viewer experience of the platform."}}, {"@type": "Question", "name": "Why does the share button not work on Android?", "acceptedAnswer": {"@type": "Answer", "text": "The share button is hidden by default. Enable it by setting the showShareButton option to true. On Android, the file is then shared using a FileProvider. Make sure that the directory containing the PDF file is declared in the file_paths.xml file of your Android project, as described in the Installation section. Without this configuration, the file can not be shared."}}, {"@type": "Question", "name": "Can I use this plugin with Ionic, React, Vue or Angular?", "acceptedAnswer": {"@type": "Answer", "text": "Yes, the plugin is framework-agnostic. It works in any Capacitor app regardless of the web framework, including Ionic with Angular, React, or Vue, as well as plain JavaScript projects."}}], "url": "https://capawesome.io/docs/sdks/capacitor/pdf-viewer/"}
```
