Jak zrobić stronę HTML na stronach formatu A4?


388

Czy możliwe jest, aby strona HTML zachowywała się na przykład jak strona formatu A4 w MS Word?

Zasadniczo chcę mieć możliwość wyświetlenia strony HTML w przeglądarce i zarysowania zawartości w wymiarach strony formatu A4.

Dla uproszczenia zakładam, że strona HTML będzie zawierać tylko tekst (bez obrazów itp.) I <br>na przykład nie będzie żadnych tagów.

Ponadto, gdy strona HTML zostanie wydrukowana, będzie wyglądać jak papierowe strony formatu A4.




1
Prawdziwy „HTML do druku” jest comig! Zobacz całą historię na stackoverflow.com/q/10641667/287948 i nadchodzi moduł fragmentacji CSS poziomu 3 W3C !
Peter Krauss,

Jaki był tego zamiar? Czy odchodzisz z MS Office po technologie sieciowe? Przynajmniej tego, co próbuję, ale wciąż potrzebuję trochę informacji jak . Odpowiedź, która zakończy historię, zaczęła się od tego pytania.
Stefan

Odpowiedzi:


318

Wiele lat temu, w listopadzie 2005 r., AlistApart.com opublikował artykuł o tym, jak opublikowali książkę, używając wyłącznie HTML i CSS. Zobacz: http://alistapart.com/article/boom

Oto fragment tego artykułu:

CSS2 ma pojęcie mediów stronicowanych (myśl arkusze papieru), a nie mediów ciągłych (paski przewijania). Arkusze stylów mogą określać rozmiar stron i ich marginesy. Szablony stron mogą mieć nazwy, a elementy mogą określać, na której stronie nazwane mają być wydrukowane. Ponadto elementy w dokumencie źródłowym mogą wymuszać podziały stron. Oto fragment kodu, którego użyliśmy:

@page {
   size: 7in 9.25in;
   margin: 27mm 16mm 27mm 16mm;
}

Mając wydawcę z siedzibą w USA, rozmiar strony podano w calach. Jako Europejczycy kontynuowaliśmy pomiary metryczne. CSS akceptuje oba.

Po ustawieniu rozmiaru strony i marginesu musieliśmy się upewnić, że w odpowiednich miejscach są podziały stron. Poniższy fragment pokazuje, jak generowane są podziały stron po rozdziałach i dodatkach:

div.chapter, div.appendix {
    page-break-after: always;
}

Ponadto używaliśmy CSS2 do deklarowania nazwanych stron:

div.titlepage {
  page: blank;
}

Oznacza to, że strona tytułowa ma być drukowana na stronach o nazwie „pusta”. CSS2 opisał pojęcie nazwanych stron, ale ich wartość staje się widoczna dopiero wtedy, gdy dostępne są nagłówki i stopki.

Tak czy siak…

Ponieważ chcesz wydrukować A4, oczywiście potrzebujesz różnych wymiarów:

@page {
    size: 21cm 29.7cm;
    margin: 30mm 45mm 30mm 45mm;
     /* change the margins as you want them to be. */
}

Artykuł omawia takie elementy, jak ustawianie podziałów stron itp., Więc możesz chcieć przeczytać to w całości.

W twoim przypadku sztuczka polega na tym, aby najpierw utworzyć drukowany CSS. Większość współczesnych przeglądarek (> 2005) obsługuje powiększanie i będzie już mogła wyświetlać stronę internetową na podstawie wydruku CSS.

Teraz chcesz sprawić, by wygląd strony internetowej wyglądał nieco inaczej i dostosuj cały projekt do większości przeglądarek (w tym starych, sprzed 2005 r.). W tym celu musisz utworzyć internetowy plik CSS lub zastąpić niektóre części drukowanego CSS. Tworząc CSS do wyświetlania w Internecie, pamiętaj, że przeglądarka może mieć DOWOLNY rozmiar (pomyśl: „mobilne” aż do „dużych telewizorów”). Znaczenie: w przypadku internetowego CSS szerokość strony i szerokość obrazu najlepiej ustawić za pomocą zmiennej szerokości (%) w celu obsługi jak największej liczby urządzeń wyświetlających i klientów przeglądających strony internetowe.

