Unfortunately, this is currently difficult due to some assumptions that MobileReaderControl makes.
We are working on updating the mobile viewer as a whole to make the behaviour more consistent.
For now, we came up with a solution that isn't ideal, but is consistent in our testing.
Upon switching pages, it will first show up as "fit page" but right after it will zoom in to the desired zoom level.
In your code, you want to call setPagePreserveZoom with the page number you want to switch to.
var isRendering = false;
var waitingZoomLevel = null;
function setPagePreserveZoom(pageNumber) {
var zoomLevel = readerControl.getZoomLevel();
var newPageWrapper = readerControl.pageToWrapper(pageNumber - 1);
readerControl.setCurrentPageNumber(pageNumber);
readerControl.docViewer.on('pageComplete.zoom', function(e, pageIndex) {
var pageWrapper = readerControl.pageToWrapper(pageIndex);
if (pageWrapper === newPageWrapper && readerControl.pagesRendering.length === 0) {
waitingZoomLevel = zoomLevel;
if (!isRendering) {
zoomPage();
}
}
});
}
function zoomPage() {
readerControl.docViewer.off('pageComplete.zoom');
zoomToPoint(waitingZoomLevel, {x: 0, y: 0});
waitingZoomLevel = null;
}
$(document).on('viewerLoaded', function() {
readerControl.docViewer.on('beginRendering', function() {
isRendering = true;
});
readerControl.docViewer.on('finishedRendering', function() {
isRendering = false;
if (waitingZoomLevel) {
zoomPage();
}
});
});
function zoomToPoint(zoomLevel, touchLocation) {
readerControl.newScale = 1;
readerControl.oldScale = 1;
var originalPageZoom = readerControl.docViewer.getPageZoom(readerControl.currentPageIndex);
var newPageZoom = zoomLevel;
var offset = readerControl.c.$e.offset();
var width = readerControl.c.$e.width();
var height = readerControl.c.$e.height();
// calculate the location of the touch event on the page where (0,0) is at the center of the page
var touchLocX = (touchLocation.x - offset.left) - width / 2;
var touchLocY = (touchLocation.y - offset.top) - height / 2;
// get the coordinates of the event for the new scaled page
var scaledLocX = touchLocX * (newPageZoom / originalPageZoom);
var scaledLocY = touchLocY * (newPageZoom / originalPageZoom);
// calculate the amount that the zoomed page needs to be shifted so that the same part of the page is
// under the touch location after it has been zoomed
var offsetX = touchLocX - scaledLocX;
var offsetY = touchLocY - scaledLocY;
readerControl.c.tX += offsetX;
readerControl.c.tY += offsetY;
var animate = true;
readerControl.setZoomLevel(newPageZoom, animate);
}
PDFTron Systems Inc.