diff --git a/pdf.js b/pdf.js index 4a7d0fe74..601518f57 100644 --- a/pdf.js +++ b/pdf.js @@ -5480,8 +5480,8 @@ var DeviceGrayCS = (function() { }, getRgbBuffer: function graycs_getRgbBuffer(input, bits) { var scale = 255 / ((1 << bits) - 1); - var length = input.length * 3; - var rgbBuf = new Uint8Array(length); + var length = input.length; + var rgbBuf = new Uint8Array(length * 3); for (var i = 0, j = 0; i < length; ++i) { var c = (scale * input[i]) | 0; rgbBuf[j++] = c; diff --git a/test/test.py b/test/test.py index d1e798d86..0d40efbc8 100644 --- a/test/test.py +++ b/test/test.py @@ -126,14 +126,15 @@ class PDFTestHandler(BaseHTTPRequestHandler): self.wfile.write("

PDFs of " + path + "

\n") for filename in os.listdir(location): if filename.lower().endswith('.pdf'): - self.wfile.write("" + + self.wfile.write("" + filename + "
\n") self.wfile.write("") def do_GET(self): url = urlparse(self.path) # Ignore query string - path, _ = url.path, url.query + path, _ = urllib.unquote_plus(url.path), url.query path = os.path.abspath(os.path.realpath(DOC_ROOT + os.sep + path)) prefix = os.path.commonprefix(( path, DOC_ROOT )) _, ext = os.path.splitext(path.lower()) diff --git a/web/viewer.js b/web/viewer.js index 811cfcbcc..c5d79c541 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -8,6 +8,8 @@ var kDefaultScale = 1.5; var kDefaultScaleDelta = 1.1; var kCacheSize = 20; var kCssUnits = 96.0 / 72.0; +var kScrollbarPadding = 40; + var Cache = function(size) { var data = []; @@ -44,7 +46,7 @@ var PDFView = { window.dispatchEvent(event); }, - parseScale: function(value) { + parseScale: function(value, resetAutoSettings) { if ('custom' == value) return; @@ -55,15 +57,18 @@ var PDFView = { } var currentPage = this.pages[this.page - 1]; - var scrollbarPadding = 40; - var pageWidthScale = (window.innerWidth - scrollbarPadding) / + var pageWidthScale = (window.innerWidth - kScrollbarPadding) / currentPage.width / kCssUnits; - var pageHeightScale = (window.innerHeight - scrollbarPadding) / + var pageHeightScale = (window.innerHeight - kScrollbarPadding) / currentPage.height / kCssUnits; if ('page-width' == value) - this.setScale(pageWidthScale); - else if ('page-fit' == value) - this.setScale(Math.min(pageWidthScale, pageHeightScale)); + this.setScale(pageWidthScale, resetAutoSettings); + if ('page-height' == value) + this.setScale(pageHeightScale, resetAutoSettings); + if ('page-fit' == value) { + this.setScale( + Math.min(pageWidthScale, pageHeightScale), resetAutoSettings); + } }, zoomIn: function() { @@ -130,8 +135,8 @@ var PDFView = { this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] : (destRef + 1); if (pageNumber) { this.page = pageNumber; - // TODO scroll to specific region on the page, the precise scaling - // required. + var currentPage = this.pages[pageNumber - 1]; + currentPage.scrollIntoView(dest); } }, @@ -267,11 +272,80 @@ var PageView = function(container, content, id, width, height, link.style.width = Math.ceil(links[i].width * scale) + 'px'; link.style.height = Math.ceil(links[i].height * scale) + 'px'; link.href = links[i].url || ''; - bindLink(link, ('dest' in links[i]) ? links[i].dest : null); + if (!links[i].url) + bindLink(link, ('dest' in links[i]) ? links[i].dest : null); div.appendChild(link); } } + this.scrollIntoView = function(dest) { + var x = 0, y = 0; + var width = 0, height = 0, widthScale, heightScale; + var scale = 0; + switch (dest[1].name) { + default: + return; + case 'XYZ': + x = dest[2]; + y = dest[3]; + scale = dest[4]; + break; + case 'Fit': + case 'FitB': + scale = 'page-fit'; + break; + case 'FitH': + case 'FitBH': + y = dest[2]; + scale = 'page-width'; + break; + case 'FitV': + case 'FitBV': + x = dest[2]; + scale = 'page-height'; + break; + case 'FitR': + x = dest[2]; + y = dest[3]; + width = dest[4] - x; + height = dest[5] - y; + widthScale = (window.innerWidth - kScrollbarPadding) / + width / kCssUnits; + heightScale = (window.innerHeight - kScrollbarPadding) / + height / kCssUnits; + scale = Math.min(widthScale, heightScale); + break; + } + + var boundingRect = [ + this.content.rotatePoint(x, y), + this.content.rotatePoint(x + width, y + height) + ]; + + if (scale) + PDFView.setScale(scale, true); + + setTimeout(function() { + // letting page to re-layout before scrolling + var scale = PDFView.currentScale; + var x = Math.min(boundingRect[0].x, boundingRect[1].x); + var y = Math.min(boundingRect[0].y, boundingRect[1].y); + var width = Math.abs(boundingRect[0].x - boundingRect[1].x); + var height = Math.abs(boundingRect[0].y - boundingRect[1].y); + + // using temporary div to scroll it into view + var tempDiv = document.createElement('div'); + tempDiv.style.position = 'absolute'; + tempDiv.style.left = Math.floor(x * scale) + 'px'; + tempDiv.style.top = Math.floor(y * scale) + 'px'; + tempDiv.style.width = Math.ceil(width * scale) + 'px'; + tempDiv.style.height = Math.ceil(height * scale) + 'px'; + div.appendChild(tempDiv); + tempDiv.scrollIntoView(true); + div.removeChild(tempDiv); + }, 0); + }; + this.draw = function() { if (div.hasChildNodes()) { this.updateStats();