The most reliable, feature-rich Angular PDF viewer component powered by Mozilla's PDF.js
NPM Version PDF.js Version Angular Support NPM Downloads Total Downloads Since 2018 License GitHub Stars
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 --save
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 {}
<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-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"
}
]
}
}
}
}
}
}<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.bat
This 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: codehippie1@gmail.com
- π¨βπ» 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: codehippie1@gmail.com
β οΈ Please do NOT report security issues through public GitHub issues
For security best practices and vulnerability reporting guidelines, see our Security Policy.