CSS, aby ustawić rozmiar papieru A4

233

Muszę zasymulować papier A4 w Internecie i pozwolić na wydrukowanie tej strony, tak jak jest wyświetlana w przeglądarce (konkretnie Chrome). Ustawiam rozmiar elementu na 21 cm x 29,7 cm, ale kiedy wysyłam do wydruku (lub podgląd wydruku), przycina moją stronę.

Zobacz ten przykład na żywo !

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>

Myślę, że coś zapominam. Ale co by to było?

  • Chrome : strona przycinająca, podwójna strona ( to po prostu to, czego potrzebuję do działania )
  • Firefox : działa idealnie.
  • IE10 : wierzcie lub nie, jest idealny!
  • Opera : bardzo błędna w podglądzie wydruku
David Rodrigues
źródło
11
Dzięki za szablon, jest niesamowity.
vektor
1
Prawidłowa odpowiedź jest tutaj: stackoverflow.com/a/34018790/293856
unom
1
Możliwe oszustwo: stackoverflow.com/questions/3341485/…
Mark Boulder
raport o błędzie na ten temat
Eugen Konkov

Odpowiedzi:

241

Spojrzałem na to trochę więcej i wydaje się, że rzeczywistym problemem jest przypisywanie initialstrony widthdo printreguły medialnej. Wydaje się, że w Chrome width: initialna .pagewynikach elementów w skalowanie zawartości strony, jeśli wartość nie jest określona długość specyficzne dla widthna każdy z elementów nadrzędnych ( width: initialw tym przypadku postanawia width: auto... ale faktycznie każda wartość mniejsza niż rozmiar określonego zgodnie z @pageregułą powoduje ten sam problem).

Więc nie tylko treść jest teraz zbyt długa dla strony (o około 2cm), ale także dopełnienie strony będzie nieco większe niż początkowe 2cmi tak dalej (wydaje się, że renderuje zawartość width: autodo szerokości, ~196mma następnie skaluje całą zawartość do szerokości 210mm~, ale dziwnie dokładnie ten sam współczynnik skalowania jest stosowany do zawartości o dowolnej szerokości mniejszej niż 210mm).

Aby rozwiązać ten problem, możesz po prostu w printregule nośnika przypisać szerokość i wysokość papieru A4 do html, bodylub bezpośrednio do .pageiw tym przypadku uniknąć initialsłowa kluczowego.

PRÓBNY

@page {
  size: A4;
  margin: 0;
}
@media print {
  html, body {
    width: 210mm;
    height: 297mm;
  }
  /* ... the rest of the rules ... */
}

Wygląda na to, że zachowuje wszystko tak, jak jest w oryginalnym CSS i rozwiązuje problem w Chrome (testowany w różnych wersjach Chrome pod Windows, OS X i Ubuntu).

Martin Turjak
źródło
Jak doszedłeś do 256mm(a tym samym 237mmostatecznie) .subpageelementu?
caw
@MarcoW. Wierzę, że OP 256mmjest lekko zaokrąglona w dół papieru A4 wysokości bez wyściółki Strona: 297mm - 2*20mm... może 257mmbyłoby nieco bardziej oczywiste ;-) A w moim poprzednim przykładzie 237mmstanowiły ~2cm„zbyt długo” treści ... ale tylko powierzchownie rozwiązane problem. Zobacz moją zaktualizowaną odpowiedź powyżej, aby znaleźć rzeczywiste rozwiązanie.
Martin Turjak
10
Cześć @MartinTurjak, poprawiłem twoje skrzypce do wersji z listem amerykańskim, na wypadek, gdyby ktoś był zainteresowany. jsfiddle.net/2wk6Q/2957 Pozdrawiam!
Ben
Mam 4 pola do wydrukowania strony, jak podzielić równy rozmiar wszystkich pól .. jaki jest rozmiar strony wydruku w pxl
Vikram
2
@Brad: nie działało dla mnie. Nadal tworzy pustą stronę między każdą stroną.
Sebastian Farham,
37

CSS

body {
  background: rgb(204,204,204); 
}
page[size="A4"] {
  background: white;
  width: 21cm;
  height: 29.7cm;
  display: block;
  margin: 0 auto;
  margin-bottom: 0.5cm;
  box-shadow: 0 0 0.5cm rgba(0,0,0,0.5);
}
@media print {
  body, page[size="A4"] {
    margin: 0;
    box-shadow: 0;
  }
}

HTML

<page size="A4"></page>
<page size="A4"></page>
<page size="A4"></page>

PRÓBNY

MaxEcho
źródło
2
uwaga dodatkowa: <page>nie jest prawidłową niestandardową nazwą elementu HTML
Martin Schneider
2
Wydaje się działać. Ale box-shadow: 0;nie działa (przynajmniej w Chrome), powinno być box-shadow: none;. Dwie deklaracje marginesów można również połączyć w margin: 0 auto 0.5cm;.
mts knn
28

https://github.com/cognitom/paper-css wydaje się spełniać wszystkie moje potrzeby.

Papier CSS dla szczęśliwego drukowania

Front-end rozwiązanie drukowania - podgląd i do ponownego załadowania na żywo!

Mark Boulder
źródło