EDYCJA (26-02-2015)

Dzisiaj natknąłem się na inny, nowszy artykuł w SmashingMagazine, który również zajmuje się projektowaniem do druku w HTML i CSS… na wypadek, gdybyś mógł skorzystać z jeszcze jednego samouczka.

EDYCJA (30-10-2018)

Zwrócono mi uwagę na sizeto, że nie jest poprawny CSS3, co jest rzeczywiście poprawne - po prostu powtórzyłem kod cytowany w artykule, który (jak wspomniano) był starym dobrym CSS2 (co ma sens, gdy spojrzysz na rok i artykuł ta odpowiedź została opublikowana po raz pierwszy). Tak czy inaczej, oto poprawny kod CSS3 dla wygody kopiowania i wklejania:

@media print {
    body{
        width: 21cm;
        height: 29.7cm;
        margin: 30mm 45mm 30mm 45mm; 
        /* change the margins as you want them to be. */
   } 
}

Jeśli uważasz, że naprawdę potrzebujesz pikseli ( powinieneś unikać używania pikseli ), musisz zadbać o wybór prawidłowego DPI do drukowania:

  • 72 dpi (sieć) = 595 x 842 pikseli
  • 300 dpi (wydruk) = 2480 x 3508 pikseli
  • 600 dpi (wydruk wysokiej jakości) = 4960 x 7016 pikseli

Jednak unikałbym kłopotów i po prostu używam cm(centymetrów) lub mm(milimetrów) do zmiany rozmiaru, ponieważ pozwala to na uniknięcie renderowania błędów, które mogą powstać w zależności od używanego klienta.


1
Dziękujemy za aktualizację tej odpowiedzi, aby pasowała do aktualnych standardów!
jumps4fun,

dobrze, ale ile px
A.com

@ A.com Nie ma px, ponieważ zależałoby to od DPI ... dlatego CSS obsługuje te oczywiste jednostki miary zwane cmi in. Radzę przeczytać powiązane artykuły i / lub przynajmniej moją odpowiedź. W ten sposób szybko zauważysz, że twoje pytanie naprawdę nie ma sensu. Możesz również opublikować swoje pytanie jako nowe, jeśli nadal nie jest jasne. To jest strona pytań i odpowiedzi, a nie forum. \ o /
e-sushi

67

Zmuszenie przeglądarki do wyświetlania strony o takich samych wymiarach pikseli jak A4 byłoby dość łatwe. Jednak może być kilka dziwactw, gdy rzeczy są renderowane.

Zakładając, że monitory wyświetlają 72 dpi, możesz dodać coś takiego:

<!DOCTYPE html>
<html>
  <head>
    <style>
    body {
        height: 842px;
        width: 595px;
        /* to centre page on screen*/
        margin-left: auto;
        margin-right: auto;
    }
    </style>
  </head>
  <body>
  </body>
</html>

19
Zgodnie z sugestią Willa Deana (co ma sens) za pomocą milimetrów, możesz zmusić przeglądarkę do obliczenia szerokości / wysokości pikseli: ciało {wysokość: 420 mm; szerokość: 297 mm; ...}
Tim McNamara,

49
A4 ma w rzeczywistości 210 x 297 mm.
fouronnes

8
Wreszcie portret DINA4:body { height:297mm; width:210mm; margin-left:auto; margin-right:auto; }
DaVe

1
Wykonałem teraz sporo pracy i chociaż wymiary 210 x 297 są dobre, nie należy ich uważać za absolutnie pasujące do strony A4. Dobrym testem jest wydrukowanie-> PDF bezpośrednio z Chrome i przewinięcie kciuka strony podglądu; nawet bez ustawionych marginesów, należy zmniejszyć pełną wysokość, aby uniknąć przepełnienia -> powoduje to, że wszystkie strony o numerach parzystych są puste.
cbmtrx

Co się stanie, jeśli będziemy mieć dynamiczną treść, która może zawierać do 3-4 stron lub więcej?
jazzbpn

