Merge pull request #5857 from Rob--W/print-page-size
Set page size via @page + size
This commit is contained in:
commit
d7aa95d6b1
@ -495,10 +495,15 @@ var PDFPageView = (function PDFPageViewClosure() {
|
||||
// better output until bug 811002 is fixed in FF.
|
||||
var PRINT_OUTPUT_SCALE = 2;
|
||||
var canvas = document.createElement('canvas');
|
||||
|
||||
// The logical size of the canvas.
|
||||
canvas.width = Math.floor(viewport.width) * PRINT_OUTPUT_SCALE;
|
||||
canvas.height = Math.floor(viewport.height) * PRINT_OUTPUT_SCALE;
|
||||
canvas.style.width = (PRINT_OUTPUT_SCALE * viewport.width) + 'pt';
|
||||
canvas.style.height = (PRINT_OUTPUT_SCALE * viewport.height) + 'pt';
|
||||
|
||||
// The rendered size of the canvas, relative to the size of canvasWrapper.
|
||||
canvas.style.width = (PRINT_OUTPUT_SCALE * 100) + '%';
|
||||
canvas.style.height = (PRINT_OUTPUT_SCALE * 100) + '%';
|
||||
|
||||
var cssScale = 'scale(' + (1 / PRINT_OUTPUT_SCALE) + ', ' +
|
||||
(1 / PRINT_OUTPUT_SCALE) + ')';
|
||||
CustomStyle.setProp('transform' , canvas, cssScale);
|
||||
|
@ -1715,10 +1715,14 @@ html[dir='rtl'] #documentPropertiesOverlay .row > * {
|
||||
body[data-mozPrintCallback] #printContainer {
|
||||
display: block;
|
||||
}
|
||||
#printContainer canvas {
|
||||
/* wrapper around (scaled) print canvas elements */
|
||||
#printContainer > div {
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
#printContainer canvas {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
@ -1314,6 +1314,35 @@ var PDFViewerApplication = {
|
||||
|
||||
var body = document.querySelector('body');
|
||||
body.setAttribute('data-mozPrintCallback', true);
|
||||
|
||||
if (!this.hasEqualPageSizes) {
|
||||
console.warn('Not all pages have the same size. The printed result ' +
|
||||
'may be incorrect!');
|
||||
}
|
||||
|
||||
// Insert a @page + size rule to make sure that the page size is correctly
|
||||
// set. Note that we assume that all pages have the same size, because
|
||||
// variable-size pages are not supported yet (at least in Chrome & Firefox).
|
||||
// TODO(robwu): Use named pages when size calculation bugs get resolved
|
||||
// (e.g. https://crbug.com/355116) AND when support for named pages is
|
||||
// added (http://www.w3.org/TR/css3-page/#using-named-pages).
|
||||
// In browsers where @page + size is not supported (such as Firefox,
|
||||
// https://bugzil.la/851441), the next stylesheet will be ignored and the
|
||||
// user has to select the correct paper size in the UI if wanted.
|
||||
this.pageStyleSheet = document.createElement('style');
|
||||
var pageSize = this.pdfViewer.getPageView(0).pdfPage.getViewport(1);
|
||||
this.pageStyleSheet.textContent =
|
||||
// "size:<width> <height>" is what we need. But also add "A4" because
|
||||
// Firefox incorrectly reports support for the other value.
|
||||
'@supports ((size:A4) and (size:1pt 1pt)) {' +
|
||||
'@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' +
|
||||
// The canvas and each ancestor node must have a height of 100% to make
|
||||
// sure that each canvas is printed on exactly one page.
|
||||
'#printContainer {height:100%}' +
|
||||
'#printContainer > div {width:100% !important;height:100% !important;}' +
|
||||
'}';
|
||||
body.appendChild(this.pageStyleSheet);
|
||||
|
||||
for (i = 0, ii = this.pagesCount; i < ii; ++i) {
|
||||
this.pdfViewer.getPageView(i).beforePrint();
|
||||
}
|
||||
@ -1330,12 +1359,30 @@ var PDFViewerApplication = {
|
||||
//#endif
|
||||
},
|
||||
|
||||
// Whether all pages of the PDF have the same width and height.
|
||||
get hasEqualPageSizes() {
|
||||
var firstPage = this.pdfViewer.getPageView(0);
|
||||
for (var i = 1, ii = this.pagesCount; i < ii; ++i) {
|
||||
var pageView = this.pdfViewer.getPageView(i);
|
||||
if (pageView.width !== firstPage.width ||
|
||||
pageView.height !== firstPage.height) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
afterPrint: function pdfViewSetupAfterPrint() {
|
||||
var div = document.getElementById('printContainer');
|
||||
while (div.hasChildNodes()) {
|
||||
div.removeChild(div.lastChild);
|
||||
}
|
||||
|
||||
if (this.pageStyleSheet && this.pageStyleSheet.parentNode) {
|
||||
this.pageStyleSheet.parentNode.removeChild(this.pageStyleSheet);
|
||||
this.pageStyleSheet = null;
|
||||
}
|
||||
|
||||
this.printing = false;
|
||||
this.forceRendering();
|
||||
},
|
||||
|
Loading…
x
Reference in New Issue
Block a user