Adds support for the new mozPrintCallback api.

This commit is contained in:
Brendan Dahl 2012-06-28 09:50:25 -07:00
parent 164499b9ed
commit 7e5a9b7a39
3 changed files with 79 additions and 17 deletions

View File

@ -1113,28 +1113,26 @@ canvas {
font-size: 10px; font-size: 10px;
} }
@page {
margin: 0;
}
#printContainer {
display: none;
}
@media print { @media print {
#sidebarContainer, .toolbar, #loadingBox, #errorWrapper, .textLayer { #outerContainer {
display: none; display: none;
} }
#printContainer {
#mainContainer, #viewerContainer, .page, .page canvas {
position: static;
padding: 0;
margin: 0;
}
.page {
float: left;
display: none;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}
.page[data-loaded] {
display: block; display: block;
} }
canvas {
position: relative;
top: 0;
left: 0;
}
} }
@media all and (max-width: 950px) { @media all and (max-width: 950px) {

View File

@ -176,5 +176,6 @@
</div> <!-- mainContainer --> </div> <!-- mainContainer -->
</div> <!-- outerContainer --> </div> <!-- outerContainer -->
<div id="printContainer"></div>
</body> </body>
</html> </html>

View File

@ -379,6 +379,11 @@ var PDFView = {
return currentPageNumber; return currentPageNumber;
}, },
get supportsPrinting() {
var canvas = document.createElement('canvas');
return 'mozPrintCallback' in canvas;
},
open: function pdfViewOpen(url, scale, password) { open: function pdfViewOpen(url, scale, password) {
var parameters = {password: password}; var parameters = {password: password};
if (typeof url === 'string') { // URL if (typeof url === 'string') { // URL
@ -1041,6 +1046,22 @@ var PDFView = {
params[unescape(key)] = unescape(value); params[unescape(key)] = unescape(value);
} }
return params; 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); 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() { this.updateStats = function pageViewUpdateStats() {
if (PDFJS.pdfBug && Stats.enabled) { if (PDFJS.pdfBug && Stats.enabled) {
var stats = this.stats; var stats = this.stats;
@ -1960,3 +2015,11 @@ window.addEventListener('keydown', function keydown(evt) {
evt.preventDefault(); evt.preventDefault();
} }
}); });
window.addEventListener('beforeprint', function beforePrint(evt) {
PDFView.beforePrint();
});
window.addEventListener('afterprint', function afterPrint(evt) {
PDFView.afterPrint();
});