Preciso simular um papel A4 na Web e permitir a impressão desta página, como é exibida no navegador (Chrome, especificamente). Defino o tamanho do elemento como 21cm x 29,7cm, mas quando envio para imprimir (ou visualizar impressão) ele recorta minha página.
Veja este exemplo ao vivo !
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>
Eu acho que estou esquecendo alguma coisa. Mas o que seria isso?
- Chrome : página de recorte, página dupla ( é exatamente o que eu preciso para funcionar )
- Firefox : funciona perfeitamente.
- IE10 : acredite ou não, é perfeito!
- Opera : muito buggy na pré-visualização
css
printing
print-preview
David Rodrigues
fonte
fonte
Respostas:
Analisei isso um pouco mais e o problema real parece estar em atribuir
initial
à páginawidth
sob aprint
regra da mídia. Parece que no Chromewidth: initial
o.page
elemento resulta na escala do conteúdo da página se nenhum valor específico de comprimento estiver definido parawidth
nenhum dos elementos pai (width: initial
neste caso, resolve parawidth: auto
... mas, na verdade, qualquer valor menor que o tamanho definido na@page
regra causa o mesmo problema).Portanto, não apenas o conteúdo agora é muito longo para a página (aproximadamente
2cm
), mas também o preenchimento da página será um pouco mais do que o inicial2cm
e assim por diante (parece renderizar o conteúdo de acordowidth: auto
com a largura~196mm
e depois dimensionar todo o conteúdo até a largura de210mm
~, mas estranhamente exatamente o mesmo fator de escala é aplicado ao conteúdo com largura menor que210mm
).Para corrigir esse problema, você pode simplesmente, na
print
regra da mídia, atribuir a largura do papel A4 e a alturahtml, body
ou diretamente a.page
ou, neste caso, evitar ainitial
palavra - chave.DEMO
Isso parece manter todo o resto do seu CSS original e corrigir o problema no Chrome (testado em diferentes versões do Chrome no Windows, OS X e Ubuntu).
fonte
256mm
(e237mm
, portanto , eventualmente) para o.subpage
elemento?256mm
estejam ligeiramente arredondados para a altura do papel A4 sem o preenchimento da página:297mm - 2*20mm
... talvez257mm
fosse um pouco mais óbvio ;-) E no meu exemplo anterior, o conteúdo "muito longo" foi237mm
explicado~2cm
... mas apenas superficialmente resolvido o problema. Veja minha resposta atualizada acima para a solução real.CSS
HTML
DEMO
fonte
<page>
não é um nome do elemento HTML personalizado válidobox-shadow: 0;
não funciona (pelo menos no Chrome), deveriabox-shadow: none;
. As duas declarações de margem também podem ser combinadasmargin: 0 auto 0.5cm;
.https://github.com/cognitom/paper-css parece resolver todas as minhas necessidades.
CSS de papel para impressão feliz
fonte