Socket
Book a DemoInstallSign in
Socket

ng2-pdfjs-viewer

Package Overview
Dependencies
Maintainers
1
Versions
82
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ng2-pdfjs-viewer

README.md

latest
Source
npmnpm
Version
25.0.7
Version published
Weekly downloads
33K
11.28%
Maintainers
1
Weekly downloads
 
Created
Source

Angular PDF viewer powered by Mozilla's PDF.js

The most reliable, feature-rich Angular PDF viewer component powered by Mozilla's PDF.js

ng2-pdfjs-viewer Logo

NPM Version PDF.js Version Angular Support NPM Downloads Total Downloads Since 2018 License GitHub Stars

ng2-pdfjs-viewer is the most comprehensive and feature-rich Angular PDF viewer component available. Born in 2018 and still going strong with over 7+ million downloads, this battle-tested library has been trusted by developers worldwide for over 8 years, powering thousands of applications.

This powerful library enables developers to seamlessly integrate PDF viewing capabilities into Angular applications with enterprise-grade features, custom theming, and mobile-first responsive design. Built on Mozilla's PDF.js v5.3.93, ng2-pdfjs-viewer provides advanced PDF rendering, document navigation, search functionality, and extensive customization options.

Whether you need a simple embedded PDF viewer or a complex document management system, this component delivers the performance and flexibility required for modern Angular applications. The most mature and reliable Angular PDF viewer solution with continuous updates and long-term support.

Why Choose ng2-pdfjs-viewer?

  • 🚀 Always Up-to-Date - Continuously updated with the latest PDF.js versions and Angular compatibility
  • 🏗️ Enterprise-Ready - Built for production with comprehensive error handling and performance optimization
  • 🎨 Highly Customizable - Extensive theming options, custom templates, and flexible configuration
  • 📱 Mobile Optimized - Touch-friendly interface with responsive design for all screen sizes
  • 🔧 Developer Friendly - Full TypeScript support, comprehensive documentation, and easy integration
  • ⚡ High Performance - Event-driven architecture with efficient memory management and lazy loading
  • 🌍 Global Support - Multi-language support with automatic locale detection and RTL compatibility
  • 🛡️ Production Tested - Trusted by thousands of applications with millions of downloads
  • 📈 Proven Track Record - 8+ years of continuous development and community support
  • 🔒 Security Focused - Regular security updates and vulnerability patches

🆕 Latest Features (v25.x)

FeatureDescriptionStatus
Advanced Theme SystemCSS custom properties for complete visual customization✅ New
Template-Based UICustom loading spinners and error displays using Angular templates✅ New
Convenience ConfigurationObject-based configuration for cleaner, more maintainable code✅ New
Event-Driven ArchitecturePure event-based system with universal action dispatcher✅ New
Enhanced Error HandlingMultiple error display styles with custom templates✅ New
Mobile-First DesignResponsive layout optimized for touch devices✅ New
TypeScript Strict ModeFull type safety with comprehensive API coverage✅ New

🏆 Unique Advantages

  • Universal Action Dispatcher - Single pathway for all actions with readiness validation
  • Template-Based Customization - Use Angular templates for loading and error states
  • Comprehensive Event System - 24+ events covering all user interactions and state changes
  • Advanced Configuration Objects - Clean, object-based configuration for complex setups
  • Production-Ready Architecture - Event-driven design with no timeouts or polling
  • Complete API Coverage - 19+ methods with consistent Promise-based returns

🎯 Perfect For

  • Enterprise Applications - Robust, scalable PDF viewing for business applications
  • Document Management Systems - Complete PDF handling with search and navigation
  • E-Learning Platforms - Interactive PDF viewing for educational content
  • Financial Applications - Secure PDF viewing for reports and statements
  • Healthcare Systems - Reliable PDF viewing for medical documents
  • Government Portals - Accessible PDF viewing for public services
  • E-Commerce Platforms - Product catalogs and documentation viewing
  • Content Management Systems - Integrated PDF viewing and management

📋 Table of Contents

🚀 Quick Start

🎯 Live Demo: https://angular-pdf-viewer-demo.vercel.app/
📚 Documentation: https://angular-pdf-viewer-docs.vercel.app/
📁 Source Code: https://github.com/intbot/ng2-pdfjs-viewer/tree/main/SampleApp