36

Rozmiar A4 to 210 x 297 mm

Możesz więc ustawić stronę HTML, aby pasowała do tych rozmiarów za pomocą CSS:

html,body{
    height:297mm;
    width:210mm;
}

Co się stanie, jeśli będziemy mieć dynamiczną treść, która może zawierać do 3-4 stron lub więcej?
jazzbpn

24

Utwórz sekcję dla każdej strony i użyj poniższego kodu, aby dostosować marginesy, wysokość i szerokość.

Jeśli drukujesz w formacie A4.

Następnie użytkownik

Size : 8.27in and 11.69 inches

@page Section1 {
    size: 8.27in 11.69in; 
    margin: .5in .5in .5in .5in; 
    mso-header-margin: .5in; 
    mso-footer-margin: .5in; 
    mso-paper-source: 0;
}

div.Section1 {
    page: Section1;
} 

następnie utwórz div z całą zawartością.

<div class="Section1"> 
    type your content here... 
</div>

lub

@media print {
    .page-break { 
        height: 0; 
        page-break-before: always; 
        margin: 0; 
        border-top: none; 
    }
}

body, p, a,
span, td { 
    font-size: 9pt;
    font-family: Arial, Helvetica, sans-serif;
}

body {
    margin-left: 2em; 
    margin-right: 2em;
}

.page {
    height: 947px;
    padding-top: 5px;
    page-break-after: always;   
    font-family: Arial, Helvetica, sans-serif;
    position: relative;
    border-bottom: 1px solid #000;
}

Jesteś pewien, że to działa? Nie mogłem tego odtworzyć w najnowszej przeglądarce Firefox i Chrome.
Dan

tak, głównie robię prace nad Chrome ... działam dobrze ze mną.
Pir Abdul,

3
Nie mogę rozpocząć @page Section1pracy z Chrome 41.0.2272.77. Czy naprawdę jesteś pewien, że Twoja odpowiedź działa? Spróbuj np. Odwiedzić data:text/html,<style>@page x{size:100pt 200pt}</style><div style="page:x">x</div>i otworzyć podgląd wydruku. Nie widzę żadnej różnicy między tym a data:text/html,x. Kiedy wymienić @page xz @page, to działa, ale nie jest to wybierak strona specyficzne.
Rob W

Dla tych, którzy nie są przyzwyczajeni do umieszczania CSS w dokumentach (jak ja w momencie pisania), umieścisz ten kod w znacznikach <style> </style>, a następnie wywołasz div (np. <Div class = page> Stuff </ div > <div class = page> More stuff </div>) gdzie „Stuff” i „more stuff” to treść, która ma być zawarta na jednej stronie.
mkingsbu

16

Użyłem HTML do generowania raportów, które są drukowane poprawnie w prawdziwych rozmiarach na prawdziwym papierze.

Jeśli ostrożnie użyjesz mm jako jednostek w pliku CSS, powinieneś być OK, przynajmniej dla pojedynczych stron. Ludzie mogą cię jednak popsuć, zmieniając powiększenie wydruku w przeglądarce.

Wydaje mi się, że pamiętam, że wszystko, co robiłem, to jedna strona, więc nie musiałem się martwić o paginację - może to być znacznie trudniejsze.


14

Widziałem to rozwiązanie po wyszukiwaniu w google, szukaj „szablonu strony A4 CSS” (codepen.io). Pokazuje obszar przeglądarki o rozmiarze A4 (A3, A5, również pionowy) za pomocą znacznika <page>. Wewnątrz tego tagu wyświetlana jest treść, ale bezwzględna pozycja nadal dotyczy obszaru przeglądarki.

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

Działa to dla mnie bez dołączania innej biblioteki css / js. Działa z bieżącymi przeglądarkami (IE, FF, Chrome).


Korzystanie z tego przykładu z FF 53.0.3 i umieszczanie dwóch stron poziomych jeden po drugim nie działa. Wygląda dobrze w zwykłym widoku, ale po wybraniu Podgląd wydruku rozwija się do 3 stron.
lofihelsinki

Nie chcę box-shadow: none;
wyciągać

to działa dla mnie i muszę zmienić wysokość
Jomal Johny

Co się stanie, jeśli będziemy mieć dynamiczną treść, która może zawierać do 3-4 stron lub więcej?
jazzbpn

11
<link rel="stylesheet" href="/css/style.css" type="text/css">
<link rel="stylesheet" href="/css/print.css" type="text/css" media="print">

W twoim normalnym style.css:

table.tableclassname {
  width: 400px;
}

W twoim print.css:

table.tableclassname {
  width: 16 cm;
}

10

PPI i DPI nie mają absolutnie żadnej różnicy w sposobie drukowania dokumentu w przeglądarce. drukarka nie pobiera informacji na temat rastra na ekranie ani DPI obrazów itp., jeśli drukujesz obrazy, wydrukowałyby w rozmiarze podobnym do proporcji do sposobu ich wyświetlania na ekranie. procesor wydruku w przeglądarce zwiększyłby DPI obrazów z czegoś raczej niższego niż 72dpi do dowolnego DPI pozostałej części dokumentu. powiedzmy, że obraz ma szerokość połowy strony, a następnie fizycznie szerokość około 4 cali. Szerokość piksela obrazu wyniesie około 300 pikseli, aby wyświetlać się poprawnie w przeglądarce. Do czasu wydrukowania przy nominalnej wartości 300 DPI procesor dodał piksele a obraz wzrośnie do około 1200 pikseli, co przy 300 DPI wynosi 4 ".

jeśli chodzi o elementy wektorowe lub nie oparte na pikselach, takie jak tekst, drukarka wybiera własne DPI ze sterownika, który nie odnosi się do rastra ekranu lub szerokości przeglądarki itp. Jeśli przeglądarka ma szerokość 3000 pikseli, procesor wydruku zawinie tekst odpowiednio.

oto, co utrudnia tworzenie ekranów drukowania: każda przeglądarka i drukarka interpretują rozmiary tekstu (pt, em, px) i odstępy na swój sposób. w zależności od używanej drukarki, przeglądarki, a może nawet systemu operacyjnego, otrzymasz inną liczbę wierszy i znaków na stronę. więc nawet jeśli przetestujesz na komputerze przy użyciu przeglądarki i drukarki i stwierdzisz, że możesz wyświetlić tekst w polu o rozdzielczości 640 x 900 pikseli i jest idealny do wydruku, następny facet, który spróbuje wydrukować, może wydrukować go inaczej. naprawdę nie ma sposobu, aby wymusić za każdym razem identyczną drukarkę i przeglądarkę.

zapomnij o pikselach i więcej zapomnij o DPI, jedyną rzeczą, do której możesz użyć pikseli, jest ustawienie szerokości stołu, która symuluje szerokość obszaru drukowania na drukarce. w takim przypadku stwierdziłem, że szerokość 640 pikseli jest bliska.


Przeczytaj wiele stron i wszystkie sugerują, że zwiększenie DPI spowoduje zmniejszenie rozmiaru podczas drukowania (3000px / 300dpi = 10 cali). Ale podczas drukowania z mojej przeglądarki Chrome 600 DPI i 1200 DPI prowadzi do dokładnie tego samego rozmiaru na papierze. Byłem naprawdę zdezorientowany, dopóki tego nie przeczytałem!
Wang Sheng,

10

Szukając podobnego problemu znalazłem to - http://www.indigorose.com/forums/archive/index.php/t-13334.html

A4 to format dokumentu, jako obraz ekranowy, który będzie zależał od rozdzielczości obrazu, na przykład dokument A4 o zmienionym rozmiarze:

  • 72 dpi (sieć) = 595 x 842 pikseli
  • 300 dpi (wydruk) = 2480 x 3508 pikseli (tak, jak znam to „A4”, tj. „210 mm x 297 mm przy 300 dpi”)
  • 600 dpi (wydruk) = 4960 x 7016 pikseli

8

