ng2-pdfjs-viewer

The most comprehensive Angular PDF viewer powered by Mozilla PDF.js. 7M+ downloads, mobile-first, production-ready with complete rewrite in v25.x

ng2-pdfjs-viewer downloads ng2-pdfjs-viewer version ng2-pdfjs-viewer license

ng2-pdfjs-viewerSimilar Packages:

Npm Package Weekly Downloads Trend

3 Years
🌟 Show real-time usage chart on ng2-pdfjs-viewer's README.md, just copy the code below.
## Usage Trend
[![Usage Trend of ng2-pdfjs-viewer](https://npm-compare.com/img/npm-trend/THREE_YEARS/ng2-pdfjs-viewer.png)](https://npm-compare.com/ng2-pdfjs-viewer#timeRange=THREE_YEARS)

Cumulative GitHub Star Trend

🌟 Show GitHub stars trend chart on ng2-pdfjs-viewer's README.md, just copy the code below.
## GitHub Stars Trend
[![GitHub Stars Trend of ng2-pdfjs-viewer](https://npm-compare.com/img/github-trend/ng2-pdfjs-viewer.png)](https://npm-compare.com/ng2-pdfjs-viewer)

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
ng2-pdfjs-viewer024411.1 MB227 months agoApache-2.0 + Commons Clause

README for ng2-pdfjs-viewer

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
URL Security ValidationPrevents unauthorized file parameter manipulation with custom templatesβœ… 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

πŸ”’ Security Features

  • CSP Compliant - Works with strict Content Security Policy (style-src 'self')
  • URL Validation - Prevents unauthorized file parameter manipulation in external viewer
  • Custom Security Templates - Angular template support for security warnings
  • Console Warnings - Developer-friendly security notifications

πŸ“¦ Installation

Prerequisites

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

Production Deployment

Nginx Configuration

For production deployments using nginx, configure MIME types for PDF.js ES modules:

# Add to your nginx.conf or site configuration
types {
    application/javascript  js mjs;
    text/plain             ftl;
}

IIS Configuration (Windows Server)

For production deployments using IIS, add to your web.config:

<configuration>
  <system.webServer>
    <staticContent>
      <mimeMap fileExtension=".mjs" mimeType="application/javascript" />
      <mimeMap fileExtension=".ftl" mimeType="text/plain" />
    </staticContent>
  </system.webServer>
</configuration>

Why this is needed: PDF.js v5+ uses .mjs files (ES modules) and .ftl files (localization). Without proper MIME type configuration, web servers serve these files with incorrect content-type headers, causing the PDF viewer to crash during loading in production environments.

Angular Version Support

Angular VersionSupport LevelNotes
20.0+βœ… RecommendedFully tested and optimized
15.0 - 19.xβœ… SupportedShould work with minor testing
10.0 - 14.xβœ… SupportedCompatible 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>

Security Configuration

<!-- Basic security (default enabled) -->
<ng2-pdfjs-viewer 
  pdfSrc="assets/document.pdf"
  [urlValidation]="true">
</ng2-pdfjs-viewer>

<!-- Custom security template -->
<ng2-pdfjs-viewer 
  pdfSrc="assets/document.pdf"
  [urlValidation]="true"
  [customSecurityTpl]="securityTemplate">
</ng2-pdfjs-viewer>

<ng-template #securityTemplate let-warning="securityWarning">
  <div class="alert alert-warning" *ngIf="warning">
    <h4>⚠️ Security Warning</h4>
    <p>{{ warning.message }}</p>
    <button (click)="pdfViewer.dismissSecurityWarning()">Dismiss</button>
  </div>
</ng-template>

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>

External Window Behavior

<!-- Basic external window (reuses same tab) -->
<ng2-pdfjs-viewer 
  pdfSrc="document.pdf"
  [externalWindow]="true">
</ng2-pdfjs-viewer>

<!-- Custom window options -->
<ng2-pdfjs-viewer 
  pdfSrc="document.pdf"
  [externalWindow]="true"
  [externalWindowOptions]="'width=1200,height=800,scrollbars=yes,resizable=yes'">
</ng2-pdfjs-viewer>

<!-- Force new tab each time -->
<ng2-pdfjs-viewer 
  pdfSrc="document.pdf"
  [externalWindow]="true"
  [target]="'pdf-viewer-' + Date.now()">
</ng2-pdfjs-viewer>

Tab Reuse Behavior:

  • Same target name β†’ Reuses existing tab (default behavior)
  • Unique target name β†’ Always opens new tab
  • target="_blank" β†’ Browser decides (usually reuses)

iframe Security

<!-- Built-in security (always enabled) -->
<ng2-pdfjs-viewer 
  pdfSrc="document.pdf">
</ng2-pdfjs-viewer>

Built-in Security Features:

  • Static Sandbox - allow-forms allow-scripts allow-same-origin allow-modals
  • XSS Prevention - Prevents malicious scripts from affecting parent page
  • CSP Compliance - Meets Content Security Policy requirements
  • Data Protection - Limits iframe access to parent window context
  • Enterprise Ready - Suitable for corporate security environments

Sandbox Attributes (Fixed for Security):

  • allow-forms - Required for PDF form functionality
  • allow-scripts - Required for PDF.js JavaScript execution
  • allow-same-origin - Required for loading PDF files and assets
  • allow-modals - Required for PDF.js dialogs (print, download)

iframe Styling

<!-- Default (no border) -->
<ng2-pdfjs-viewer 
  pdfSrc="document.pdf">
</ng2-pdfjs-viewer>

<!-- Custom border -->
<ng2-pdfjs-viewer 
  pdfSrc="document.pdf"
  iframeBorder="2px solid #ccc">
</ng2-pdfjs-viewer>

<!-- Numeric border -->
<ng2-pdfjs-viewer 
  pdfSrc="document.pdf"
  [iframeBorder]="1">
</ng2-pdfjs-viewer>

<!-- No border (explicit) -->
<ng2-pdfjs-viewer 
  pdfSrc="document.pdf"
  iframeBorder="0">
</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 (size, position, etc.)
targetstring'_blank'Target for external window (controls tab reuse)
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
cspNoncestring-CSP nonce for customCSS (optional)
iframeTitlestring-Accessible title for iframe (optional)
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
urlValidationbooleantrueEnable URL validation
customSecurityTplTemplateRef<any>-Custom security template
securityWarningSecurityWarning | null-Security warning data (read-only)
iframeBorderstring | number"0"iframe border style

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
setUrlValidation(enabled: boolean)enabled: booleanPromise<ActionExecutionResult>Enable/disable URL validation
dismissSecurityWarning()-voidDismiss security warning

🎨 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

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

Migration Steps

  1. Update Dependencies

    npm install ng2-pdfjs-viewer@latest
    
  2. Update Theme Configuration

    // Old way
    [customCSS]="'body { background: red; }'"
    
    // New way
    [theme]="'light'"
    [primaryColor]="'#ff0000'"
    [backgroundColor]="'#ffffff'"
    
  3. 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>
    
  4. 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


πŸ”’ Security

I take security of this library seriously. If you discover a security vulnerability, please report it privately:

For security best practices and vulnerability reporting guidelines, see our Security Policy.


GitHub NPM Angular