-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
12 changed files
with
29,271 additions
and
29,537 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
@@ -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); | ||
|
@@ -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, | ||
|
@@ -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) { | ||
|
@@ -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, | ||
|
@@ -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; | ||
|
@@ -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(); | ||
} | ||
} | ||
|
||
|
@@ -223,6 +255,7 @@ function PDFViewerPlugin() { | |
i, | ||
pluginCSS; | ||
|
||
|
||
init(function () { | ||
PDFJS.workerSrc = "./pdf.worker.js"; | ||
PDFJS.getDocument(location).then(function loadPDF(doc) { | ||
|
@@ -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 () {}; | ||
|
@@ -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); | ||
} | ||
} | ||
}; | ||
|
@@ -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]); | ||
} | ||
} | ||
}; | ||
|
@@ -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]); | ||
|
Oops, something went wrong.