Wiem, że ten temat jest dość stary, ale chcę podzielić się swoim doświadczeniem na ten temat. Właściwie szukałem modułu, który może mi pomóc w codziennych raportach. Piszę niektóre dokumentacje i raporty w HTML + CSS (zamiast Word, Latex, OO, ...). Celem byłoby wydrukowanie ich na papierze A4, aby podzielić się nim z przyjaciółmi ... Zamiast szukać, postanowiłem zorganizować małą zabawną sesję kodowania w celu wdrożenia prostej biblioteki, która może obsługiwać „strony”, numer strony, podsumowanie, nagłówek , stopka, ... Wreszcie zrobiłem to w ~ ~ 2h i wiem, że to nie jest najlepsze narzędzie, ale jest prawie w porządku dla mojego celu. Możesz obejrzeć ten projekt na moim repozytorium i nie wahaj się podzielić swoimi pomysłami. Może nie jest to, czego szukasz na 100%, ale myślę, że ten moduł może ci pomóc.

Zasadniczo tworzę stronę ciała „szerokość: 200 mm;” oraz pojemnik o wysokości: 290 mm (mniejszy niż A4). Potem użyłem podziału strony: zawsze; więc opcja „wydruku” przeglądarki wie, kiedy podzielić strony.

repo: https://github.com/kursion/jsprint


6

Technicznie możesz, ale zajęłoby to dużo pracy, aby wszystkie przeglądarki wydrukowały stronę dokładnie tak, jak jest wyświetlana na ekranie. Ponadto większość przeglądarek wymusza na wydruku adres URL, datę wydruku i numerację stron, co nie zawsze jest pożądane. Tego nie można zmienić ani wyłączyć.

Zamiast tego radzę utworzyć plik PDF na podstawie zawartości ekranu i podać plik PDF do pobrania i / lub wydrukowania. Chociaż większość dostępnych bibliotek PDF jest płatna, istnieje kilka bezpłatnych alternatyw dla tworzenia podstawowych plików PDF.


5

Użyłem 680px w raportach handlowych drukować na papierze formatu A4 od 1998 roku 700px nie zmieściłoby poprawnie zależą od wielkości marginesów. Nowoczesne przeglądarki mogą zmniejszać strony w celu dopasowania do strony na drukarce, ale jeśli używasz 680 pikseli, wydrukujesz poprawnie w prawie wszystkich przeglądarkach.

To jest HTML dla Ciebie Uruchom fragment kodu i zobacz wynik:

window.print();
<table width=680 border=1 cellpadding=20 cellspacing=0>
<tr><th>#</th><th>name</th></tr>
<tr align=center><td>1</td><td>DONALD TRUMP</td></tr>
<tr align=center><td>2</td><td>BARACK OBAMA</td></tr>
</table>

JSFiddle:

https://jsfiddle.net/ajofmm7r/


jaka jest wysokość całej strony w px?
khaverim

4

Wiele sposobów:

html,body{
    height:297mm;
    width:210mm;
}


html,body{
    height:29.7cm;
    width:21cm;
}

html,body{
    height: 842px;
    width: 595px;
}

3

Całkowicie możliwe jest ustawienie układu tak, aby przyjmował proporcje strony A4. Będziesz musiał tylko odpowiednio ustawić szerokość i wysokość (ewentualnie sprawdź za pomocą window.innerHeighti window.innerWidthchociaż nie jestem pewien, czy to jest wiarygodne).

Trudna część polega na drukowaniu A4. Na przykład Javascript obsługuje tylko drukowanie stron przy użyciu tej window.printmetody. Jak sugerował @Prutswonder, utworzenie pliku PDF ze strony internetowej jest prawdopodobnie najbardziej wyrafinowanym sposobem na zrobienie tego (oprócz dostarczenia dokumentacji PDF w pierwszej kolejności). Nie jest to jednak tak trywialne, jak mogłoby się wydawać. Oto link, który zawiera opis klasy Java typu open source do tworzenia plików PDF z HTML: http://www.javaworld.com/javaworld/jw-04-2006/jw-0410-html.html .

Oczywiście, po utworzeniu pliku PDF z wydrukiem w formacie A4 spowoduje to czysty wydruk strony A4. Czy warto zainwestować czas to kolejne pytanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.