Skip to content

Commit 7e5a9b7

Browse files
committed
Adds support for the new mozPrintCallback api.
1 parent 164499b commit 7e5a9b7

File tree

3 files changed

+78
-16
lines changed

3 files changed

+78
-16
lines changed

web/viewer.css

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,28 +1113,26 @@ canvas {
11131113
font-size: 10px;
11141114
}
11151115

1116-
@media print {
1117-
#sidebarContainer, .toolbar, #loadingBox, #errorWrapper, .textLayer {
1118-
display: none;
1119-
}
1116+
@page {
1117+
margin: 0;
1118+
}
11201119

1121-
#mainContainer, #viewerContainer, .page, .page canvas {
1122-
position: static;
1123-
padding: 0;
1124-
margin: 0;
1125-
}
1120+
#printContainer {
1121+
display: none;
1122+
}
11261123

1127-
.page {
1128-
float: left;
1124+
@media print {
1125+
#outerContainer {
11291126
display: none;
1130-
-webkit-box-shadow: none;
1131-
-moz-box-shadow: none;
1132-
box-shadow: none;
11331127
}
1134-
1135-
.page[data-loaded] {
1128+
#printContainer {
11361129
display: block;
11371130
}
1131+
canvas {
1132+
position: relative;
1133+
top: 0;
1134+
left: 0;
1135+
}
11381136
}
11391137

11401138
@media all and (max-width: 950px) {

web/viewer.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,5 +176,6 @@
176176
</div> <!-- mainContainer -->
177177

178178
</div> <!-- outerContainer -->
179+
<div id="printContainer"></div>
179180
</body>
180181
</html>

web/viewer.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,11 @@ var PDFView = {
379379
return currentPageNumber;
380380
},
381381

382+
get supportsPrinting() {
383+
var canvas = document.createElement('canvas');
384+
return 'mozPrintCallback' in canvas;
385+
},
386+
382387
open: function pdfViewOpen(url, scale, password) {
383388
var parameters = {password: password};
384389
if (typeof url === 'string') { // URL
@@ -1041,6 +1046,22 @@ var PDFView = {
10411046
params[unescape(key)] = unescape(value);
10421047
}
10431048
return params;
1049+
},
1050+
1051+
beforePrint: function pdfViewSetupBeforePrint() {
1052+
if (!this.supportsPrinting) {
1053+
alert('Printing is not supported by this browser.');
1054+
return;
1055+
}
1056+
for (var i = 0, ii = this.pages.length; i < ii; ++i) {
1057+
this.pages[i].beforePrint();
1058+
}
1059+
},
1060+
1061+
afterPrint: function pdfViewSetupAfterPrint() {
1062+
var div = document.getElementById('printContainer');
1063+
while (div.hasChildNodes())
1064+
div.removeChild(div.lastChild);
10441065
}
10451066
};
10461067

@@ -1360,6 +1381,40 @@ var PageView = function pageView(container, pdfPage, id, scale,
13601381
div.setAttribute('data-loaded', true);
13611382
};
13621383

1384+
this.beforePrint = function pageViewBeforePrint() {
1385+
var pdfPage = this.pdfPage;
1386+
var viewport = pdfPage.getViewport(1);
1387+
1388+
var canvas = this.canvas = document.createElement('canvas');
1389+
canvas.width = viewport.width;
1390+
canvas.height = viewport.height;
1391+
canvas.style.width = viewport.width + 'pt';
1392+
canvas.style.height = viewport.height + 'pt';
1393+
1394+
var printContainer = document.getElementById('printContainer');
1395+
printContainer.appendChild(canvas);
1396+
1397+
var self = this;
1398+
canvas.mozPrintCallback = function(obj) {
1399+
var ctx = obj.context;
1400+
var renderContext = {
1401+
canvasContext: ctx,
1402+
viewport: viewport
1403+
};
1404+
1405+
pdfPage.render(renderContext).then(function() {
1406+
// Tell the printEngine that rendering this canvas/page has finished.
1407+
obj.done();
1408+
self.pdfPage.destroy();
1409+
}, function(error) {
1410+
console.error(error);
1411+
// Tell the printEngine that rendering this canvas/page has failed.
1412+
// This will make the print proces stop.
1413+
obj.abort();
1414+
});
1415+
};
1416+
};
1417+
13631418
this.updateStats = function pageViewUpdateStats() {
13641419
if (PDFJS.pdfBug && Stats.enabled) {
13651420
var stats = this.stats;
@@ -1960,3 +2015,11 @@ window.addEventListener('keydown', function keydown(evt) {
19602015
evt.preventDefault();
19612016
}
19622017
});
2018+
2019+
window.addEventListener('beforeprint', function beforePrint(evt) {
2020+
PDFView.beforePrint();
2021+
});
2022+
2023+
window.addEventListener('afterprint', function afterPrint(evt) {
2024+
PDFView.afterPrint();
2025+
});

0 commit comments

Comments
 (0)