diff --git a/share/pdf2htmlEX.js.in b/share/pdf2htmlEX.js.in index a1a5aa1..c0d8932 100644 --- a/share/pdf2htmlEX.js.in +++ b/share/pdf2htmlEX.js.in @@ -244,6 +244,7 @@ function Viewer(config) { Viewer.prototype = { scale : 1, + // index of the active page (most visible one) cur_page_idx : 0, init_before_loading_content : function() { @@ -656,13 +657,13 @@ Viewer.prototype = { fit_width : function () { var page_idx = this.cur_page_idx; this.rescale(this.container.clientWidth / this.pages[page_idx].width(), false); - this.scroll_to(page_idx, [0,0]); + this.scroll_to(page_idx); }, fit_height : function () { var page_idx = this.cur_page_idx; this.rescale(this.container.clientHeight / this.pages[page_idx].height(), false); - this.scroll_to(page_idx, [0,0]); + this.scroll_to(page_idx); }, /** * @param{Node} ele @@ -727,21 +728,23 @@ Viewer.prototype = { // cur_page might be undefined, e.g. from Outline var cur_page = src_page || this.pages[this.cur_page_idx]; - // TODO: view_position is now in scaled coordination system, but we need in unscaled system + var cur_pos = cur_page.view_position(); - //get the coordinates in default user system cur_pos = transform(cur_page.ictm, [cur_pos[0], cur_page.height()-cur_pos[1]]); - var pos = [0,0]; var zoom = this.scale; + var pos = [0,0]; var upside_down = true; var ok = false; + + // position specified in `detail` are in the raw coordinate system of the page (unscaled) + var scale = this.scale; // TODO: fitb* // TODO: BBox switch(detail[1]) { case 'XYZ': - pos = [(detail[2] === null) ? cur_pos[0] : detail[2] - ,(detail[3] === null) ? cur_pos[1] : detail[3]]; + pos = [ (detail[2] === null) ? cur_pos[0] : detail[2] * scale + , (detail[3] === null) ? cur_pos[1] : detail[3] * scale ]; zoom = detail[4]; if ((zoom === null) || (zoom === 0)) zoom = this.scale; @@ -754,18 +757,18 @@ Viewer.prototype = { break; case 'FitH': case 'FitBH': - pos = [0, (detail[2] === null) ? cur_pos[1] : detail[2]]; + pos = [0, (detail[2] === null) ? cur_pos[1] : detail[2] * scale]; ok = true; break; case 'FitV': case 'FitBV': - pos = [(detail[2] === null) ? cur_pos[0] : detail[2], 0]; + pos = [(detail[2] === null) ? cur_pos[0] : detail[2] * scale, 0]; ok = true; break; case 'FitR': /* locate the top-left corner of the rectangle */ // TODO - pos = [detail[2], detail[5]]; + pos = [detail[2] * scale, detail[5] * scale]; upside_down = false; ok = true; break; @@ -777,6 +780,7 @@ Viewer.prototype = { this.rescale(zoom, false); + var self = this; /** * page should of type Page @@ -785,7 +789,7 @@ Viewer.prototype = { var transform_and_scroll = function(page) { pos = transform(page.ctm, pos); if (upside_down) { - pos[1] = page.original_height - pos[1]; + pos[1] = page.height() - pos[1]; } self.scroll_to(target_page_idx, pos); }; @@ -799,13 +803,13 @@ Viewer.prototype = { this.load_page(target_page_idx, undefined, transform_and_scroll); // In the meantime page gets loaded, scroll approximately position for maximum responsiveness. - this.scroll_to(target_page_idx, [0,0]); + this.scroll_to(target_page_idx); } }, /** * @param{number} page_idx - * @param{Array.=} pos [x,y] in UNSCALED COORDINATION, where (0,0) is the top-left corner + * @param{Array.=} pos [x,y] where (0,0) is the top-left corner */ scroll_to : function(page_idx, pos) { var pl = this.pages; @@ -817,9 +821,8 @@ Viewer.prototype = { pos = [0,0]; var container = this.container; - var scale = this.scale; - container.scrollLeft += pos[0] * scale - cur_target_pos[0]; - container.scrollTop += pos[1] * scale - cur_target_pos[1]; + container.scrollLeft += pos[0] - cur_target_pos[0]; + container.scrollTop += pos[1] - cur_target_pos[1]; } };