I need simulate an A4 paper in web and allow to print this page as it is show on browser (Chrome, specifically). I set the element size to 21cm x 29.7cm, but when I send to print (or print preview) it clip my page.
See this Live example!
body {
margin: 0;
padding: 0;
background-color: #FAFAFA;
font: 12pt "Tahoma";
}
* {
box-sizing: border-box;
-moz-box-sizing: border-box;
}
.page {
width: 21cm;
min-height: 29.7cm;
padding: 2cm;
margin: 1cm auto;
border: 1px #D3D3D3 solid;
border-radius: 5px;
background: white;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}
.subpage {
padding: 1cm;
border: 5px red solid;
height: 256mm;
outline: 2cm #FFEAEA solid;
}
@page {
size: A4;
margin: 0;
}
@media print {
.page {
margin: 0;
border: initial;
border-radius: initial;
width: initial;
min-height: initial;
box-shadow: initial;
background: initial;
page-break-after: always;
}
}
<div class="book">
<div class="page">
<div class="subpage">Page 1/2</div>
</div>
<div class="page">
<div class="subpage">Page 2/2</div>
</div>
</div>
I think I'm forgetting something. But what would it be?
- Chrome: clipping page, double page (it's just what I need it to work)
- Firefox: it works perfectly.
- IE10: believe it or not, it's perfect!
- Opera: very buggy on print preview
I looked into this a bit more and the actual problem seems to be with assigning
initial
to pagewidth
under theprint
media rule. It seems like in Chromewidth: initial
on the.page
element results in scaling of the page content if no specific length value is defined forwidth
on any of the parent elements (width: initial
in this case resolves towidth: auto
... but actually any value smaller than the size defined under the@page
rule causes the same issue).So not only the content is now too long for the page (by about
2cm
), but also the page padding will be slightly more than the initial2cm
and so on (it seems to render the contents underwidth: auto
to the width of~196mm
and then scale the whole content up to the width of210mm
~ but strangely exactly the same scaling factor is applied to contents with any width smaller than210mm
).To fix this problem you can simply in the
print
media rule assign the A4 paper width and hight tohtml, body
or directly to.page
and in this case avoid theinitial
keyword.DEMO
This seems to keep everything else the way it is in your original CSS and fix the problem in Chrome (tested in different versions of Chrome under Windows, OS X and Ubuntu).
https://github.com/cognitom/paper-css seems to solve all my needs.
Paper CSS for happy printing
CSS
HTML
DEMO