The most reliable, feature-rich Angular PDF viewer component powered by Mozilla's PDF.js
Live Demo β’ Documentation β’ API Reference β’ Examples β’ Server Examples β’ Migration Guide
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.
- π 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
 
| Feature | Description | Status | 
|---|---|---|
| Advanced Theme System | CSS custom properties for complete visual customization | β New | 
| Template-Based UI | Custom loading spinners and error displays using Angular templates | β New | 
| Convenience Configuration | Object-based configuration for cleaner, more maintainable code | β New | 
| Event-Driven Architecture | Pure event-based system with universal action dispatcher | β New | 
| Enhanced Error Handling | Multiple error display styles with custom templates | β New | 
| Mobile-First Design | Responsive layout optimized for touch devices | β New | 
| TypeScript Strict Mode | Full type safety with comprehensive API coverage | β New | 
| URL Security Validation | Prevents unauthorized file parameter manipulation with custom templates | β New | 
- 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
 
- 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
 
- Quick Start
 - Features
 - Installation
 - Basic Usage
 - Advanced Configuration
 - API Reference
 - Examples
 - Migration Guide
 - Deprecated Features
 - Contributing
 - License
 
π― 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
npm install ng2-pdfjs-viewer --saveimport { 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 {}<ng2-pdfjs-viewer
  pdfSrc="assets/sample.pdf"
  [showSpinner]="true"
  [theme]="'light'"
>
</ng2-pdfjs-viewer>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"
              }
            ]
          }
        }
      }
    }
  }
}π 7+ Million Downloads & Counting! - Trusted by developers worldwide for reliable PDF viewing in Angular applications since 2018.
- π 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
 
- π¨ 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
 
- π 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
 
- π 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
 
- 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
 
