Пейзажний друк з HTML


244

У мене є звіт HTML, який потрібно надрукувати пейзаж через багато колонок. Це є спосіб зробити це, без потреби користувача змінювати налаштування документа?

І які варіанти є серед браузерів.

Відповіді:


379

У своєму CSS ви можете встановити властивість @page, як показано нижче.

@media print{@page {size: landscape}}

@Page є частиною специфікації CSS 2.1, однак це sizeне так висвітлено у відповіді на питання Чи @Page {size: пейзаж} застарілий? :

CSS 2.1 більше не вказує атрибут size. Поточний робочий проект модуля CSS3 Paged Media все ж його визначає (але це не є стандартним або прийнятим).

Як зазначено, параметр розміру походить від CSS 3 Проект Специфікації . Теоретично це може бути встановлено як розмір сторінки, так і орієнтацію, хоча в моєму зразку розмір опущено.

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

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

У цій статті є кілька запропонованих робочих ситуацій, що використовують JavaScript або ActiveX, які надсилають ключі до браузера користувачів, хоча вони не є ідеальними і покладаються на зміну налаштувань безпеки браузерів.

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

<style type="text/css" media="print">
    .page
    {
     -webkit-transform: rotate(-90deg); 
     -moz-transform:rotate(-90deg);
     filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
    }
</style>

Останньою альтернативою, яку я знайшов, є створення альбомної версії у форматі PDF. Ви можете вказати на це, коли користувач вибирає друк, він друкує PDF. Однак я не зміг домогтися цього для автоматичного друку в IE7.

<link media="print" rel="Alternate" href="print.pdf">

На закінчення в деяких браузерах відносність легко за допомогою параметра @page size, однак у багатьох браузерах немає вірного способу, і це залежатиме від вашого вмісту та середовища. Можливо, тому Google Documents створює PDF-файл, коли вибрано друк, а потім дозволяє користувачеві відкрити та надрукувати його.


28
Як не дивно, що він говорить, що "розмір" може бути пейзажним, коли це насправді "орієнтація".
Магнус Сміт

1
@page sizeЗдається, це не працює у всіх сучасних браузерах, лише у Firefox. І Chrome, і Opera не враховують цього, наскільки я бачив.
Justin808

2
size: landscapeНЕ є частиною CSS2.1, хоча @pageправила є. Однак це частина CSS3. Для підтвердження спробуйте скористатися W3C CSS Validator і введіть @page {size: landscape}і порівняйте результати з "Профілем", встановленим на рівень 2.1 проти рівня 3.
Дайског

1
Якщо у вас є div, який займає 100 ширини або висоти сторінки, обертання не змушує діву займати простір портретної сторінки, а обертовий пейзаж. Тож деякі частини діва потім виходять зі сторінки.
Олівер

6
@AbeerSul - Чесно кажучи, про CSS, то , що робить роботу в IE;)
Tony

27

Моє рішення:

<style type="text/css" media="print">
    @page { 
        size: landscape;
    }
    body { 
        writing-mode: tb-rl;
    }
</style>

Це працює IE, FirefoxіChrome


1
Що робити, якщо я хотів, щоб певний classdiv містився в пейзажі, а не на всій сторінці?
SearchForKnowledge

2
@SearchForKnowledge - це було б перетворення css3: rotate (90deg).
ToolmakerSteve

Не зрозумів, що я роблю неправильно, але це розбиває всю сторінку в хромі. Це рядок, який я скопіював з коду @media print {@page {size: portrait;} body {режим-запис: tb-rl;}}
X-HuMan

Для мене додавання лише цієї сторінки @page {size: пейзаж; } працює.
Кумар М

1
У 2018 році все ще чудово працює зі стандартними компонентами WebBrowers. Дякую.
Кен Беков

14

Недостатньо просто обертати вміст сторінки. Ось правильний CSS, який працює в більшості браузерів (Chrome, Firefox, IE9 +).

