var expand = this.$el.firstChild;
var shrink = this.$el.lastChild;
expand.scrollLeft = 100000;
expand.scrollTop = 100000;
shrink.scrollLeft = 100000;
shrink.scrollTop = 100000;
this.size.width = this.$el.offsetWidth;
this.size.height = this.$el.offsetHeight;
handler: function(size) {
this.$emit('resize', { width: this.size.width, height: this.size.height });
render: function(create) {
var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;';
var styleChild = 'position: absolute; left: 0; top: 0;';
style: style + 'animation-name: resizeSensorVisibility;',
'~animationstart': this.update
style: styleChild + 'width: 100000px; height: 100000px;'
style: styleChild + 'width: 200%; height: 200%;'
beforeDestroy: function() {
this.$emit('resize', { width: 0, height: 0 });
this.$emit('resizeSensorBeforeDestroy');
if ( this.initial === true )
this.$nextTick(this.update);
if ( this.$el.offsetParent !== this.$el.parentNode )
this.$el.parentNode.style.position = 'relative';
if ( 'attachEvent' in this.$el && !('AnimationEvent' in window) ) {
var onresizeHandler = function() {
var removeOnresizeEvent = function() {
this.$el.detachEvent('onresize', onresizeHandler);
this.$off('resizeSensorBeforeDestroy', removeOnresizeEvent);
this.$el.attachEvent('onresize', onresizeHandler);
this.$on('resizeSensorBeforeDestroy', removeOnresizeEvent);
function isPDFDocumentLoadingTask(obj) {
return typeof(obj) === 'object' && obj !== null && obj.__PDFDocumentLoadingTask === true;
function createLoadingTask(src, options) {
var loadingTask = PDFJS.getDocument(src);
loadingTask.__PDFDocumentLoadingTask = true;
if ( options && options.onPassword )
loadingTask.onPassword = options.onPassword;
if ( options && options.onProgress )
loadingTask.onProgress = options.onProgress;
function PDFJSWrapper(PDFJS, canvasElt, annotationLayerElt, emitEvent) {
canvasElt.getContext('2d').clearRect(0, 0, canvasElt.width, canvasElt.height);
function clearAnnotations() {
while ( annotationLayerElt.firstChild )
annotationLayerElt.removeChild(annotationLayerElt.firstChild);
this.destroy = function() {
this.getResolutionScale = function() {
return canvasElt.offsetWidth / canvasElt.width;
this.printPage = function(dpi, pageNumberOnly) {
var PRINT_RESOLUTION = dpi === undefined ? 150 : dpi;
var PRINT_UNITS = PRINT_RESOLUTION / 72.0;
var CSS_UNITS = 96.0 / 72.0;
var iframeElt = document.createElement('iframe');
function removeIframe() {
iframeElt.parentNode.removeChild(iframeElt);
new Promise(function(resolve, reject) {
iframeElt.frameBorder = '0';
iframeElt.scrolling = 'no';
iframeElt.height = '0px;'
iframeElt.style.cssText = 'position: absolute; top: 0; left: 0';
iframeElt.onload = function() {
resolve(this.contentWindow);
window.document.body.appendChild(iframeElt);
var viewport = page.getViewport(1);
win.document.head.appendChild(win.document.createElement('style')).textContent =
'@supports ((size:A4) and (size:1pt 1pt)) {' +
'@page { margin: 1pt; size: ' + ((viewport.width * PRINT_UNITS) / CSS_UNITS) + 'pt ' + ((viewport.height * PRINT_UNITS) / CSS_UNITS) + 'pt; }' +
'canvas { page-break-before: avoid; page-break-after: always; page-break-inside: avoid }' +
for ( var pageNumber = 1; pageNumber <= pdfDoc.numPages; ++pageNumber ) {
if ( pageNumberOnly !== undefined && pageNumberOnly.indexOf(pageNumber) === -1 )
pdfDoc.getPage(pageNumber)
var viewport = page.getViewport(1);
var printCanvasElt = win.document.body.appendChild(win.document.createElement('canvas'));
printCanvasElt.width = (viewport.width * PRINT_UNITS);
printCanvasElt.height = (viewport.height * PRINT_UNITS);
canvasContext: printCanvasElt.getContext('2d'),
this.renderPage = function(rotate) {
if ( pdfRender !== null )
return pdfRender.cancel();
if ( rotate === undefined )
var viewport = pdfPage.getViewport(canvasElt.offsetWidth / pdfPage.getViewport(1).width, rotate);
var devicePixelRatio = window.devicePixelRatio || 1;
var pageWidth = viewport.width * devicePixelRatio;
var pageHeight = viewport.height * devicePixelRatio;
emitEvent('page-size', pageWidth, pageHeight);
canvasElt.width = pageWidth;
canvasElt.height = pageHeight;
pdfRender = pdfPage.render({
canvasContext: canvasElt.getContext('2d'),
annotationLayerElt.style.visibility = 'hidden';
.then(function(annotations) {
PDFJS.AnnotationLayer.render({
viewport: viewport.clone({ dontFlip: true }),
annotations: annotations,
renderInteractiveForms: false,
annotationLayerElt.style.visibility = '';
if ( err === 'cancelled' )
return this.renderPage(rotate);
this.forEachPage = function(pageCallback) {
var numPages = pdfDoc.pdfInfo.numPages;
(function next(pageNum) {
if ( ++pageNum <= numPages )
this.loadPage = function(pageNumber, rotate) {
pdfDoc.getPage(pageNumber)
emitEvent('page-loaded', page.pageNumber);
this.loadDocument = function(src) {
emitEvent('num-pages', undefined);
canvasElt.removeAttribute('width');
canvasElt.removeAttribute('height');
if ( isPDFDocumentLoadingTask(src) ) {
var loadingTask = createLoadingTask(src, {
onPassword: function(updatePassword, reason) {
case PDFJS.PasswordResponses.NEED_PASSWORD:
reasonStr = 'NEED_PASSWORD';
case PDFJS.PasswordResponses.INCORRECT_PASSWORD:
reasonStr = 'INCORRECT_PASSWORD';
emitEvent('password', updatePassword, reasonStr);
onProgress: function(status) {
var ratio = status.loaded / status.total;
emitEvent('progress', Math.min(ratio, 1));
emitEvent('num-pages', pdf.numPages);
annotationLayerElt.style.transformOrigin = '0 0';
style: 'position: relative'
this.pdf.loadDocument(this.src);
this.pdf.loadPage(this.page, this.rotate);
this.pdf.renderPage(this.rotate);
var canvasElt = this.$el.childNodes[0];
var annotationLayerElt = this.$el.childNodes[1];
canvasElt.style.height = canvasElt.offsetWidth * (canvasElt.height / canvasElt.width) + 'px';
var resolutionScale = this.pdf.getResolutionScale();
if ( resolutionScale < 0.85 || resolutionScale > 1.15 )
this.pdf.renderPage(this.rotate);
annotationLayerElt.style.transform = 'scale('+resolutionScale+')';
print: function(dpi, pageList) {
this.pdf.printPage(dpi, pageList);
var canvasElt = this.$el.childNodes[0];
var annotationLayerElt = this.$el.childNodes[1];
this.pdf = new PDFJSWrapper(PDFJS, canvasElt, annotationLayerElt, this.$emit.bind(this));
this.$on('loaded', function() {
this.pdf.loadPage(this.page, this.rotate);
this.$on('page-size', function(width, height) {
canvasElt.style.height = canvasElt.offsetWidth * (height / width) + 'px';
this.pdf.loadDocument(this.src);
window.PDFJS.workerSrc = 'https://npmcdn.com/pdfjs-dist/build/pdf.worker.js';