- Angular: 20.0+ (recommended) | 2.0+ (supported)
 - Node.js: 18.0+
 - TypeScript: 5.0+
 
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;
}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 Level | Notes | 
|---|---|---|
| 20.0+ | β Recommended | Fully tested and optimized | 
| 15.0 - 19.x | β Supported | Should work with minor testing | 
| 10.0 - 14.x | β Supported | Compatible with testing | 
| 2.0 - 9.x | May 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.
# Using npm
npm install ng2-pdfjs-viewer --save
# Using yarn
yarn add ng2-pdfjs-viewer
# Using pnpm
pnpm add ng2-pdfjs-viewerAdd 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"
              }
            ]
          }
        }
      }
    }
  }
}<ng2-pdfjs-viewer pdfSrc="assets/document.pdf" [showSpinner]="true">
</ng2-pdfjs-viewer><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><!-- 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>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);
  }
}// 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><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><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><!-- 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 
targetname β Reuses existing tab (default behavior) - Unique 
targetname β Always opens new tab target="_blank"β Browser decides (usually reuses)
<!-- 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 functionalityallow-scripts- Required for PDF.js JavaScript executionallow-same-origin- Required for loading PDF files and assetsallow-modals- Required for PDF.js dialogs (print, download)
<!-- 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>| Property | Type | Default | Description | 
|---|---|---|---|
pdfSrc | 
string | Blob | Uint8Array | 
- | PDF source (URL, Blob, or byte array) | 
viewerId | 
string | 
auto | Unique viewer identifier | 
viewerFolder | 
string | 
'assets' | 
Path to PDF.js assets | 
externalWindow | 
boolean | 
false | 
Open in new window | 
externalWindowOptions | 
string | 
- | External window options (size, position, etc.) | 
target | 
string | 
'_blank' | 
Target for external window (controls tab reuse) | 
theme | 
'light' | 'dark' | 'auto' | 
'light' | 
Theme selection | 
primaryColor | 
string | 
'#007acc' | 
Primary color for UI elements | 
backgroundColor | 
string | 
'#ffffff' | 
Background color | 
pageBorderColor | 
string | 
- | Page border color | 
toolbarColor | 
string | 
- | Toolbar background color | 
textColor | 
string | 
- | Text color | 
borderRadius | 
string | 
- | Border radius | 
customCSS | 
string | 
- | Custom CSS styles | 
cspNonce | 
string | 
- | CSP nonce for customCSS (optional) | 
iframeTitle | 
string | 
- | Accessible title for iframe (optional) | 
showSpinner | 
boolean | 
true | 
Show loading spinner | 
customSpinnerTpl | 
TemplateRef | 
- | Custom spinner template | 
spinnerClass | 
string | 
- | Custom spinner CSS class | 
customErrorTpl | 
TemplateRef | 
- | Custom error template | 
errorClass | 
string | 
- | Custom error CSS class | 
errorOverride | 
boolean | 
false | 
Override default error handling | 
errorAppend | 
boolean | 
true | 
Append to default error messages | 
errorMessage | 
string | 
- | Custom error message | 
locale | 
string | 
'en-US' | 
UI language | 
useOnlyCssZoom | 
boolean | 
false | 
Use CSS-based zoom for mobile | 
diagnosticLogs | 
boolean | 
false | 
Enable diagnostic logging | 
zoom | 
string | 
'auto' | 
Initial zoom level (two-way binding) | 
page | 
number | 
1 | 
Initial page number | 
namedDest | 
string | 
- | Named destination to navigate to | 
cursor | 
string | 
'select' | 
Cursor type (two-way binding) | 
scroll | 
string | 
'vertical' | 
Scroll mode (two-way binding) | 
spread | 
string | 
'none' | 
Spread mode (two-way binding) | 
pageMode | 
string | 
'none' | 
Page mode (two-way binding) | 
rotation | 
number | 
0 | 
Document rotation (two-way binding) | 
showOpenFile | 
boolean | 
true | 
Show open file button | 
showDownload | 
boolean | 
true | 
Show download button | 
showPrint | 
boolean | 
true | 
Show print button | 
showFind | 
boolean | 
true | 
Show search button | 
showFullScreen | 
boolean | 
true | 
Show fullscreen button | 
showViewBookmark | 
boolean | 
true | 
Show bookmark button | 
showAnnotations | 
boolean | 
false | 
Show annotations | 
showToolbarLeft | 
boolean | 
true | 
Show left toolbar section | 
showToolbarMiddle | 
boolean | 
true | 
Show middle toolbar section | 
showToolbarRight | 
boolean | 
true | 
Show right toolbar section | 
showSecondaryToolbarToggle | 
boolean | 
true | 
Show secondary toolbar toggle | 
showSidebar | 
boolean | 
true | 
Show sidebar | 
showSidebarLeft | 
boolean | 
true | 
Show left sidebar | 
showSidebarRight | 
boolean | 
true | 
Show right sidebar | 
toolbarDensity | 
'compact' | 'default' | 'comfortable' | 
'default' | 
Toolbar density | 
sidebarWidth | 
string | 
- | Sidebar width (e.g., '280px') | 
toolbarPosition | 
'top' | 'bottom' | 
'top' | 
Toolbar position | 
sidebarPosition | 
'left' | 'right' | 
'left' | 
Sidebar position | 
responsiveBreakpoint | 
string | number | 
- | Responsive breakpoint | 
downloadOnLoad | 
boolean | 
false | 
Auto-download on load | 
printOnLoad | 
boolean | 
false | 
Auto-print on load | 
rotateCW | 
boolean | 
false | 
Rotate clockwise on load | 
rotateCCW | 
boolean | 
false | 
Rotate counter-clockwise on load | 
showLastPageOnLoad | 
boolean | 
false | 
Go to last page on load | 
downloadFileName | 
string | 
- | Custom download filename | 
controlVisibility | 
ControlVisibilityConfig | 
- | Control visibility configuration | 
autoActions | 
AutoActionConfig | 
- | Auto actions configuration | 
errorHandling | 
ErrorConfig | 
- | Error handling configuration | 
viewerConfig | 
ViewerConfig | 
- | Viewer configuration | 
themeConfig | 
ThemeConfig | 
- | Theme configuration | 
groupVisibility | 
GroupVisibilityConfig | 
- | Group visibility configuration | 
layoutConfig | 
LayoutConfig | 
- | Layout configuration | 
urlValidation | 
boolean | 
true | 
Enable URL validation | 
customSecurityTpl | 
TemplateRef<any> | 
- | Custom security template | 
securityWarning | 
SecurityWarning | null | 
- | Security warning data (read-only) | 
iframeBorder | 
string | number | 
"0" | 
iframe border style | 
| Event | Type | Description | 
|---|---|---|
onDocumentLoad | 
EventEmitter<void> | 
Fired when document loads | 
onDocumentInit | 
EventEmitter<void> | 
Fired when document initializes | 
onDocumentError | 
EventEmitter<DocumentError> | 
Fired when document fails to load | 
onPageChange | 
EventEmitter<ChangedPage> | 
Fired when page changes | 
onPagesInit | 
EventEmitter<PagesInfo> | 
Fired when pages are initialized | 
onPageRendered | 
EventEmitter<PageRenderInfo> | 
Fired when a page is rendered | 
onScaleChange | 
EventEmitter<ChangedScale> | 
Fired when zoom/scale changes | 
onRotationChange | 
EventEmitter<ChangedRotation> | 
Fired when rotation changes | 
onPresentationModeChanged | 
EventEmitter<PresentationMode> | 
Fired when presentation mode changes | 
onOpenFile | 
EventEmitter<void> | 
Fired when open file is clicked | 
onFind | 
EventEmitter<FindOperation> | 
Fired when search is performed | 
onUpdateFindMatchesCount | 
EventEmitter<FindMatchesCount> | 
Fired when search matches are updated | 
onMetadataLoaded | 
EventEmitter<DocumentMetadata> | 
Fired when document metadata loads | 
onOutlineLoaded | 
EventEmitter<DocumentOutline> | 
Fired when document outline loads | 
onAnnotationLayerRendered | 
EventEmitter<AnnotationLayerRenderEvent> | 
Fired when annotation layer renders | 
onBookmarkClick | 
EventEmitter<BookmarkClick> | 
Fired when bookmark is clicked | 
onIdle | 
EventEmitter<void> | 
Fired when viewer becomes idle | 
onBeforePrint | 
EventEmitter<void> | 
Fired before printing | 
onAfterPrint | 
EventEmitter<void> | 
Fired after printing | 
zoomChange | 
EventEmitter<string> | 
Fired when zoom changes (two-way binding) | 
cursorChange | 
EventEmitter<string> | 
Fired when cursor changes (two-way binding) | 
scrollChange | 
EventEmitter<string> | 
Fired when scroll changes (two-way binding) | 
spreadChange | 
EventEmitter<string> | 
Fired when spread changes (two-way binding) | 
pageModeChange | 
EventEmitter<string> | 
Fired when page mode changes (two-way binding) | 
| Method | Parameters | Returns | Description | 
|---|---|---|---|
refresh() | 
- | void | 
Refresh viewer | 
goToPage(page: number) | 
page: number | 
Promise<ActionExecutionResult> | 
Navigate to specific page | 
setPage(page: number) | 
page: number | 
Promise<ActionExecutionResult> | 
Set current page | 
setZoom(zoom: string) | 
zoom: string | 
Promise<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: any | 
Promise<any> | 
Send custom control message | 
getActionStatus(actionId: string) | 
actionId: string | 
Promise<ActionExecutionResult | null> | 
Get action status | 
getQueueStatus() | 
- | { queuedActions: number; executedActions: number } | 
Get queue status | 
clearActionQueue() | 
- | void | 
Clear action queue | 
reloadViewer() | 
- | void | 
Reload viewer (alias for refresh) | 
goBack() | 
- | void | 
Go back in browser history | 
closeViewer() | 
- | void | 
Close viewer window | 
getErrorTemplateData() | 
- | any | 
Get error template data | 
setUrlValidation(enabled: boolean) | 
enabled: boolean | 
Promise<ActionExecutionResult> | 
Enable/disable URL validation | 
dismissSecurityWarning() | 
- | void | 
Dismiss security warning | 
π― 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
<ng2-pdfjs-viewer pdfSrc="assets/sample.pdf" [showSpinner]="true">
</ng2-pdfjs-viewer><ng2-pdfjs-viewer
  pdfSrc="assets/sample.pdf"
  [theme]="'dark'"
  [primaryColor]="'#ff6b6b'"
  [backgroundColor]="'#2c3e50'"