Спочатку встановіть тіло marginна 0, оскільки в іншому випадку поля сторінки будуть більшими, ніж ті, які ви встановили в діалоговому вікні друку. Також встановіть backgroundколір для візуалізації сторінок.

body {
  margin: 0;
  background: #CCCCCC;
}

margin, borderі backgroundвони потрібні для візуалізації сторінок.

paddingповинні бути встановлені на потрібному полі друку. У діалоговому вікні друку потрібно встановити однакові поля (10 мм у цьому прикладі).

div.portrait, div.landscape {
  margin: 10px auto;
  padding: 10mm;
  border: solid 1px black;
  overflow: hidden;
  page-break-after: always;
  background: white;
}

Розмір сторінки А4 - 210 мм x 297 мм. Потрібно відняти поля друку від розміру. І встановіть розмір вмісту сторінки:

div.portrait {
  width: 190mm;
  height: 276mm;
}
div.landscape {
  width: 276mm;
  height: 190mm;
}

Я використовую 276 мм замість 277 мм, тому що різні браузери масштабують сторінки трохи по-різному. Тож деякі з них надрукують вміст висотою 277 мм на двох сторінках. Друга сторінка буде порожньою. Більш безпечно використовувати 276мм.

Нам не потрібно margin, border, padding, backgroundна друкованій сторінці, так що видалити їх:

@media print {
  body {
    background: none;
    -ms-zoom: 1.665;
  }
  div.portrait, div.landscape {
    margin: 0;
    padding: 0;
    border: none;
    background: none;
  }
  div.landscape {
    transform: rotate(270deg) translate(-276mm, 0);
    transform-origin: 0 0;
  }
}

Зауважте, що походження трансформації є 0 0! Також вміст альбомних сторінок повинен бути переміщений на 276 мм вниз!

Також якщо у вас поєднання сторінок з портретом та ландшафтом, IE зменшить розмір сторінок. -ms-zoomВиправляємо це, встановивши 1,665. Якщо ви встановите його на 1.6666 чи щось подібне, праву рамку вмісту сторінки іноді можна обрізати.

Якщо вам потрібно IE8- або інші старі браузери підтримують ви можете використовувати -webkit-transform, -moz-transform,filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3) . Але для досить сучасних браузерів це не потрібно.

Ось тестова сторінка:

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <style>
      ...Copy all styles here...
    </style>
  </head>
  <body>
    <div class="portrait">A portrait page</div>
    <div class="landscape">A landscape page</div>
  </body>
</html>

Дякую велике, працює як шарм (використовуваний хром) з веб-сторінками, що складаються із суміші як пейзажних, так і портретних режимів.
zcahfg2

Звідки дів.portrait, div.landscape?
zcahfg2

Це працювало в IE 11 для когось? Здається, всі елементи відключені.
mzonerz

1
@mzonerz Я щойно тестував IE 11, він працює чудово. Я додав тестовий html в кінці відповіді. Зверніть увагу, що в налаштуваннях друку слід встановити розмітки сторінок на 10 мм. Якщо вам потрібні різні поля сторінки, вам доведеться оновити такі значення: padding: 10mm; ширина: 190мм; висота: 190мм;
Денис

@Denis Дякую за ваші зусилля. Насправді це єдине рішення, яке працювало для мене до цього часу .. Уже !! Людям, які інтегрують це рішення в сайти спільного доступу до Інтранету, можливо, знадобиться вимкнути параметри подання сумісності.
mzonerz

13

Цитується з CSS-Discuss Wiki

