Skip to content

Commit

Permalink
update ViewerJS
Browse files Browse the repository at this point in the history
  • Loading branch information
toniher committed Mar 18, 2015
1 parent 1d4eb1e commit b5289a0
Show file tree
Hide file tree
Showing 12 changed files with 29,271 additions and 29,537 deletions.
8 changes: 0 additions & 8 deletions libs/ViewerJS/ODFViewerPlugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,14 +144,6 @@ function ODFViewerPlugin() {

this.onLoad = function () {};

this.getWidth = function () {
return odfElement.clientWidth;
};

this.getHeight = function () {
return odfElement.clientHeight;
};

this.fitToWidth = function (width) {
odfCanvas.fitToWidth(width);
};
Expand Down
146 changes: 84 additions & 62 deletions libs/ViewerJS/PDFViewerPlugin.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/**
* @license
* Copyright (C) 2013-2014 KO GmbH <[email protected]>
* Copyright (C) 2013-2015 KO GmbH <[email protected]>
*
* @licstart
* The JavaScript code in this page is free software: you can redistribute it
Expand Down Expand Up @@ -52,12 +52,10 @@ function PDFViewerPlugin() {
}

function init(callback) {
var pdfLib, textLayerLib, pluginCSS;
var pluginCSS;

loadScript('./compatibility.js', function () {
loadScript('./pdf.js');
loadScript('./pdf_find_bar.js');
loadScript('./pdf_find_controller.js');
loadScript('./ui_utils.js');
loadScript('./text_layer_builder.js');
loadScript('./pdfjsversion.js', callback);
Expand All @@ -78,25 +76,29 @@ function PDFViewerPlugin() {
RENDERING = {
BLANK: 0,
RUNNING: 1,
FINISHED: 2
FINISHED: 2,
RUNNINGOUTDATED: 3
},
startedTextExtraction = false,
container = null,
initialized = false,
pdfDocument = null,
pageViewScroll = null,
isGuessedSlideshow = true, // assume true as default, any non-matching page will unset this
isPresentationMode = false,
scale = 1,
currentPage = 1,
pageWidth,
pageHeight,
maxPageWidth = 0,
maxPageHeight = 0,
createdPageCount = 0;

function scrollIntoView(elem) {
elem.parentNode.scrollTop = elem.offsetTop;
}

function isScrolledIntoView(elem) {
if (elem.style.display === "none") {
return false;
}

var docViewTop = container.scrollTop,
docViewBottom = docViewTop + container.clientHeight,
elemTop = elem.offsetTop,
Expand All @@ -111,16 +113,16 @@ function PDFViewerPlugin() {
}

function getDomPage(page) {
return domPages[page.pageInfo.pageIndex];
return domPages[page.pageIndex];
}
function getPageText(page) {
return pageText[page.pageInfo.pageIndex];
return pageText[page.pageIndex];
}
function getRenderingStatus(page) {
return renderingStates[page.pageInfo.pageIndex];
return renderingStates[page.pageIndex];
}
function setRenderingStatus(page, renderStatus) {
renderingStates[page.pageInfo.pageIndex] = renderStatus;
renderingStates[page.pageIndex] = renderStatus;
}

function updatePageDimensions(page, width, height) {
Expand All @@ -141,27 +143,54 @@ function PDFViewerPlugin() {
CustomStyle.setProp('transform', textLayer, cssScale);
CustomStyle.setProp('transformOrigin', textLayer, '0% 0%');

// Once the page dimension is updated, the rendering state is blank.
setRenderingStatus(page, RENDERING.BLANK);
if (getRenderingStatus(page) === RENDERING.RUNNING) {
// TODO: should be able to cancel that rendering
setRenderingStatus(page, RENDERING.RUNNINGOUTDATED);
} else {
// Once the page dimension is updated, the rendering state is blank.
setRenderingStatus(page, RENDERING.BLANK);
}
}

function renderPage(page) {
var domPage = getDomPage(page),
textLayer = getPageText(page),
canvas = domPage.getElementsByTagName('canvas')[0];
function ensurePageRendered(page) {
var domPage, textLayer, canvas;

if (getRenderingStatus(page) === RENDERING.BLANK) {
setRenderingStatus(page, RENDERING.RUNNING);

domPage = getDomPage(page);
textLayer = getPageText(page);
canvas = domPage.getElementsByTagName('canvas')[0];

page.render({
canvasContext: canvas.getContext('2d'),
textLayer: textLayer,
viewport: page.getViewport(scale)
}).promise.then(function () {
setRenderingStatus(page, RENDERING.FINISHED);
if (getRenderingStatus(page) === RENDERING.RUNNINGOUTDATED) {
// restart
setRenderingStatus(page, RENDERING.BLANK);
ensurePageRendered(page);
} else {
setRenderingStatus(page, RENDERING.FINISHED);
}
});
}
}

function completeLoading() {
var allPagesVisible = !self.isSlideshow();
domPages.forEach(function (domPage) {
if (allPagesVisible) {
domPage.style.display = "block";
}
container.appendChild(domPage);
});

self.showPage(1);
self.onLoad();
}

function createPage(page) {
var pageNumber,
textLayerDiv,
Expand All @@ -170,13 +199,14 @@ function PDFViewerPlugin() {
domPage,
viewport;

pageNumber = page.pageInfo.pageIndex + 1;
pageNumber = page.pageIndex + 1;

viewport = page.getViewport(scale);

domPage = document.createElement('div');
domPage.id = 'pageContainer' + pageNumber;
domPage.className = 'page';
domPage.style.display = "none";

canvas = document.createElement('canvas');
canvas.id = 'canvas' + pageNumber;
Expand All @@ -185,36 +215,38 @@ function PDFViewerPlugin() {
textLayerDiv.className = 'textLayer';
textLayerDiv.id = 'textLayer' + pageNumber;

container.appendChild(domPage);
domPage.appendChild(canvas);
domPage.appendChild(textLayerDiv);

pages.push(page);
domPages.push(domPage);
renderingStates.push(RENDERING.BLANK);
pages[page.pageIndex] = page;
domPages[page.pageIndex] = domPage;
renderingStates[page.pageIndex] = RENDERING.BLANK;

updatePageDimensions(page, viewport.width, viewport.height);
pageWidth = viewport.width;
pageHeight = viewport.height;
if (maxPageWidth < viewport.width) {
maxPageWidth = viewport.width;
}
if (maxPageHeight < viewport.height) {
maxPageHeight = viewport.height;
}
// A very simple but generally true guess - if any page has the height greater than the width, treat it no longer as a slideshow
if (viewport.width < viewport.height) {
isGuessedSlideshow = false;
}

textLayer = new TextLayerBuilder({
textLayerDiv: textLayerDiv,
viewport: viewport,
pageIndex: pageNumber - 1
});
page.getTextContent().then(function (textContent) {
textLayer.setTextContent(textContent);
});
pageText.push(textLayer);
pageText[page.pageIndex] = textLayer;

createdPageCount += 1;
if (createdPageCount === (pdfDocument.numPages)) {
if (self.isSlideshow()) {
domPages.forEach(function (pageElement) {
pageElement.style.display = "none";
});
self.showPage(1);
}
self.onLoad();
completeLoading();
}
}

Expand All @@ -223,6 +255,7 @@ function PDFViewerPlugin() {
i,
pluginCSS;


init(function () {
PDFJS.workerSrc = "./pdf.worker.js";
PDFJS.getDocument(location).then(function loadPDF(doc) {
Expand All @@ -232,15 +265,12 @@ function PDFViewerPlugin() {
for (i = 0; i < pdfDocument.numPages; i += 1) {
pdfDocument.getPage(i + 1).then(createPage);
}

initialized = true;
});
});
};

this.isSlideshow = function () {
// A very simple but generally true guess - if the width is greater than the height, treat it as a slideshow
return pageWidth > pageHeight;
return isGuessedSlideshow;
};

this.onLoad = function () {};
Expand All @@ -249,59 +279,52 @@ function PDFViewerPlugin() {
return domPages;
};

this.getWidth = function () {
return pageWidth;
};

this.getHeight = function () {
return pageHeight;
};

this.fitToWidth = function (width) {
var zoomLevel;

if (self.getWidth() === width) {
if (maxPageWidth === width) {
return;
}
zoomLevel = width / pageWidth;
zoomLevel = width / maxPageWidth;
self.setZoomLevel(zoomLevel);
};

this.fitToHeight = function (height) {
var zoomLevel;

if (self.getHeight() === height) {
if (maxPageHeight === height) {
return;
}
zoomLevel = height / pageHeight;
zoomLevel = height / maxPageHeight;
self.setZoomLevel(zoomLevel);
};

this.fitToPage = function (width, height) {
var zoomLevel = width / pageWidth;
if (height / pageHeight < zoomLevel) {
zoomLevel = height / pageHeight;
var zoomLevel = width / maxPageWidth;
if (height / maxPageHeight < zoomLevel) {
zoomLevel = height / maxPageHeight;
}
self.setZoomLevel(zoomLevel);
};

this.fitSmart = function (width, height) {
var zoomLevel = width / pageWidth;
if (height && (height / pageHeight) < zoomLevel) {
zoomLevel = height / pageHeight;
var zoomLevel = width / maxPageWidth;
if (height && (height / maxPageHeight) < zoomLevel) {
zoomLevel = height / maxPageHeight;
}
zoomLevel = Math.min(1.0, zoomLevel);
self.setZoomLevel(zoomLevel);
};

this.setZoomLevel = function (zoomLevel) {
var i;
var i, viewport;

if (scale !== zoomLevel) {
scale = zoomLevel;

for (i = 0; i < pages.length; i += 1) {
updatePageDimensions(pages[i], pageWidth * scale, pageHeight * scale);
viewport = pages[i].getViewport(scale);
updatePageDimensions(pages[i], viewport.width, viewport.height);
}
}
};
Expand All @@ -315,9 +338,7 @@ function PDFViewerPlugin() {

for (i = 0; i < domPages.length; i += 1) {
if (isScrolledIntoView(domPages[i])) {
if (getRenderingStatus(pages[i]) === RENDERING.BLANK) {
renderPage(pages[i]);
}
ensurePageRendered(pages[i]);
}
}
};
Expand All @@ -340,6 +361,7 @@ function PDFViewerPlugin() {
if (self.isSlideshow()) {
domPages[currentPage - 1].style.display = "none";
currentPage = n;
ensurePageRendered(pages[n - 1]);
domPages[n - 1].style.display = "block";
} else {
scrollIntoView(domPages[n - 1]);
Expand Down
Loading

0 comments on commit b5289a0

Please sign in to comment.