/*! Angular-PDF Version: 1.3.0 | Released under an MIT license */ (function() { 'use strict'; angular.module('pdf', []).directive('ngPdf', [ '$window', function($window) { var renderTask = null; var pdfLoaderTask = null; var debug = false; var backingScale = function(canvas) { var ctx = canvas.getContext('2d'); var dpr = window.devicePixelRatio || 1; var bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1; return dpr / bsr; }; var setCanvasDimensions = function(canvas, w, h) { var ratio = backingScale(canvas); canvas.width = Math.floor(w * ratio); canvas.height = Math.floor(h * ratio); canvas.style.width = Math.floor(w) + 'px'; canvas.style.height = Math.floor(h) + 'px'; canvas.getContext('2d').setTransform(ratio, 0, 0, ratio, 0, 0); return canvas; }; return { restrict: 'E', templateUrl: function(element, attr) { return attr.templateUrl ? attr.templateUrl : 'partials/viewer.html'; }, link: function(scope, element, attrs) { element.css('display', 'block'); var url = scope.pdfUrl; var httpHeaders = scope.httpHeaders; var pdfDoc = null; var pageToDisplay = isFinite(attrs.page) ? parseInt(attrs.page) : 1; var pageFit = attrs.scale === 'page-fit'; var scale = attrs.scale > 0 ? attrs.scale : 1; var canvasid = attrs.canvasid || 'pdf-canvas'; var canvas = document.getElementById(canvasid); debug = attrs.hasOwnProperty('debug') ? attrs.debug : false; var creds = attrs.usecredentials; var ctx = canvas.getContext('2d'); var windowEl = angular.element($window); windowEl.on('scroll', function() { scope.$apply(function() { scope.scroll = windowEl[0].scrollY; }); }); PDFJS.disableWorker = true; scope.pageNum = pageToDisplay; scope.renderPage = function(num) { if (renderTask) { renderTask._internalRenderTask.cancel(); } pdfDoc.getPage(num).then(function(page) { var viewport; var pageWidthScale; var renderContext; if (pageFit) { viewport = page.getViewport(1); var clientRect = element[0].getBoundingClientRect(); pageWidthScale = clientRect.width / viewport.width; scale = pageWidthScale; } viewport = page.getViewport(scale); setCanvasDimensions(canvas, viewport.width, viewport.height); renderContext = { canvasContext: ctx, viewport: viewport }; renderTask = page.render(renderContext); renderTask.promise.then(function() { if (typeof scope.onPageRender === 'function') { scope.onPageRender(); } }).catch(function (reason) { console.log(reason); }); }); }; scope.goPrevious = function() { if (scope.pageToDisplay <= 1) { return; } scope.pageToDisplay = parseInt(scope.pageToDisplay) - 1; scope.pageNum = scope.pageToDisplay; }; scope.goNext = function() { if (scope.pageToDisplay >= pdfDoc.numPages) { return; } scope.pageToDisplay = parseInt(scope.pageToDisplay) + 1; scope.pageNum = scope.pageToDisplay; }; scope.zoomIn = function() { pageFit = false; scale = parseFloat(scale) + 0.2; scope.renderPage(scope.pageToDisplay); return scale; }; scope.zoomOut = function() { pageFit = false; scale = parseFloat(scale) - 0.2; scope.renderPage(scope.pageToDisplay); return scale; }; scope.fit = function() { pageFit = true; scope.renderPage(scope.pageToDisplay); } scope.changePage = function() { scope.renderPage(scope.pageToDisplay); }; scope.rotate = function() { if (canvas.getAttribute('class') === 'rotate0') { canvas.setAttribute('class', 'rotate90'); } else if (canvas.getAttribute('class') === 'rotate90') { canvas.setAttribute('class', 'rotate180'); } else if (canvas.getAttribute('class') === 'rotate180') { canvas.setAttribute('class', 'rotate270'); } else { canvas.setAttribute('class', 'rotate0'); } }; function clearCanvas() { if (ctx) { ctx.clearRect(0, 0, canvas.width, canvas.height); } } function renderPDF() { clearCanvas(); var params = { 'url': url, 'withCredentials': creds }; if (httpHeaders) { params.httpHeaders = httpHeaders; } if (url && url.length) { pdfLoaderTask = PDFJS.getDocument(params, null, null, scope.onProgress); pdfLoaderTask.then( function(_pdfDoc) { if (typeof scope.onLoad === 'function') { scope.onLoad(); } pdfDoc = _pdfDoc; scope.renderPage(scope.pageToDisplay); scope.$apply(function() { scope.pageCount = _pdfDoc.numPages; }); }, function(error) { if (error) { if (typeof scope.onError === 'function') { scope.onError(error); } } } ); } } scope.$watch('pageNum', function(newVal) { scope.pageToDisplay = parseInt(newVal); if (pdfDoc !== null) { scope.renderPage(scope.pageToDisplay); } }); scope.$watch('pdfUrl', function(newVal) { if (newVal !== '') { if (debug) { console.log('pdfUrl value change detected: ', scope.pdfUrl); } url = newVal; scope.pageNum = scope.pageToDisplay = pageToDisplay; if (pdfLoaderTask) { pdfLoaderTask.destroy().then(function () { renderPDF(); }); } else { renderPDF(); } } }); } }; } ]); })();