1. Install the Package

npm install ng2-pdfjs-viewer --save

2. Import the Module

import { NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { PdfJsViewerModule } from "ng2-pdfjs-viewer";

@NgModule({
  imports: [BrowserModule, PdfJsViewerModule],
  // ... rest of your module
})
export class AppModule {}

3. Use in Your Component

<ng2-pdfjs-viewer
  pdfSrc="assets/sample.pdf"
  [showSpinner]="true"
  [theme]="'light'"
>
</ng2-pdfjs-viewer>

4. Configure Assets (Required)

Add PDF.js assets to your angular.json:

{
  "projects": {
    "your-app": {
      "architect": {
        "build": {
          "options": {
"assets": [
              {
                "glob": "**/*",
                "input": "node_modules/ng2-pdfjs-viewer/pdfjs",
                "output": "/assets/pdfjs"
              }
            ]
          }
        }
      }
    }
  }
}

✨ Features

🎉 7+ Million Downloads & Counting! - Trusted by developers worldwide for reliable PDF viewing in Angular applications since 2018.

🎯 Core PDF Viewing Features

  • 📄 High-Quality PDF Rendering - Powered by Mozilla's PDF.js v5.3.93 for superior document display
  • 🔄 Multiple Display Modes - Embedded viewer, new window, or external tab options
  • 📱 Mobile-First Responsive Design - Touch-friendly controls optimized for all devices
  • 🌍 Complete Internationalization - Support for 50+ languages with automatic locale detection
  • ⚡ Optimized Performance - Lazy loading, memory management, and efficient rendering

🎨 Visual Customization

  • 🎨 Theme System - Light, dark, and auto themes with custom color schemes
  • 🎭 Custom Styling - CSS custom properties for complete visual control
  • 🔄 Loading States - Custom loading spinners with template support
  • ❌ Error Handling - Multiple error display styles with custom templates
  • 📐 Layout Control - Toolbar density, sidebar width, and positioning options

🔧 Developer Features

  • 📝 TypeScript Support - Full type safety with strict mode
  • 🔌 Event System - Comprehensive event handling for all user interactions
  • ⚙️ Configuration Objects - Convenience setters for cleaner code
  • 🛠️ API Methods - Promise-based methods for programmatic control
  • 🐛 Debugging - Built-in diagnostic logging and error tracking

📊 Advanced Features

  • 🔍 Search & Navigation - Full-text search with highlighting
  • 📖 Bookmarks & Attachments - Document structure navigation
  • 🖨️ Print & Download - Built-in print and download functionality
  • 🔄 Rotation & Zoom - Document manipulation with smooth animations
  • 📱 Touch Gestures - Mobile-optimized touch interactions

📦 Installation

Prerequisites

  • Angular: 20.0+ (recommended) | 2.0+ (supported)
  • Node.js: 18.0+
  • TypeScript: 5.0+

Angular Version Support

Angular VersionSupport LevelNotes
20.0+RecommendedFully tested and optimized
15.0 - 19.xSupportedShould work with minor testing
10.0 - 14.xSupportedCompatible with testing
2.0 - 9.x⚠️ LegacyMay require additional testing

Note: While the library supports Angular 2.0+, it's primarily tested and optimized for Angular 20+. For production use with older versions, thorough testing is recommended. The library uses relaxed peer dependencies (Angular >=10.0.0) to ensure compatibility across different Angular versions.

Install Package

# Using npm
npm install ng2-pdfjs-viewer --save

# Using yarn
yarn add ng2-pdfjs-viewer

# Using pnpm
pnpm add ng2-pdfjs-viewer

Configure Assets

Add PDF.js assets to your angular.json:

{
  "projects": {
    "your-app": {
      "architect": {
        "build": {
          "options": {
            "assets": [
              {
                "glob": "**/*",
                "input": "node_modules/ng2-pdfjs-viewer/pdfjs",
                "output": "/assets/pdfjs"
              }
            ]
          }
        }
      }
    }
  }
}

🎯 Basic Usage

Simple PDF Viewer

<ng2-pdfjs-viewer pdfSrc="assets/document.pdf" [showSpinner]="true">
</ng2-pdfjs-viewer>

Advanced Configuration

<ng2-pdfjs-viewer
  pdfSrc="assets/document.pdf"
  [theme]="'dark'"
  [primaryColor]="'#007acc'"
  [showSpinner]="true"
  [customSpinnerTpl]="customSpinner"
  [customErrorTpl]="customError"
  (onDocumentLoad)="onDocumentLoaded($event)"
  (onPageChange)="onPageChanged($event)"
>
</ng2-pdfjs-viewer>

Programmatic Control

import { Component, ViewChild } from "@angular/core";
import { PdfJsViewerComponent } from "ng2-pdfjs-viewer";

@Component({
  template: `
    <ng2-pdfjs-viewer #pdfViewer pdfSrc="document.pdf"></ng2-pdfjs-viewer>
    <button (click)="goToPage(5)">Go to Page 5</button>
  `,
})
export class MyComponent {
  @ViewChild("pdfViewer") pdfViewer!: PdfJsViewerComponent;

  async goToPage(page: number) {
    await this.pdfViewer.goToPage(page);
  }
}

Advanced Configuration

Theme Customization

// Component
export class MyComponent {
  themeConfig = {
    theme: "light",
    primaryColor: "#007acc",
    backgroundColor: "#ffffff",
    toolbarColor: "#f5f5f5",
    textColor: "#333333",
    borderRadius: "8px",
  };
}
<!-- Template -->
<ng2-pdfjs-viewer [themeConfig]="themeConfig" [customCSS]="customStyles">
</ng2-pdfjs-viewer>

Custom Loading Spinner

<ng-template #customSpinner>
  <div class="custom-spinner">
    <div class="spinner"></div>
    <p>Loading PDF...</p>
  </div>
</ng-template>

<ng2-pdfjs-viewer
  [customSpinnerTpl]="customSpinner"
  [spinnerClass]="'my-spinner'"
>
</ng2-pdfjs-viewer>

Custom Error Display

<ng-template #customError>
  <div class="error-container">
    <mat-icon>error</mat-icon>
    <h3>Failed to Load PDF</h3>
    <p>Please check your internet connection and try again.</p>
    <button mat-button (click)="retry()">Retry</button>
  </div>
</ng-template>

<ng2-pdfjs-viewer [customErrorTpl]="customError" [errorClass]="'my-error'">
</ng2-pdfjs-viewer>

📚 API Reference

Input Properties

PropertyTypeDefaultDescription
pdfSrcstring | Blob | Uint8Array-PDF source (URL, Blob, or byte array)
viewerIdstringautoUnique viewer identifier
viewerFolderstring'assets'Path to PDF.js assets
externalWindowbooleanfalseOpen in new window
externalWindowOptionsstring-External window options
targetstring'_blank'Target for external window
theme'light' | 'dark' | 'auto''light'Theme selection
primaryColorstring'#007acc'Primary color for UI elements
backgroundColorstring'#ffffff'Background color
pageBorderColorstring-Page border color
toolbarColorstring-Toolbar background color
textColorstring-Text color
borderRadiusstring-Border radius
customCSSstring-Custom CSS styles
showSpinnerbooleantrueShow loading spinner
customSpinnerTplTemplateRef-Custom spinner template
spinnerClassstring-Custom spinner CSS class
customErrorTplTemplateRef-Custom error template
errorClassstring-Custom error CSS class
errorOverridebooleanfalseOverride default error handling
errorAppendbooleantrueAppend to default error messages
errorMessagestring-Custom error message
localestring'en-US'UI language
useOnlyCssZoombooleanfalseUse CSS-based zoom for mobile
diagnosticLogsbooleanfalseEnable diagnostic logging
zoomstring'auto'Initial zoom level (two-way binding)
pagenumber1Initial page number
namedDeststring-Named destination to navigate to
cursorstring'select'Cursor type (two-way binding)
scrollstring'vertical'Scroll mode (two-way binding)
spreadstring'none'Spread mode (two-way binding)
pageModestring'none'Page mode (two-way binding)
rotationnumber0Document rotation (two-way binding)
showOpenFilebooleantrueShow open file button
showDownloadbooleantrueShow download button
showPrintbooleantrueShow print button
showFindbooleantrueShow search button
showFullScreenbooleantrueShow fullscreen button
showViewBookmarkbooleantrueShow bookmark button
showAnnotationsbooleanfalseShow annotations
showToolbarLeftbooleantrueShow left toolbar section
showToolbarMiddlebooleantrueShow middle toolbar section
showToolbarRightbooleantrueShow right toolbar section
showSecondaryToolbarTogglebooleantrueShow secondary toolbar toggle
showSidebarbooleantrueShow sidebar
showSidebarLeftbooleantrueShow left sidebar
showSidebarRightbooleantrueShow right sidebar
toolbarDensity'compact' | 'default' | 'comfortable''default'Toolbar density
sidebarWidthstring-Sidebar width (e.g., '280px')
toolbarPosition'top' | 'bottom''top'Toolbar position
sidebarPosition'left' | 'right''left'Sidebar position
responsiveBreakpointstring | number-Responsive breakpoint
downloadOnLoadbooleanfalseAuto-download on load
printOnLoadbooleanfalseAuto-print on load
rotateCWbooleanfalseRotate clockwise on load
rotateCCWbooleanfalseRotate counter-clockwise on load
showLastPageOnLoadbooleanfalseGo to last page on load
downloadFileNamestring-Custom download filename
controlVisibilityControlVisibilityConfig-Control visibility configuration
autoActionsAutoActionConfig-Auto actions configuration
errorHandlingErrorConfig-Error handling configuration
viewerConfigViewerConfig-Viewer configuration
themeConfigThemeConfig-Theme configuration
groupVisibilityGroupVisibilityConfig-Group visibility configuration
layoutConfigLayoutConfig-Layout configuration

Output Events

EventTypeDescription
onDocumentLoadEventEmitter<void>Fired when document loads
onDocumentInitEventEmitter<void>Fired when document initializes
onDocumentErrorEventEmitter<DocumentError>Fired when document fails to load
onPageChangeEventEmitter<ChangedPage>Fired when page changes
onPagesInitEventEmitter<PagesInfo>Fired when pages are initialized
onPageRenderedEventEmitter<PageRenderInfo>Fired when a page is rendered
onScaleChangeEventEmitter<ChangedScale>Fired when zoom/scale changes
onRotationChangeEventEmitter<ChangedRotation>Fired when rotation changes
onPresentationModeChangedEventEmitter<PresentationMode>Fired when presentation mode changes
onOpenFileEventEmitter<void>Fired when open file is clicked
onFindEventEmitter<FindOperation>Fired when search is performed
onUpdateFindMatchesCountEventEmitter<FindMatchesCount>Fired when search matches are updated
onMetadataLoadedEventEmitter<DocumentMetadata>Fired when document metadata loads
onOutlineLoadedEventEmitter<DocumentOutline>Fired when document outline loads
onAnnotationLayerRenderedEventEmitter<AnnotationLayerRenderEvent>Fired when annotation layer renders
onBookmarkClickEventEmitter<BookmarkClick>Fired when bookmark is clicked
onIdleEventEmitter<void>Fired when viewer becomes idle
onBeforePrintEventEmitter<void>Fired before printing
onAfterPrintEventEmitter<void>Fired after printing
zoomChangeEventEmitter<string>Fired when zoom changes (two-way binding)
cursorChangeEventEmitter<string>Fired when cursor changes (two-way binding)
scrollChangeEventEmitter<string>Fired when scroll changes (two-way binding)
spreadChangeEventEmitter<string>Fired when spread changes (two-way binding)
pageModeChangeEventEmitter<string>Fired when page mode changes (two-way binding)

Methods

MethodParametersReturnsDescription
refresh()-voidRefresh viewer
goToPage(page: number)page: numberPromise<ActionExecutionResult>Navigate to specific page
setPage(page: number)page: numberPromise<ActionExecutionResult>Set current page
setZoom(zoom: string)zoom: stringPromise<ActionExecutionResult>Set zoom level
setCursor(cursor: string)cursor: 'select' | 'hand' | 'zoom'Promise<ActionExecutionResult>Set cursor type
setScroll(scroll: string)scroll: 'vertical' | 'horizontal' | 'wrapped' | 'page'Promise<ActionExecutionResult>Set scroll mode
setSpread(spread: string)spread: 'none' | 'odd' | 'even'Promise<ActionExecutionResult>Set spread mode
setPageMode(mode: string)mode: 'none' | 'thumbs' | 'bookmarks' | 'attachments'Promise<ActionExecutionResult>Set page mode
triggerDownload()-Promise<ActionExecutionResult>Trigger download
triggerPrint()-Promise<ActionExecutionResult>Trigger print
triggerRotation(direction: string)direction: 'cw' | 'ccw'Promise<ActionExecutionResult>Rotate document
goToLastPage()-Promise<ActionExecutionResult>Navigate to last page
sendViewerControlMessage(action: string, payload: any)action: string, payload: anyPromise<any>Send custom control message
getActionStatus(actionId: string)actionId: stringPromise<ActionExecutionResult | null>Get action status
getQueueStatus()-{ queuedActions: number; executedActions: number }Get queue status
clearActionQueue()-voidClear action queue
reloadViewer()-voidReload viewer (alias for refresh)
goBack()-voidGo back in browser history
closeViewer()-voidClose viewer window
getErrorTemplateData()-anyGet error template data

🎨 Examples

🎯 Live Demo: https://angular-pdf-viewer-demo.vercel.app/
📚 Documentation: https://angular-pdf-viewer-docs.vercel.app/
📁 Source Code: https://github.com/intbot/ng2-pdfjs-viewer/tree/main/SampleApp

1. Basic PDF Viewer

<ng2-pdfjs-viewer pdfSrc="assets/sample.pdf" [showSpinner]="true">
</ng2-pdfjs-viewer>

2. Themed PDF Viewer

<ng2-pdfjs-viewer
  pdfSrc="assets/sample.pdf"
  [theme]="'dark'"
  [primaryColor]="'#ff6b6b'"
  [backgroundColor]="'#2c3e50'"
>
</ng2-pdfjs-viewer>

3. Custom Loading & Error

<ng-template #loadingTemplate>
  <div class="loading">
    <mat-spinner></mat-spinner>
    <p>Loading your document...</p>
</div>
</ng-template>

<ng-template #errorTemplate>
  <div class="error">
    <mat-icon>error_outline</mat-icon>
    <h3>Oops! Something went wrong</h3>
    <p>We couldn't load your PDF. Please try again.</p>
    <button mat-button (click)="retry()">Retry</button>
</div>
</ng-template>

<ng2-pdfjs-viewer
  pdfSrc="assets/sample.pdf"
  [customSpinnerTpl]="loadingTemplate"
  [customErrorTpl]="errorTemplate"
>
  </ng2-pdfjs-viewer>

4. Convenience Setters (Object-Based Configuration)

export class PdfController {
  // Group visibility configuration
  groupVisibility = {
    "download": true,
    "print": true,
    "find": true,
    "fullScreen": true,
    "openFile": true,
    "viewBookmark": true,
    "annotations": false
  };

  // Auto actions configuration
  autoActions = {
    "downloadOnLoad": false,
    "printOnLoad": false
  };

  // Control visibility configuration
  controlVisibility = {
    "showToolbarLeft": true,
    "showToolbarMiddle": true,
    "showToolbarRight": true,
    "showSecondaryToolbarToggle": true,
    "showSidebar": true,
    "showSidebarLeft": true,
    "showSidebarRight": true
  };
}
<ng2-pdfjs-viewer
  pdfSrc="assets/sample.pdf"
  [groupVisibility]="groupVisibility"
  [autoActions]="autoActions"
  [controlVisibility]="controlVisibility"
>
</ng2-pdfjs-viewer>

5. Programmatic Control

export class PdfController {
  @ViewChild("pdfViewer") pdfViewer!: PdfJsViewerComponent;

  async loadDocument(url: string) {
    this.pdfViewer.pdfSrc = url;
    await this.pdfViewer.refresh();
  }

  async goToPage(page: number) {
    await this.pdfViewer.goToPage(page);
  }

  async setZoom(zoom: string) {
    await this.pdfViewer.setZoom(zoom);
  }
}

6. Server-Side Integration

For server-side developers, we provide comprehensive examples for integrating PDF APIs with ng2-pdfjs-viewer:

📋 Server-Side Examples - Complete examples for:

  • ASP.NET Core (C#) - RDLC reports, physical files, iTextSharp
  • Node.js (Express) - File serving, PDFKit, Puppeteer
  • Python (FastAPI) - ReportLab, WeasyPrint, file handling
  • Java (Spring Boot) - iText, JasperReports, file serving
  • PHP (Laravel) - TCPDF, DomPDF, file management
  • Go (Gin) - gofpdf, file serving, PDF generation

Each example includes proper Content-Type headers, error handling, CORS configuration, and Angular integration patterns.

🔄 Migration Guide

From v20.x to v25.x

Breaking Changes

  • PDF.js Upgrade: Updated to v5.3.93 - some APIs may have changed
  • Theme System: New theme properties replace old styling options
  • Error Handling: Template-based error system replaces HTML strings

Migration Steps

  • Update Dependencies

    npm install ng2-pdfjs-viewer@latest
    
  • Update Theme Configuration

    // Old way
    [customCSS]="'body { background: red; }'"
    
    // New way
    [theme]="'light'"
    [primaryColor]="'#ff0000'"
    [backgroundColor]="'#ffffff'"
    
  • Update Error Handling

    <!-- Old way -->
    [errorHtml]="'<div>Custom error</div>'"
    
    <!-- New way -->
    <ng-template #errorTemplate>
      <div>Custom error</div>
    </ng-template>
    <ng2-pdfjs-viewer [customErrorTpl]="errorTemplate"></ng2-pdfjs-viewer>
    
  • Update Spinner Handling

    <!-- Old way -->
    [spinnerHtml]="'<div class=\"spinner\">Loading...</div>'"
    
    <!-- New way -->
    <ng-template #spinnerTemplate>
      <div class="spinner">Loading...</div>
    </ng-template>
    <ng2-pdfjs-viewer [customSpinnerTpl]="spinnerTemplate"></ng2-pdfjs-viewer>
    
    // Old way
    this.pdfViewer.setSpinnerHtml('<div>Loading...</div>');
    
    // New way
    // Use [customSpinnerTpl] with ng-template
    

Deprecated Features

The following features are deprecated and will be removed in future versions:

Deprecated Properties

DeprecatedReplacementDescription
[startDownload][downloadOnLoad]Download document automatically when it opens
[startPrint][printOnLoad]Print document automatically when it opens
[errorHtml][customErrorTpl]Custom error HTML (use template instead)
[errorTemplate][customErrorTpl]Custom error template (renamed)
[spinnerHtml][customSpinnerTpl]Custom spinner HTML (use template instead)

Deprecated Methods

DeprecatedReplacementDescription
setErrorHtml()Use [customErrorTpl]Set custom error HTML (use template instead)
setSpinnerHtml()Use [customSpinnerTpl]Set custom spinner HTML (use template instead)

Migration Help

// Deprecated - Error Handling
this.pdfViewer.setErrorHtml("<div>Error</div>");

// New way - Error Handling
// Use [customErrorTpl] with ng-template

// Deprecated - Spinner Handling
this.pdfViewer.setSpinnerHtml("<div>Loading...</div>");

// New way - Spinner Handling
// Use [customSpinnerTpl] with ng-template

📚 Additional Resources

🤝 Contributing

We welcome contributions! Please see our Contributing Guide for details.

Development Setup

# Clone the repository
git clone https://github.com/intbot/ng2-pdfjs-viewer.git


# Clear Angular cache (Windows)
Remove-Item -Recurse -Force "SampleApp\.angular"


# Build and test - All at once (Windows)
@test.bat

📄 License

This project is licensed under the Apache License 2.0 + Commons Clause License Condition v1.0 - see the LICENSE file for details.

🙏 Acknowledgments

  • Community Contributors - For bug reports, feature requests, and contributions
  • 7+ Million Users - For trusting us with your PDF viewing needs
  • Mozilla PDF.js Team - For the amazing PDF.js library

📞 Support

GitHub NPM Angular

Keywords

angular

FAQs

Package last updated on 11 Sep 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts