Поле під час друку html-сторінки


141

Я використовую окрему таблицю стилів для друку. Чи можна встановити правий і лівий поля в аркуші стилів, який встановлює поле друку (тобто поле на папері).

Дякую.

Відповіді:


247

Ви повинні використовувати cmабо mmяк одиницю, коли ви вказуєте для друку. Використання пікселів змусить браузер перекласти його на щось подібне до того, як він виглядає на екрані. Використання cmабо mmзабезпечить постійний розмір на папері.

body
{
  margin: 25mm 25mm 25mm 25mm;
}

Для розміру шрифту використовуйте ptдля друку.

Зауважте, що встановлення поля на корпусі у стилі css не буде коригувати поле в драйвері принтера, яке визначає область друку принтера, або поле керування браузером (може регулюватися при попередньому перегляді друку в деяких браузерах) ... Це просто встановить запас для документа всередині області для друку.

Ви також повинні знати, що IE7 ++ автоматично коригує розмір, щоб найкраще підходити, і спричиняє все, що не так, навіть якщо ви використовуєте cmабо mm. Щоб змінити цю поведінку, користувач повинен вибрати "Попередній перегляд друку", а потім встановити розмір друку на 100%(за замовчуванням Shrink To Fit).

Кращим варіантом повного контролю над друкованими полями є використання @pageдирективи для встановлення поля паперу, що впливатиме на поле паперу поза елементом корпусу html, яким зазвичай керує браузер. Див. Http://www.w3.org/TR/1998/REC-CSS2-19980512/page.html .
Наразі це працює у всіх основних браузерах, крім Safari.
В Internet Explorer поле в налаштуваннях для цього друку фактично встановлюється на цьому значенні, і якщо ви робите попередній перегляд, ви отримаєте це за замовчуванням, але користувач може змінити його в попередньому перегляді.

@page  
{ 
    size: auto;   /* auto is the initial value */ 

    /* this affects the margin in the printer settings */ 
    margin: 25mm 25mm 25mm 25mm;  
} 

body  
{ 
    /* this affects the margin on the content before sending to printer */ 
    margin: 0px;  
} 

Відповідна відповідь: Вимкнення параметрів друку браузера (заголовки, колонтитули, поля) зі сторінки?


3
Це працює зараз у Chrome 18 та IE9 (не тестували попередні версії). У Firefox 12 все ще не працює, але ви можете зробити виявлення на сервері та додати клас тіла, <body class="firefox">щоб у вашому css ви могли це зробити body.firefox {margin: 0mm; padding: 0.25in;}, тобто насправді 0,75-дюймовий запас, оскільки firefox вже додає 0,5 дюйма. Це має працювати до тих пір, поки вам потрібно> = 0,5 дюймові поля.
MrFusion

7
+1 для @page! Це саме те, що мені було потрібно, оскільки я друкую кілька сторінок.
авіаудар

2
Зараз він працює і з Firefox. Оскільки Firefox має хороші процедури автоматичного оновлення, це не повинно бути проблемою, з якою нам більше не потрібно звертатися. Я пройшов тестування на IE, Opera, Chrome, Firefox та Safari. Єдиний браузер, з яким зараз не працює - Safari (версія 5.1.7 для Windows). Я не тестував на Mac.
трепет

1
Це додає лише верхню маржу на першій сторінці. Краще рішення для установки тих же полів на всіх сторінках: stackoverflow.com/questions/37033766 / ...
besimple

@besimple: Дивіться нижній приклад. Використання директиви "@ page" додасть поле для кожної сторінки.
трепет

42

По-перше, я намагаюся змусити всіх своїх користувачів використовувати Chrome під час друку, оскільки інші браузери створюють різні макети.

Відповідь на це питання рекомендує:

@page {
  size: 210mm 297mm; 
  /* Chrome sets own margins, we change these printer settings */
  margin: 27mm 16mm 27mm 16mm; 
}

Однак я застосував цей CSS для друку всіх моїх сторінок:

@media print 
{
    @page {
      size: A4; /* DIN A4 standard, Europe */
      margin:0;
    }
    html, body {
        width: 210mm;
        /* height: 297mm; */
        height: 282mm;
        font-size: 11px;
        background: #FFF;
        overflow:visible;
    }
    body {
        padding-top:15mm;
    }
}



Особливий випадок: Довгі столи

Коли мені потрібно було надрукувати таблицю на декількох сторінках, то margin:0із знаком "the" @pageвела до кровоточивості:

кровоточиві краї

Я міг би вирішити це завдяки цій відповіді :

table { page-break-inside:auto }
tr    { page-break-inside:avoid; page-break-after:auto }
thead { display:table-header-group; }
tfoot { display:table-footer-group; }

Плюс встановлення верхньої та нижньої меж для @page:

@page { 
    size: auto;
    margin: 20mm 0 10mm 0;
}
body {
    margin:0;
    padding:0;
}

Результат:

вирішені кровоточиві краї

Я вважаю за краще рішення, яке є стислим і працює з усім браузером. Наразі сподіваюся, що наведена вище інформація може допомогти деяким розробникам з подібними проблемами.


1
Ваше рішення виявилося безцінним при роботі з друком звітів за допомогою ERPNext. Мені вдалося легко розробити власні власні формати друку, і ці вказівки дуже допомогли!
Tropicalrambler

10

Оновлене, просте рішення

@media print {
   body {
       display: table;
       table-layout: fixed;
       padding-top: 2.5cm;
       padding-bottom: 2.5cm;
       height: auto;
   }
}

Старе рішення

Створіть розділ з кожною сторінкою та скористайтеся наведеним нижче кодом для коригування поля, висоти та ширини.

Якщо ви друкуєте формат А4.

Потім користувач

Розмір: 8,27 дюйма та 11,69 дюйма

@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;
} 

потім створіть div із усім своїм вмістом у ньому.

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

Це не працює для Chrome або FF. Також class=Section1має бути class="Section1".
nu everest

Це просте рішення: stackoverflow.com/questions/37033766 / ...
besimple

9

Я особисто запропонував би використовувати іншу одиницю вимірювання, ніж px. Я не думаю, що пікселі мають велику актуальність з точки зору друку; в ідеалі ви будете використовувати:

  • крапка (pt)
  • сантиметр (см)

Я впевнений, що є й інші, і одну чудову статтю про print-css можна знайти тут: Перехід до друку , Ерік Мейєр .


1
Ви маєте рацію, що pxне має особливого значення для друку. Але браузери "перекладають" піксельні одиниці, так що це схоже на те, як це виглядає на екрані. Він не використовує "точки роздільної здатності принтера" в якості пікселів (слава Богу ...).
трепет

1

Я також рекомендую pt в порівнянні з см або мм, оскільки це більш точно. Крім того, я не можу заставити @page працювати в Chrome (версія 30.0.1599.69 м). Він ігнорує все, що я поставив для поля, великого чи малого. Але, ви можете змусити його працювати з полями тіла на документі, дивно.


0

Якщо ви знаєте цільовий розмір паперу, ви можете розмістити свій вміст у DIV з таким певним розміром і додати поле до цього DIV для імітації поля друку. На жаль, я не вірю, що ви маєте додатковий контроль над функцією друку, окрім того, що просто показуєте діалогове вікно друку.


Дякую. Чи не можна вказати залишити х пікселів зліва та справа незалежно від розміру паперу. З повагою
кобра

1
Я думаю, це може бути можливим, якщо ви встановите розмір батьківського DIV на 100% і додаєте до нього пікселі сокири.
jonjbar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.