mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-20 15:18:08 +02:00
Initial merge of master.
This commit is contained in:
parent
c9508100ff
commit
65ea07a3a2
13 changed files with 419 additions and 348 deletions
|
@ -163,7 +163,7 @@
|
|||
|
||||
// IE9 text/html data URI
|
||||
(function checkDocumentDocumentModeCompatibility() {
|
||||
if (document.documentMode !== 9)
|
||||
if (!('documentMode' in document) || document.documentMode !== 9)
|
||||
return;
|
||||
// overriding the src property
|
||||
var originalSrcDescriptor = Object.getOwnPropertyDescriptor(
|
||||
|
|
|
@ -8,6 +8,10 @@ body {
|
|||
padding: 0px;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* === Toolbar === */
|
||||
#controls {
|
||||
background-color: #eee;
|
||||
|
@ -34,6 +38,10 @@ body {
|
|||
margin: 4px;
|
||||
}
|
||||
|
||||
#controls > a > img {
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
#controls > button {
|
||||
line-height: 32px;
|
||||
}
|
||||
|
|
|
@ -20,12 +20,12 @@
|
|||
|
||||
<body>
|
||||
<div id="controls">
|
||||
<button id="previous" onclick="PDFView.page--;">
|
||||
<button id="previous" onclick="PDFView.page--;" oncontextmenu="return false;">
|
||||
<img src="images/go-up.svg" align="top" height="32"/>
|
||||
Previous
|
||||
</button>
|
||||
|
||||
<button id="next" onclick="PDFView.page++;">
|
||||
<button id="next" onclick="PDFView.page++;" oncontextmenu="return false;">
|
||||
<img src="images/go-down.svg" align="top" height="32"/>
|
||||
Next
|
||||
</button>
|
||||
|
@ -39,16 +39,16 @@
|
|||
|
||||
<div class="separator"></div>
|
||||
|
||||
<button id="next" title="Zoom Out" onclick="PDFView.zoomOut();">
|
||||
<button id="zoomOut" title="Zoom Out" onclick="PDFView.zoomOut();" oncontextmenu="return false;">
|
||||
<img src="images/zoom-out.svg" align="top" height="32"/>
|
||||
</button>
|
||||
<button id="next" title="Zoom In" onclick="PDFView.zoomIn();">
|
||||
<button id="zoomIn" title="Zoom In" onclick="PDFView.zoomIn();" oncontextmenu="return false;">
|
||||
<img src="images/zoom-in.svg" align="top" height="32"/>
|
||||
</button>
|
||||
|
||||
<div class="separator"></div>
|
||||
|
||||
<select id="scaleSelect" onchange="PDFView.parseScale(this.value);">
|
||||
<select id="scaleSelect" onchange="PDFView.parseScale(this.value);" oncontextmenu="return false;">
|
||||
<option id="customScaleOption" value="custom"></option>
|
||||
<option value="0.5">50%</option>
|
||||
<option value="0.75">75%</option>
|
||||
|
@ -62,17 +62,26 @@
|
|||
|
||||
<div class="separator"></div>
|
||||
|
||||
<button id="print" onclick="window.print();">
|
||||
<button id="print" onclick="window.print();" oncontextmenu="return false;">
|
||||
<img src="images/document-print.svg" align="top" height="32"/>
|
||||
Print
|
||||
</button>
|
||||
|
||||
<div class="separator"></div>
|
||||
|
||||
<input id="fileInput" type="file"/>
|
||||
<button id="download" title="Download" onclick="PDFView.download();" oncontextmenu="return false;">
|
||||
<img src="images/download.svg" align="top" height="32"/>
|
||||
Download
|
||||
</button>
|
||||
|
||||
<div class="separator"></div>
|
||||
|
||||
<input id="fileInput" type="file" oncontextmenu="return false;"/>
|
||||
|
||||
<div class="separator"></div>
|
||||
|
||||
<a href="#" id="viewBookmark" title="Current View (bookmark or copy the location)">
|
||||
<img src="images/bookmark.svg" alt="Bookmark" align="top" height="32"/>
|
||||
</a>
|
||||
|
||||
<span id="info">--</span>
|
||||
</div>
|
||||
|
||||
|
@ -81,7 +90,7 @@
|
|||
<div id="sidebarScrollView">
|
||||
<div id="sidebarView"></div>
|
||||
</div>
|
||||
<div id="outlineScrollView" style="display:none">
|
||||
<div id="outlineScrollView" hidden='true'>
|
||||
<div id="outlineView"></div>
|
||||
</div>
|
||||
<div id="sidebarControls">
|
||||
|
|
139
web/viewer.js
139
web/viewer.js
|
@ -89,16 +89,23 @@ var PDFView = {
|
|||
var pages = this.pages;
|
||||
var input = document.getElementById('pageNumber');
|
||||
if (!(0 < val && val <= pages.length)) {
|
||||
input.value = this.page;
|
||||
var event = document.createEvent('UIEvents');
|
||||
event.initUIEvent('pagechange', false, false, window, 0);
|
||||
event.pageNumber = this.page;
|
||||
window.dispatchEvent(event);
|
||||
return;
|
||||
}
|
||||
|
||||
currentPageNumber = val;
|
||||
document.getElementById('previous').disabled = (val == 1);
|
||||
document.getElementById('next').disabled = (val == pages.length);
|
||||
if (input.value != val) {
|
||||
input.value = val;
|
||||
}
|
||||
var event = document.createEvent('UIEvents');
|
||||
event.initUIEvent('pagechange', false, false, window, 0);
|
||||
event.pageNumber = val;
|
||||
window.dispatchEvent(event);
|
||||
|
||||
// checking if the this.page was called from the updateViewarea function:
|
||||
// avoiding the creation of two "set page" method (internal and public)
|
||||
if (updateViewarea.inProgress)
|
||||
return;
|
||||
|
||||
pages[val - 1].scrollIntoView();
|
||||
},
|
||||
|
@ -108,10 +115,7 @@ var PDFView = {
|
|||
},
|
||||
|
||||
open: function pdfViewOpen(url, scale) {
|
||||
if (url.indexOf('http') == 0)
|
||||
return;
|
||||
|
||||
document.title = url;
|
||||
document.title = this.url = url;
|
||||
|
||||
getPdf(
|
||||
{
|
||||
|
@ -127,6 +131,10 @@ var PDFView = {
|
|||
});
|
||||
},
|
||||
|
||||
download: function pdfViewDownload() {
|
||||
window.open(this.url + '?pdfjs.action=download', '_parent');
|
||||
},
|
||||
|
||||
navigateTo: function pdfViewNavigateTo(dest) {
|
||||
if (typeof dest === 'string')
|
||||
dest = this.destinations[dest];
|
||||
|
@ -147,12 +155,20 @@ var PDFView = {
|
|||
if (typeof dest === 'string')
|
||||
return '#' + escape(dest);
|
||||
if (dest instanceof Array) {
|
||||
var destRef = dest[0]; // see nevigateTo method for dest format
|
||||
var destRef = dest[0]; // see navigateTo method for dest format
|
||||
var pageNumber = destRef instanceof Object ?
|
||||
this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :
|
||||
(destRef + 1);
|
||||
if (pageNumber) {
|
||||
return '#page=' + pageNumber + '&dest=' + dest.slice(1).join(',');
|
||||
var pdfOpenParams = '#page=' + pageNumber;
|
||||
if (isName(dest[1], 'XYZ')) {
|
||||
var scale = (dest[4] || this.currentScale);
|
||||
pdfOpenParams += '&zoom=' + (scale * 100);
|
||||
if (dest[2] || dest[3]) {
|
||||
pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0);
|
||||
}
|
||||
}
|
||||
return pdfOpenParams;
|
||||
}
|
||||
}
|
||||
return '';
|
||||
|
@ -171,14 +187,16 @@ var PDFView = {
|
|||
|
||||
load: function pdfViewLoad(data, scale) {
|
||||
var loadingIndicator = document.getElementById('loading');
|
||||
loadingIndicator.style.display = 'none';
|
||||
loadingIndicator.setAttribute('hidden', 'true');
|
||||
|
||||
var sidebar = document.getElementById('sidebarView');
|
||||
sidebar.parentNode.scrollTop = 0;
|
||||
|
||||
while (sidebar.hasChildNodes())
|
||||
sidebar.removeChild(sidebar.lastChild);
|
||||
clearInterval(sidebar._loadingInterval);
|
||||
|
||||
if ('_loadingInterval' in sidebar)
|
||||
clearInterval(sidebar._loadingInterval);
|
||||
|
||||
var container = document.getElementById('viewer');
|
||||
while (container.hasChildNodes())
|
||||
|
@ -226,10 +244,32 @@ var PDFView = {
|
|||
return;
|
||||
|
||||
if (hash.indexOf('=') >= 0) {
|
||||
// TODO more complex hashes, for now catching page=XX only
|
||||
var m = /\bpage=(\d+)/.exec(hash);
|
||||
if (m && m[1] > 0)
|
||||
this.page = m[1];
|
||||
// parsing query string
|
||||
var paramsPairs = hash.split('&');
|
||||
var params = {};
|
||||
for (var i = 0; i < paramsPairs.length; ++i) {
|
||||
var paramPair = paramsPairs[i].split('=');
|
||||
params[paramPair[0]] = paramPair[1];
|
||||
}
|
||||
// borrowing syntax from "Parameters for Opening PDF Files"
|
||||
if ('nameddest' in params) {
|
||||
PDFView.navigateTo(params.nameddest);
|
||||
return;
|
||||
}
|
||||
if ('page' in params) {
|
||||
var pageNumber = (params.page | 0) || 1;
|
||||
this.page = pageNumber;
|
||||
if ('zoom' in params) {
|
||||
var zoomArgs = params.zoom.split(','); // scale,left,top
|
||||
// building destination array
|
||||
var dest = [null, new Name('XYZ'), (zoomArgs[1] | 0),
|
||||
(zoomArgs[2] | 0), (zoomArgs[0] | 0) / 100];
|
||||
var currentPage = this.pages[pageNumber - 1];
|
||||
currentPage.scrollIntoView(dest);
|
||||
} else
|
||||
this.page = page; // simple page
|
||||
return;
|
||||
}
|
||||
} else if (/^\d+$/.test(hash)) // page number
|
||||
this.page = hash;
|
||||
else // named destination
|
||||
|
@ -243,14 +283,14 @@ var PDFView = {
|
|||
var outlineSwitchButton = document.getElementById('outlineSwitch');
|
||||
switch (view) {
|
||||
case 'thumbs':
|
||||
thumbsScrollView.style.display = 'block';
|
||||
outlineScrollView.style.display = 'none';
|
||||
thumbsScrollView.removeAttribute('hidden');
|
||||
outlineScrollView.setAttribute('hidden', 'true');
|
||||
thumbsSwitchButton.setAttribute('data-selected', true);
|
||||
outlineSwitchButton.removeAttribute('data-selected');
|
||||
break;
|
||||
case 'outline':
|
||||
thumbsScrollView.style.display = 'none';
|
||||
outlineScrollView.style.display = 'block';
|
||||
thumbsScrollView.setAttribute('hidden', 'true');
|
||||
outlineScrollView.removeAttribute('hidden');
|
||||
thumbsSwitchButton.removeAttribute('data-selected');
|
||||
outlineSwitchButton.setAttribute('data-selected', true);
|
||||
break;
|
||||
|
@ -339,6 +379,11 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight,
|
|||
}
|
||||
}
|
||||
|
||||
this.getPagePoint = function pageViewGetPagePoint(x, y) {
|
||||
var scale = PDFView.currentScale;
|
||||
return this.content.rotatePoint(x / scale, y / scale);
|
||||
};
|
||||
|
||||
this.scrollIntoView = function pageViewScrollIntoView(dest) {
|
||||
if (!dest) {
|
||||
div.scrollIntoView(true);
|
||||
|
@ -388,7 +433,7 @@ var PageView = function pageView(container, content, id, pageWidth, pageHeight,
|
|||
this.content.rotatePoint(x + width, y + height)
|
||||
];
|
||||
|
||||
if (scale)
|
||||
if (scale && scale !== PDFView.currentScale)
|
||||
PDFView.setScale(scale, true);
|
||||
|
||||
setTimeout(function pageViewScrollIntoViewRelayout() {
|
||||
|
@ -544,26 +589,15 @@ window.addEventListener('load', function webViewerLoad(evt) {
|
|||
params[unescape(param[0])] = unescape(param[1]);
|
||||
}
|
||||
|
||||
PDFView.open(params.file || kDefaultURL, parseFloat(params.scale));
|
||||
var scale = ('scale' in params) ? params.scale : kDefaultScale;
|
||||
PDFView.open(params.file || kDefaultURL, parseFloat(scale));
|
||||
|
||||
if (!window.File || !window.FileReader || !window.FileList || !window.Blob)
|
||||
document.getElementById('fileInput').style.display = 'none';
|
||||
document.getElementById('fileInput').setAttribute('hidden', 'true');
|
||||
else
|
||||
document.getElementById('fileInput').value = null;
|
||||
}, true);
|
||||
|
||||
window.addEventListener('pdfload', function webViewerPdfload(evt) {
|
||||
PDFView.load(evt.detail);
|
||||
}, true);
|
||||
|
||||
window.addEventListener('pdfprogress', function webViewerPdfProgress(evt) {
|
||||
PDFView.progress(evt.detail);
|
||||
}, true);
|
||||
|
||||
window.addEventListener('pdferror', function webViewerPdfError(evt) {
|
||||
PDFView.error();
|
||||
}, true);
|
||||
|
||||
function updateViewarea() {
|
||||
var visiblePages = PDFView.getVisiblePages();
|
||||
for (var i = 0; i < visiblePages.length; i++) {
|
||||
|
@ -575,13 +609,21 @@ function updateViewarea() {
|
|||
if (!visiblePages.length)
|
||||
return;
|
||||
|
||||
updateViewarea.inProgress = true; // used in "set page"
|
||||
var currentId = PDFView.page;
|
||||
var firstPage = visiblePages[0];
|
||||
var lastPage = visiblePages[visiblePages.length - 1];
|
||||
if (currentId > lastPage.id && lastPage.y > window.pageYOffset)
|
||||
PDFView.page = lastPage.id;
|
||||
else if (currentId < firstPage.id)
|
||||
PDFView.page = firstPage.id;
|
||||
PDFView.page = firstPage.id;
|
||||
updateViewarea.inProgress = false;
|
||||
|
||||
var kViewerTopMargin = 52;
|
||||
var pageNumber = firstPage.id;
|
||||
var pdfOpenParams = '#page=' + pageNumber;
|
||||
pdfOpenParams += '&zoom=' + Math.round(PDFView.currentScale * 100);
|
||||
var currentPage = PDFView.pages[pageNumber - 1];
|
||||
var topLeft = currentPage.getPagePoint(window.pageXOffset,
|
||||
window.pageYOffset - firstPage.y - kViewerTopMargin);
|
||||
pdfOpenParams += ',' + Math.round(topLeft.x) + ',' + Math.round(topLeft.y);
|
||||
document.getElementById('viewBookmark').href = pdfOpenParams;
|
||||
}
|
||||
|
||||
window.addEventListener('scroll', function webViewerScroll(evt) {
|
||||
|
@ -622,6 +664,10 @@ window.addEventListener('change', function webViewerChange(evt) {
|
|||
fileReader.readAsBinaryString(file);
|
||||
|
||||
document.title = file.name;
|
||||
|
||||
// URL does not reflect proper document location - hiding some icons.
|
||||
document.getElementById('viewBookmark').setAttribute('hidden', 'true');
|
||||
document.getElementById('download').setAttribute('hidden', 'true');
|
||||
}, true);
|
||||
|
||||
window.addEventListener('transitionend', function webViewerTransitionend(evt) {
|
||||
|
@ -672,10 +718,11 @@ window.addEventListener('scalechange', function scalechange(evt) {
|
|||
}, true);
|
||||
|
||||
window.addEventListener('pagechange', function pagechange(evt) {
|
||||
var page = evt.detail;
|
||||
document.getElementById('pageNumber').value = page;
|
||||
document.getElementById('previous').disabled = (page == 1);
|
||||
document.getElementById('next').disabled = (page == PDFView.pages.length);
|
||||
var page = evt.pageNumber;
|
||||
if (document.getElementById('pageNumber').value != page)
|
||||
document.getElementById('pageNumber').value = page;
|
||||
document.getElementById('previous').disabled = (page <= 1);
|
||||
document.getElementById('next').disabled = (page >= PDFView.pages.length);
|
||||
}, true);
|
||||
|
||||
window.addEventListener('keydown', function keydown(evt) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue