diff --git a/multi_page_viewer.js b/multi_page_viewer.js
index f262734d3..f46038c9c 100644
--- a/multi_page_viewer.js
+++ b/multi_page_viewer.js
@@ -26,41 +26,53 @@ var PDFViewer = {
   
   scale: 1.0,
   
-  pageWidth: function() {
-    return 816 * PDFViewer.scale;
+  pageWidth: function(page) {
+    return page.mediaBox[2] * PDFViewer.scale;
   },
   
-  pageHeight: function() {
-    return 1056 * PDFViewer.scale;
+  pageHeight: function(page) {
+    return page.mediaBox[3] * PDFViewer.scale;
   },
   
   lastPagesDrawn: [],
   
-  visiblePages: function() {  
-    var pageHeight = PDFViewer.pageHeight() + 20; // Add 20 for the margins.      
+  visiblePages: function() {
+    const pageBottomMargin = 20;
     var windowTop = window.pageYOffset;
     var windowBottom = window.pageYOffset + window.innerHeight;
-    var pageStartIndex = Math.floor(windowTop / pageHeight);
-    var pageStopIndex = Math.ceil(windowBottom / pageHeight);
+
+    var pageHeight, page;
+    var i, n = PDFViewer.numberOfPages, currentHeight = 0;
+    for (i = 1; i <= n; i++) {
+      var page = PDFViewer.pdf.getPage(i);
+      pageHeight = PDFViewer.pageHeight(page) + pageBottomMargin;
+      if (currentHeight + pageHeight > windowTop)
+        break;
+      currentHeight += pageHeight;
+    }
     
     var pages = [];  
-    
-    for (var i = pageStartIndex; i <= pageStopIndex; i++) {
-      pages.push(i + 1);
+    for (; i <= n && currentHeight < windowBottom; i++) {
+      var page = PDFViewer.pdf.getPage(i);
+      pageHeight = PDFViewer.pageHeight(page) + pageBottomMargin;
+      currentHeight += pageHeight;
+      pages.push(i);
     }
     
     return pages;
   },
   
   createPage: function(num) {
+    var page = PDFViewer.pdf.getPage(num);
+
     var anchor = document.createElement('a');
     anchor.name = '' + num;
     
     var div = document.createElement('div');
     div.id = 'pageContainer' + num;
     div.className = 'page';
-    div.style.width = PDFViewer.pageWidth() + 'px';
-    div.style.height = PDFViewer.pageHeight() + 'px';
+    div.style.width = PDFViewer.pageWidth(page) + 'px';
+    div.style.height = PDFViewer.pageHeight(page) + 'px';
     
     PDFViewer.element.appendChild(anchor);
     PDFViewer.element.appendChild(div);
@@ -91,8 +103,8 @@ var PDFViewer = {
 
       // Canvas dimensions must be specified in CSS pixels. CSS pixels
       // are always 96 dpi. These dimensions are 8.5in x 11in at 96dpi.
-      canvas.width = PDFViewer.pageWidth();
-      canvas.height = PDFViewer.pageHeight();
+      canvas.width = PDFViewer.pageWidth(page);
+      canvas.height = PDFViewer.pageHeight(page);
       div.appendChild(canvas);
 
       var ctx = canvas.getContext('2d');
diff --git a/test/pdfs/sizes.pdf b/test/pdfs/sizes.pdf
new file mode 100644
index 000000000..f621f821e
Binary files /dev/null and b/test/pdfs/sizes.pdf differ
diff --git a/test/test_manifest.json b/test/test_manifest.json
index 9b9d5e333..4c5e912f6 100644
--- a/test/test_manifest.json
+++ b/test/test_manifest.json
@@ -25,5 +25,10 @@
        "link": true,
        "rounds": 1,
        "type": "load"
+    },
+    {  "id": "sizes",
+       "file": "pdfs/sizes.pdf",
+       "rounds": 1,
+       "type": "eq"
     }
 ]
diff --git a/test/test_slave.html b/test/test_slave.html
index 32076d075..7dfbfeb87 100644
--- a/test/test_slave.html
+++ b/test/test_slave.html
@@ -25,9 +25,6 @@ function load() {
   manifestFile = params.manifestFile;
 
   canvas = document.createElement("canvas");
-  // 8.5x11in @ 100% ... XXX need something better here
-  canvas.width = 816;
-  canvas.height = 1056;
   canvas.mozOpaque = true;
   stdout = document.getElementById("stdout");
 
@@ -93,7 +90,6 @@ function nextPage() {
   log("    loading page "+ currentTask.pageNum +"... ");
 
   var ctx = canvas.getContext("2d");
-  clear(ctx);
 
   var fonts = [];
   var gfx = null;
@@ -105,6 +101,15 @@ function nextPage() {
     failure = 'compile: '+ e.toString();
   }
 
+  try {
+    // using mediaBox for the canvas size
+    canvas.width = currentPage.mediaBox[2];
+    canvas.height = currentPage.mediaBox[3];
+    clear(ctx);
+  } catch(e) {
+    failure = 'page setup: '+ e.toString();
+  }
+
   var fontLoaderTimer = null;
   function checkFontsLoaded() {
     try {
@@ -193,7 +198,6 @@ function sendTaskResult(snapshot) {
 }
 
 function clear(ctx) {
-  var ctx = canvas.getContext("2d");
   ctx.save();
   ctx.fillStyle = "rgb(255, 255, 255)";
   ctx.fillRect(0, 0, canvas.width, canvas.height);
diff --git a/viewer.js b/viewer.js
index c7be739bc..3dffa8144 100644
--- a/viewer.js
+++ b/viewer.js
@@ -60,6 +60,10 @@ function displayPage(num) {
 
     var page = pdfDocument.getPage(pageNum = num);
 
+    // scale canvas by 2
+    canvas.width = 2 * page.mediaBox[2];
+    canvas.hieght = 2 * page.mediaBox[3];
+
     var t1 = Date.now();
     var ctx = canvas.getContext("2d");
     ctx.save();