>
</ng2-pdfjs-viewer><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>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>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);
  }
}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.
- 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
 
- 
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
 
The following features are deprecated and will be removed in future versions:
| Deprecated | Replacement | Description | 
|---|---|---|
[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 | Replacement | Description | 
|---|---|---|
setErrorHtml() | 
Use [customErrorTpl] | 
Set custom error HTML (use template instead) | 
setSpinnerHtml() | 
Use [customSpinnerTpl] | 
Set custom spinner HTML (use template instead) | 
// 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- Custom CSS Examples - Complete styling guide with theme customization examples
 - Error Display Examples - Custom error template examples and styling options
 - Contributing Guide - How to contribute to the project
 
We welcome contributions! Please see our Contributing Guide for details.
# 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.batThis project is licensed under the Apache License 2.0 + Commons Clause License Condition v1.0 - see the LICENSE file for details.
- 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
 
- π Documentation: GitHub Wiki
 - π¬ Community: GitHub Discussions
 - π Issues: GitHub Issues
 - π§ Email: [email protected]
 - π¨βπ» Author: Aneesh Gopalakrishnan
 
I take security of this library seriously. If you discover a security vulnerability, please report it privately:
- π Private Reporting: Security Policy
 - π§ Email: [email protected]
 β οΈ Please do NOT report security issues through public GitHub issues
For security best practices and vulnerability reporting guidelines, see our Security Policy.