Правило @page було скорочено за межі з CSS2 до CSS2.1. Повна інформація CSS2 @page, як повідомляється, було реалізовано лише в Opera (і навіть тоді). Моє власне тестування показує, що IE і Firefox взагалі не підтримують @page. Згідно з давно устарілим специфікацією CSS2, розділ 13.2.2, можна змінити налаштування орієнтації користувача та (наприклад) силовий друк у Landscape, але відповідне властивість "розміру" було скинуто з CSS2.1, що відповідає факту що жоден поточний браузер не підтримує його. Він був відновлений у модулі CSS3 Paged Media, але зауважте, що це лише робочий проект (станом на липень 2009 року).

Висновок: забудьте про @page на даний момент. Якщо ви вважаєте, що ваш документ повинен бути надрукований у ландшафтній орієнтації, запитайте себе, чи можете ви натомість зробити дизайн більш текучим. Якщо ви насправді не можете (можливо, тому, що документ містить таблиці даних з багатьма стовпцями, наприклад), вам потрібно буде порадити користувачеві встановити орієнтацію на Пейзаж і, можливо, окреслити, як це зробити у найбільш поширених браузерах. Звичайно, деякі веб-переглядачі мають функцію друку під ширину (зменшується до розміру) (наприклад, Opera, Firefox, IE7), але не доцільно покладатися на користувачів, які мають цей інструмент або ввімкнули його.


4
Це "CSS-Discuss Wiki", а не "Wikipedia".
jball

12

Спробуйте додати цю CSS:

@page {
  size: landscape;
}

2
Це працювало для вас із будь-яким із браузерів? З IE8 та Firefox3.5, схоже, це не має ніякого значення для попереднього перегляду друку.
Даніель Баллінгер

На жаль, попередній перегляд друку не відповідає усім властивостям CSS, на жаль. Але це має працювати у всіх поточних браузерах.
gizmo

Дякуємо, що стежили за цим питанням. Здається, це не працює і для мене з фактичним друком. Я щось пропустив? Мій тестовий файл такий: (Мені довелося врізати вміст абзацу, щоб він вмістився у поле для коментарів) <html> <head> <title> Тестова сторінка пейзажного тестування </title> <style> @Page {size: пейзаж; } </style> </head> <body> <p> Lorem ipsum dolor sit amet, ... </p> </body> </html>
Даніель Баллінгер

Я перепробував будь-яку комбінацію правила @Page, показаного на цій сторінці та деяких з інших сайтів, а також приклад у HTML / XHTML O'Reilly: Посібник з остаточного значення, П'яте видання. Мені не вдалося змусити це працювати в IE8, Firefox 3.6 або Chrome 7.0.
Пол Кістер

Я знаю його 2012 рік ... але ця відповідь допомогла мені ... підтримати ландшафтний варіант для IE8 ... дякую
Vikram

11

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

/* ISO Paper Size */
@page {
  size: A4 landscape;
}

/* Size in mm */    
@page {
  size: 100mm 200mm landscape;
}

/* Size in inches */    
@page {
  size: 4in 6in landscape;
}

Ось посилання на документацію @page .


Якщо використовується з bootstrap, ця декларація повинна зберігатися в окремому .cssфайлі або, якщо вона є вбудованою, декларація boostrap за замовчуванням size: a3матиме перевагу.
caram


5

Ви також можете використовувати нестандартний режим запису атрибутів css лише для IE

div.page    { 
   writing-mode: tb-rl;
}

1
Це переорієнтовує вміст сторінки, але насправді не змінює макет сторінки на ландшафт. Тобто заголовки та колонтитули все ще додаватимуться так, ніби сторінка була портретною.
Даніель Баллінгер

2
-webkit-transform: rotate(-90deg); -moz-transform:rotate(-90deg);
     filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);

не працює в Firefox 16.0.2, але він працює в Chrome


2

Я створив порожній документ MS з налаштуванням Пейзаж, а потім відкрив його в блокноті. Скопіювали та вставили наступне на мою сторінку HTML

<style type="text/css" media="print">
   @page Section1
    {size:11 8.5in;
    margin:.5in 13.6pt 0in 13.6pt;
    mso-header-margin:.5in;
    mso-footer-margin:.5in;
    mso-paper-source:4;}
