]> git.parisson.com Git - pdf.js.git/commitdiff
Adds support for the new mozPrintCallback api.
authorBrendan Dahl <brendan.dahl@gmail.com>
Thu, 28 Jun 2012 16:50:25 +0000 (09:50 -0700)
committerBrendan Dahl <brendan.dahl@gmail.com>
Mon, 9 Jul 2012 17:41:52 +0000 (10:41 -0700)
web/viewer.css
web/viewer.html
web/viewer.js

index b8e86f2c83105070fdebdb84eb45f08e50e93032..b57af059110e0e5aa52d313e78ced526ebb7ecac 100644 (file)
@@ -1113,28 +1113,26 @@ canvas {
   font-size: 10px;
 }
 
-@media print {
-  #sidebarContainer, .toolbar, #loadingBox, #errorWrapper, .textLayer {
-    display: none;
-  }
+@page {
+  margin: 0;
+} 
 
-  #mainContainer, #viewerContainer, .page, .page canvas {
-    position: static;
-    padding: 0;
-    margin: 0;
-  }
+#printContainer {
+  display: none;
+}
 
-  .page {
-    float: left;
+@media print {
+  #outerContainer {
     display: none;
-    -webkit-box-shadow: none;
-    -moz-box-shadow: none;
-    box-shadow: none;
   }
-
-  .page[data-loaded] {
+  #printContainer {
     display: block;
   }
+  canvas {
+    position: relative;
+    top: 0;
+    left: 0;
+  }
 }
 
 @media all and (max-width: 950px) {
index c59d9fcf385005683b632571be8e3faf9e0aea0e..5d66e8b335672ad4bc1c3e4e39e1a7982cb79b43 100644 (file)
       </div> <!-- mainContainer -->
 
     </div> <!-- outerContainer -->
+    <div id="printContainer"></div>
   </body>
 </html>
index 516081f6ff857577ba4d558ea475581b64a1b554..1a7732e4e790d0c20fcdbed97de4d1f449b651a0 100644 (file)
@@ -379,6 +379,11 @@ var PDFView = {
     return currentPageNumber;
   },
 
+  get supportsPrinting() {
+    var canvas = document.createElement('canvas');
+    return 'mozPrintCallback' in canvas;
+  },
+
   open: function pdfViewOpen(url, scale, password) {
     var parameters = {password: password};
     if (typeof url === 'string') { // URL
@@ -1041,6 +1046,22 @@ var PDFView = {
       params[unescape(key)] = unescape(value);
     }
     return params;
+  },
+
+  beforePrint: function pdfViewSetupBeforePrint() {
+    if (!this.supportsPrinting) {
+      alert('Printing is not supported by this browser.');
+      return;
+    }
+    for (var i = 0, ii = this.pages.length; i < ii; ++i) {
+      this.pages[i].beforePrint();
+    }
+  },
+
+  afterPrint: function pdfViewSetupAfterPrint() {
+    var div = document.getElementById('printContainer');
+    while (div.hasChildNodes())
+      div.removeChild(div.lastChild);
   }
 };
 
@@ -1360,6 +1381,40 @@ var PageView = function pageView(container, pdfPage, id, scale,
     div.setAttribute('data-loaded', true);
   };
 
+  this.beforePrint = function pageViewBeforePrint() {
+    var pdfPage = this.pdfPage;
+    var viewport = pdfPage.getViewport(1);
+
+    var canvas = this.canvas = document.createElement('canvas');
+    canvas.width = viewport.width;
+    canvas.height = viewport.height;
+    canvas.style.width = viewport.width + 'pt';
+    canvas.style.height = viewport.height + 'pt';
+
+    var printContainer = document.getElementById('printContainer');
+    printContainer.appendChild(canvas);
+
+    var self = this;
+    canvas.mozPrintCallback = function(obj) {
+      var ctx = obj.context;
+      var renderContext = {
+        canvasContext: ctx,
+        viewport: viewport
+      };
+
+      pdfPage.render(renderContext).then(function() {
+        // Tell the printEngine that rendering this canvas/page has finished.
+        obj.done();
+        self.pdfPage.destroy();
+      }, function(error) {
+        console.error(error);
+        // Tell the printEngine that rendering this canvas/page has failed.
+        // This will make the print proces stop.
+        obj.abort();
+      });
+    };
+  };
+
   this.updateStats = function pageViewUpdateStats() {
     if (PDFJS.pdfBug && Stats.enabled) {
       var stats = this.stats;
@@ -1960,3 +2015,11 @@ window.addEventListener('keydown', function keydown(evt) {
     evt.preventDefault();
   }
 });
+
+window.addEventListener('beforeprint', function beforePrint(evt) {
+  PDFView.beforePrint();
+});
+
+window.addEventListener('afterprint', function afterPrint(evt) {
+  PDFView.afterPrint();
+});