-<!DOCTYPE html>
<html>
- <head>
- <title>Simple pdf.js page viewer</title>
- <!-- PDFJSSCRIPT_INCLUDE_FIREFOX_EXTENSION -->
-
- <link rel="stylesheet" href="viewer.css"/>
-
- <script type="text/javascript" src="compatibility.js"></script> <!-- PDFJSSCRIPT_REMOVE_FIREFOX_EXTENSION -->
-
- <!-- PDFJSSCRIPT_INCLUDE_BUILD -->
- <script type="text/javascript" src="../src/core.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/util.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/api.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/metadata.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/canvas.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/obj.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/function.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/charsets.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/cidmaps.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/colorspace.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/crypto.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/evaluator.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/fonts.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/glyphlist.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/image.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/metrics.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/parser.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/pattern.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/stream.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/worker.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../external/jpgjs/jpg.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/jpx.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="../src/bidi.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript">PDFJS.workerSrc = '../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
- <script type="text/javascript" src="debugger.js"></script>
- <script type="text/javascript" src="viewer.js"></script>
-
-
- </head>
+ <head>
- <title>PDF viewer</title>
++ <title>PDF.js viewer</title>
+ <!-- PDFJSSCRIPT_INCLUDE_FIREFOX_EXTENSION -->
+
+ <link rel="stylesheet" href="viewer.css"/>
+
+ <script type="text/javascript" src="compatibility.js"></script> <!-- PDFJSSCRIPT_REMOVE_FIREFOX_EXTENSION -->
+
+ <!-- PDFJSSCRIPT_INCLUDE_BUILD -->
+ <script type="text/javascript" src="../src/core.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/util.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
++ <script type="text/javascript" src="../src/api.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/metadata.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/canvas.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/obj.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/function.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/charsets.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/cidmaps.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/colorspace.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/crypto.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/evaluator.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/fonts.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/glyphlist.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/image.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/metrics.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/parser.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/pattern.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/stream.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/worker.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../external/jpgjs/jpg.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/jpx.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="../src/bidi.js"></script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript">PDFJS.workerSrc = '../src/worker_loader.js';</script> <!-- PDFJSSCRIPT_REMOVE_CORE -->
+ <script type="text/javascript" src="debugger.js"></script>
+ <script type="text/javascript" src="viewer.js"></script>
+ </head>
-
+
<body>
-
- <div id="controls">
- <button id="previous" onclick="PDFView.page--;" oncontextmenu="return false;">
- <img src="images/go-up.svg" align="top" height="16"/>
- Previous
- </button>
-
- <button id="next" onclick="PDFView.page++;" oncontextmenu="return false;">
- <img src="images/go-down.svg" align="top" height="16"/>
- Next
- </button>
-
- <div class="separator"></div>
-
- <input type="number" id="pageNumber" onchange="PDFView.page = this.value;" value="1" size="4" min="1" />
-
- <span>/</span>
- <span id="numPages">--</span>
-
- <div class="separator"></div>
-
- <button id="zoomOut" title="Zoom Out" onclick="PDFView.zoomOut();" oncontextmenu="return false;">
- <img src="images/zoom-out.svg" align="top" height="16"/>
- </button>
- <button id="zoomIn" title="Zoom In" onclick="PDFView.zoomIn();" oncontextmenu="return false;">
- <img src="images/zoom-in.svg" align="top" height="16"/>
- </button>
-
- <div class="separator"></div>
-
- <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>
- <option value="1">100%</option>
- <option value="1.25">125%</option>
- <option value="1.5">150%</option>
- <option value="2">200%</option>
- <option id="pageWidthOption" value="page-width">Page Width</option>
- <option id="pageFitOption" value="page-fit">Page Fit</option>
- <option id="pageAutoOption" value="auto" selected="selected">Auto</option>
- </select>
-
- <div class="separator"></div>
-
- <button id="print" onclick="window.print();" oncontextmenu="return false;">
- <img src="images/document-print.svg" align="top" height="16"/>
- Print
- </button>
+ <div id="outerContainer">
+
+ <div class="toolbar">
+ <div id="toolbarContainer">
+ <div id="toolbarSidebar" class="hidden">
+ <div class="splitToolbarButton toggled">
+ <div id="viewThumbnail" class="toolbarButton toggled" title="Show Thumbnails" onclick="PDFView.switchSidebarView('thumbs')"></div>
+ <div class="splitToolbarButtonSeparator"></div>
+ <div id="viewOutline" class="toolbarButton" title="Show Document Outline" onclick="PDFView.switchSidebarView('outline')" disabled></div>
+ </div>
+ </div>
+ <div id="toolbarViewer">
+ <div id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar"></div>
+ <div class="toolbarButtonSpacer"></div>
+ <div class="splitToolbarButton">
+ <div class="toolbarButton pageUp" title="Previous Page" onclick="PDFView.page--"></div>
+ <div class="splitToolbarButtonSeparator"></div>
+ <div class="toolbarButton pageDown" title="Next Page" onclick="PDFView.page++"></div>
+ </div>
+ <input type="number" id="pageNumber" class="toolbarField" onchange="PDFView.page = this.value;" value="1" size="4" min="1">
+ </input>
+ <div id="numPages" class="toolbarLabel"></div>
+ <div class="toolbarButtonFlexibleSpacer"></div>
+ <div class="splitToolbarButton">
+ <div class="toolbarButton zoomOut" title="Zoom Out" onclick="PDFView.zoomOut();"></div>
+ <div class="splitToolbarButtonSeparator"></div>
+ <div class="toolbarButton zoomIn" title="Zoom In" onclick="PDFView.zoomIn();"></div>
+ </div>
+ <div class="dropdownToolbarButton">
+ <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>
+ <option value="1">100%</option>
+ <option value="1.25">125%</option>
+ <option value="1.5">150%</option>
+ <option value="2">200%</option>
+ <option id="pageWidthOption" value="page-width">Page Width</option>
+ <option id="pageFitOption" value="page-fit">Page Fit</option>
+ <option id="pageAutoOption" value="auto" selected="selected">Auto</option>
+ </select>
+ </div>
+
+ <div class="toolbarButtonFlexibleSpacer"></div>
+
+ <input id="fileInput" class="toolbarButton fileInput" type="file" oncontextmenu="return false;"/>
+
+ <div class="toolbarButtonSpacer"></div>
+
+ <!-- <div class="toolbarButton print" title="Print"></div> -->
+ <div id="download" class="toolbarButton download" title="Download" onclick="PDFView.download();"></div>
+ <a href="#" id="viewBookmark" class="toolbarButton bookmark" title="Bookmark (or copy) current location">
+ </a>
+ </div>
+ </div>
+ </div>
- <button id="download" title="Download" onclick="PDFView.download();" oncontextmenu="return false;">
- <img src="images/download.svg" align="top" height="16"/>
- Download
- </button>
+ <div id="sidebarContainer" class="hidden">
+ <div id="thumbnailView">
+ </div>
- <div class="separator"></div>
+ <div id="outlineView" class="hidden">
+ </div>
+ </div>
- <input id="fileInput" type="file" oncontextmenu="return false;"/>
+ <div id="viewerContainer">
+ <div id="viewer" />
+ </div>
- <div id="fileInputSeperator" class="separator"></div>
+ <div id="loadingBox">
+ <div id="loading">Loading... 0%</div>
+ <div id="loadingBar"><div class="progress"></div></div>
+ </div>
- <a href="#" id="viewBookmark" title="Bookmark (or copy) current location">
- <img src="images/bookmark.svg" alt="Bookmark" align="top" height="16"/>
- </a>
+ </div> <!-- outerContainer -->
- </div>
<div id="errorWrapper" hidden='true'>
<div id="errorMessageLeft">
<span id="errorMessage"></span>
while (container.hasChildNodes())
container.removeChild(container.lastChild);
- var pdf;
- try {
- pdf = new PDFJS.PDFDoc(data);
- } catch (e) {
- this.error('An error occurred while reading the PDF.', e);
- }
- var pagesCount = pdf.numPages;
- var id = pdf.fingerprint;
+ var pagesCount = pdfDocument.numPages;
+ var id = pdfDocument.fingerprint;
var storedHash = null;
- document.getElementById('numPages').textContent = pagesCount;
+ document.getElementById('numPages').textContent = '/ ' + pagesCount;
document.getElementById('pageNumber').max = pagesCount;
PDFView.documentFingerprint = id;
var store = PDFView.store = new Settings(id);
var pages = this.pages = [];
var pagesRefMap = {};
var thumbnails = this.thumbnails = [];
- for (var i = 1; i <= pagesCount; i++) {
- var page = pdf.getPage(i);
- var pageView = new PageView(container, page, i, page.width, page.height,
- page.stats, this.navigateTo.bind(this));
- var thumbnailView = new ThumbnailView(thumbsView, page, i,
- page.width / page.height);
- bindOnAfterDraw(pageView, thumbnailView);
-
- pages.push(pageView);
- thumbnails.push(thumbnailView);
- var pageRef = page.ref;
- pagesRefMap[pageRef.num + ' ' + pageRef.gen + ' R'] = i;
- }
+ var pagePromises = [];
+ for (var i = 1; i <= pagesCount; i++)
+ pagePromises.push(pdfDocument.getPage(i));
+ var self = this;
+ var pagesPromise = PDFJS.Promise.all(pagePromises);
+ pagesPromise.then(function(promisedPages) {
+ for (var i = 1; i <= pagesCount; i++) {
+ var page = promisedPages[i - 1];
+ var pageView = new PageView(container, page, i, scale,
+ page.stats, self.navigateTo.bind(self));
- var thumbnailView = new ThumbnailView(sidebar, page, i);
++ var thumbnailView = new ThumbnailView(thumbsView, page, i);
+ bindOnAfterDraw(pageView, thumbnailView);
+
+ pages.push(pageView);
+ thumbnails.push(thumbnailView);
+ var pageRef = page.ref;
+ pagesRefMap[pageRef.num + ' ' + pageRef.gen + ' R'] = i;
+ }
- this.pagesRefMap = pagesRefMap;
- this.destinations = pdf.catalog.destinations;
+ self.pagesRefMap = pagesRefMap;
+ });
- if (pdf.catalog.documentOutline) {
- this.outline = new DocumentOutlineView(pdf.catalog.documentOutline);
- var outlineSwitchButton = document.getElementById('viewOutline');
- outlineSwitchButton.removeAttribute('disabled');
- this.switchSidebarView('outline');
- }
+ var destinationsPromise = pdfDocument.getDestinations();
+ destinationsPromise.then(function(destinations) {
+ self.destinations = destinations;
+ });
+
+ // outline and initial view depends on destinations and pagesRefMap
+ PDFJS.Promise.all([pagesPromise, destinationsPromise]).then(function() {
+ pdfDocument.getOutline().then(function(outline) {
+ if (!outline)
+ return;
- var outlineSwitchButton = document.getElementById('outlineSwitch');
+ self.outline = new DocumentOutlineView(outline);
++ var outlineSwitchButton = document.getElementById('viewOutline');
+ outlineSwitchButton.removeAttribute('disabled');
+ self.switchSidebarView('outline');
+ });
+
+ self.setInitialView(storedHash, scale);
+ });
+
+ pdfDocument.getMetadata().then(function(data) {
+ var info = data.info, metadata = data.metadata;
+ self.documentInfo = info;
+ self.metadata = metadata;
+
+ var pdfTitle;
+ if (metadata) {
+ if (metadata.has('dc:title'))
+ pdfTitle = metadata.get('dc:title');
+ }
+
+ if (!pdfTitle && info && info['Title'])
+ pdfTitle = info['Title'];
+
+ if (pdfTitle)
+ document.title = pdfTitle + ' - ' + document.title;
+ });
+ },
+
+ setInitialView: function pdfViewSetInitialView(storedHash, scale) {
// Reset the current scale, as otherwise the page's scale might not get
// updated if the zoom level stayed the same.
this.currentScale = 0;
var kBottomMargin = 5;
var visibleThumbs = [];
- var view = document.getElementById('sidebarScrollView');
+ var view = document.getElementById('thumbnailView');
var currentHeight = kBottomMargin;
-- var top = view.scrollTop;
-
++
++ var top = view.scrollTop;
for (var i = 1; i <= thumbs.length; ++i) {
var thumb = thumbs[i - 1];
var thumbHeight = thumb.height * thumb.scaleY + kBottomMargin;
return false;
};
- var view = page.view;
- this.width = view.width;
- this.height = view.height;
+ var viewport = pdfPage.getViewport(1);
+ var pageWidth = viewport.width;
+ var pageHeight = viewport.height;
+ var pageRatio = pageWidth / pageHeight;
this.id = id;
- var maxThumbSize = 134;
- var canvasWidth = this.width = pageRatio >= 1 ? maxThumbSize :
- maxThumbSize * pageRatio;
- var canvasHeight = this.height = pageRatio <= 1 ? maxThumbSize :
- maxThumbSize / pageRatio;
+ var canvasWidth = 98;
+ var canvasHeight = canvasWidth / this.width * this.height;
- var scaleX = this.scaleX = (canvasWidth / this.width);
- var scaleY = this.scaleY = (canvasHeight / this.height);
+ var scaleX = this.scaleX = (canvasWidth / pageWidth);
+ var scaleY = this.scaleY = (canvasHeight / pageHeight);
var div = document.createElement('div');
div.id = 'thumbnailContainer' + id;
canvas.width = canvasWidth;
canvas.height = canvasHeight;
+ canvas.className = 'thumbnailImage';
div.setAttribute('data-loaded', true);
-
- div.appendChild(canvas);
++
+ var ring = document.createElement('div');
+ ring.className = 'thumbnailSelectionRing';
+ ring.appendChild(canvas);
+ div.appendChild(ring);
var ctx = canvas.getContext('2d');
ctx.save();
PDFBug.init();
}
- var sidebarScrollView = document.getElementById('sidebarScrollView');
- sidebarScrollView.addEventListener('scroll', updateThumbViewArea, true);
+ var thumbsView = document.getElementById('thumbnailView');
+ thumbsView.addEventListener('scroll', updateThumbViewArea, true);
+
+ document.getElementById('sidebarToggle').addEventListener('click',
+ function() {
+ this.classList.toggle('toggled');
+ document.getElementById('toolbarSidebar').classList.toggle('hidden');
+ document.getElementById('sidebarContainer').classList.toggle('hidden');
+ updateThumbViewArea();
+ });
++
+ PDFView.open(file, 0);
}, true);
/**