div.Section1
    {page:Section1;}
</style>



<div class="Section1"> put  text / images / other stuff  </div>

Попередній перегляд друку показує сторінки в альбомному розмірі. Це, здається, добре працює на IE та Chrome, не перевіряється на FF.


1

Я спробував вирішити цю проблему один раз, але всі мої дослідження привели мене до управління / плагінів ActiveX. Немає жодної хитрості, що веб-переглядачі (як і раніше 3 роки) дозволили змінювати будь-які настройки друку (кількість копій, розмір паперу).

Я намагаюся обережно попередити користувача, що їм потрібно вибрати "пейзаж", коли з'явиться діалогове вікно друку браузерів. Я також створив сторінку "Попередній перегляд друку", яка працювала набагато краще, ніж IE6! У нашому додатку були дуже широкі таблиці даних у деяких звітах, і попередній перегляд друку дав зрозуміти користувачам, коли таблиця буде розлита з правого краю паперу (оскільки IE6 не впорається з друком на 2 аркушах).

І так, люди все ще використовують IE6 навіть зараз.


1
<style type="text/css" media="print">
.landscape { 
    width: 100%; 
    height: 100%; 
    margin: 0% 0% 0% 0%; filter: progid:DXImageTransform.Microsoft.BasicImage(Rotation=1); 
} 
</style>

Якщо ви хочете, щоб цей стиль застосовано до таблиці, тоді створіть один тег div з цим класом стилів і додайте тег таблиці у цей тег div та закрийте тег div в кінці.

Ця таблиця друкується лише в альбомному режимі, а всі інші сторінки друкуватимуться лише в портретному режимі. Але проблема полягає в тому, що якщо розмір таблиці перевищує ширину сторінки, то ми можемо втратити частину рядків, а іноді й заголовки також пропущені. Будь обережний.

Гарного дня.

Дякую, Naveen Mettapally.


1
Це обертає вміст екрана на 90 градусів, але роздруківка все ще виходить у форматі промаранту. Найгірше з обох світів насправді, принаймні у ie8.
arame3333

1

Я спробував відповідь Дениса і зіткнувся з деякими проблемами (портретні сторінки не надрукувалися належним чином після переходу на альбомні сторінки), ось ось моє рішення:

body {
  margin: 0;
  background: #CCCCCC;
}

div.page {
  margin: 10px auto;
  border: solid 1px black;
  display: block;
  page-break-after: always;
  width: 209mm;
  height: 296mm;
  overflow: hidden;
  background: white;
}

div.landscape-parent {
  width: 296mm;
  height: 209mm;
}

div.landscape {
  width: 296mm;
  height: 209mm;
}

div.content {
  padding: 10mm;
}

body,
div,
td {
  font-size: 13px;
  font-family: Verdana;
}

@media print {
  body {
    background: none;
  }
  div.page {
    width: 209mm;
    height: 296mm;
  }
  div.landscape {
    transform: rotate(270deg) translate(-296mm, 0);
    transform-origin: 0 0;
  }
  div.portrait,
  div.landscape,
  div.page {
    margin: 0;
    padding: 0;
    border: none;
    background: none;
  }
}
<div class="page">
  <div class="content">
    First page in Portrait mode
  </div>
</div>
<div class="page landscape-parent">
  <div class="landscape">
    <div class="content">
      Second page in Landscape mode (correctly shows horizontally in browser and prints rotated in printer)
    </div>
  </div>
</div>
<div class="page">
  <div class="content">
    Third page in Portrait mode
  </div>
</div>



0

Якщо ви хочете побачити пейзаж на екрані перед друком, а також друк, то у своєму css ви можете встановити ширину до 900 пікселів, а висоту - 612 пікселів.

OP не згадував формат A4. Я припускаю, що це розмір букви в моїх номерах вище.


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