Альбомная печать из HTML

У меня есть отчет в формате HTML, который нужно распечатать в альбомной ориентации из-за множества столбцов. Есть ли способ сделать это, при этом пользователю не нужно менять настройки документа?

И какие есть варианты среди браузеров.

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
262
0
412 147
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

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

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

Это действительно меняет ориентацию содержимого страницы, но не меняет макет страницы на альбомный. Т.е. верхние и нижние колонтитулы по-прежнему будут добавляться, как если бы страница была портретной.

Daniel Ballinger 28.07.2009 07:13

Возможно, вы сможете использовать CSS 2 правило @page, который позволяет вам установить 'размер' свойство для ландшафта.

Попробуйте добавить этот свой CSS:

@page {
  size: landscape;
}

Это сработало для вас с любым из браузеров? В IE8 и Firefox3.5 это не имело никакого значения для предварительного просмотра печати.

Daniel Ballinger 28.07.2009 07:15

К сожалению, предварительный просмотр печати не соответствует всем свойствам CSS. Но это должно работать во всех текущих браузерах.

gizmo 28.07.2009 09:30

Спасибо, что ответили на это. Похоже, у меня это тоже не работает с фактической печатью. Я что-то упустил? Мой тестовый файл выглядит следующим образом: (Мне пришлось обрезать содержимое абзаца, чтобы поместиться в поле для комментариев) <html> <head> <title> Страница тестирования в альбомной ориентации </title> <style> @Page {size: landscape; } </style> </head> <body> <p> Lorem ipsum dolor sit amet, ... </p> </body> </html>

Daniel Ballinger 29.07.2009 03:06

Я пробовал каждую комбинацию правила @Page, показанного на этой странице и некоторых с других сайтов, а также пример из O'Reilly's HTML / XHTML: The Definitive Guide, Fifth Edition. Мне не удалось заставить это работать в IE8, Firefox 3.6 или Chrome 7.0.

Paul Keister 22.11.2010 22:20

Я знаю его 2012 год ... но этот ответ помог мне ... поддержать вариант ландшафта для IE8 ... спасибо

Vikram 24.07.2012 23:54
Ответ принят как подходящий

В вашем CSS вы можете установить свойство @page, как показано ниже.

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

@Page является частью Спецификация CSS 2.1, однако этот size не так выделен ответом на вопрос @Page {size: landscape} устарела?:

CSS 2.1 no longer specifies the size attribute. The current working draft for CSS3 Paged Media module does specify it (but this is not standard or accepted).

Как указано, опция размера происходит от 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-файл, когда выбрана печать, а затем позволяет пользователю открыть и распечатать его.

странно, что там написано, что «размер» может быть альбомным, хотя на самом деле это «ориентация».

Magnus Smith 10.11.2009 19:20

@page size Похоже, работает не во всех современных браузерах, только в Firefox. Насколько я видел, Chrome и Opera игнорируют это.

Justin808 18.05.2011 02:43

Я обновил ответ после дополнительных исследований, спасибо

John 18.05.2011 11:42

size: landscape является частью НЕТ CSS2.1, хотя правила @page являются. Однако это часть CSS3. Для подтверждения попробуйте использовать Валидатор CSS W3C и введите @page {size: landscape} и сравните результаты с «Профилем», установленным на уровне 2.1 и уровне 3.

daiscog 02.11.2011 14:56

@Magnus Smith - В спецификации указано, что его можно установить на размер: альбомная ориентация A4, но бумагу можно не указывать.

John 25.11.2011 16:21

+1 за очень подробный ответ с несколькими решениями! Печально, что по состоянию на сентябрь 2012 года современные браузеры все еще не поддерживают альбомную ориентацию. (протестировано в Chrome и Firefox в обеих текущих версиях на момент публикации)

L84 20.09.2012 23:06

Когда у вас есть div, занимающий 100 ширины или высоты страницы, вращение не заставляет div занимать пространство портретной страницы, а вращается lanscape. Таким образом, некоторые части div не отображаются на странице.

Oliver 12.01.2014 06:28

Обратите внимание, что поворот содержимого имеет (возможно) нежелательный побочный эффект: когда пользователь устанавливает в настройках принтера ориентацию бумаги в альбомной ориентации, он печатает портретную и наоборот.

JJJ 28.06.2014 12:47

Привет, Джон, некоторые из комментаторов говорят, что это работает в Firefox, а некоторые говорят, что это не работает в Firefox. Итак, я хочу знать, отражаются ли свойства @page в предварительном просмотре печати (да, я указал внутри @media print { @page...)? Если да, то я не получаю альбомную ориентацию A3 в Firefox v43, Ubuntu 14.04.

learner 30.06.2016 17:30

Работает для Chrome версии 49.

Pavlos Papanikolaou 04.07.2016 19:13

@AbeerSul - Если честно, насчет CSS, какие делает работают в IE;)

Tony 30.03.2017 01:06

Вот простое решение, которое работает в большинстве браузеров stackoverflow.com/a/44069821/632199

Denis 19.05.2017 15:24

Я пробовал ссылку с media = print и rel = alternate из предложения PDF, но при нажатии print он все еще пытается распечатать html. Есть предложения, что я делаю неправильно? Я пробовал в Safari и Chrome. Спасибо.

jsaven 28.11.2020 05:52

Однажды я попытался решить эту проблему, но все мои исследования привели меня к элементам управления / плагинам ActiveX. Нет никакой уловки, что браузеры (по крайней мере, 3 года назад) позволяли изменять какие-либо настройки печати (количество копий, размер бумаги).

Я приложил все усилия, чтобы внимательно предупредить пользователя о том, что ему нужно выбрать «альбомную ориентацию» при появлении диалогового окна печати браузера. Я также создал страницу предварительного просмотра, которая работала намного лучше, чем в IE6! В нашем приложении были очень широкие таблицы данных в некоторых отчетах, и предварительный просмотр печати давал понять пользователям, когда таблица выйдет за правый край бумаги (поскольку IE6 также не справлялся с печатью на 2 листах).

И да, люди все еще используют IE6 даже сейчас.

<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 в конце.

Эта таблица будет печататься только в альбомной ориентации, а все остальные страницы будут печататься только в портретном режиме. Но проблема в том, что если размер таблицы больше ширины страницы, мы можем потерять некоторые строки, а иногда и заголовки. Будь осторожен.

Хорошего дня.

Спасибо, Навин Меттапалли.

Это поворачивает содержимое экрана на 90 градусов, но распечатка по-прежнему выводится в протяженном формате. На самом деле худшее из обоих миров, по крайней мере, в ie8.

arame3333 09.02.2012 12:49

Цитируется из CSS-обсуждение вики

The @page rule has been cut down in scope from CSS2 to CSS2.1. The full CSS2 @page rule was reportedly implemented only in Opera (and buggily even then). My own testing shows that IE and Firefox don't support @page at all. According to the now-obsolescent CSS2 spec section 13.2.2 it is possible to override the user's setting of orientation and (for example) force printing in Landscape but the relevant "size" property has been dropped from CSS2.1, consistent with the fact that no current browser supports it. It has been reinstated in the CSS3 Paged Media module but note that this is only a Working Draft (as at July 2009).

Conclusion: forget about @page for the present. If you feel your document needs to be printed in Landscape orientation, ask yourself if you can instead make your design more fluid. If you really can't (perhaps because the document contains data tables with many columns, for example), you will need to advise the user to set the orientation to Landscape and perhaps outline how to do it in the most common browsers. Of course, some browsers have a print fit-to-width (shrink-to-fit) feature (e.g. Opera, Firefox, IE7) but it's inadvisable to rely on users having this facility or having it switched on.

Это «CSS-Discuss Wiki», а не «Википедия».

jball 27.12.2010 19:54

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

не работает в Firefox 16.0.2, но работает в Chrome

Это также сработало для меня:

@media print and (orientation:landscape) { … }

В каких браузерах вы тестировали?

Mike Kormendy 17.11.2014 20:53

Мое решение:

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

Это работает в IE, Firefox и Chrome

Что, если я хочу, чтобы определенный div class отображался в альбомной ориентации, а не на всей странице?

SearchForKnowledge 09.06.2015 18:47

@SearchForKnowledge - это будет преобразование css3: rotate (90deg).

ToolmakerSteve 02.09.2015 17:10

Не понял, что делаю не так, но это разбивает всю страницу в хроме. Это строка, которую я скопировал из кода @media print {@page {size: portrait;} body {writing-mode: tb-rl;}}

X-HuMan 09.06.2016 18:54

Я добавляю только эту @page {size: landscape; } работает.

Kumar M 28.09.2017 07:21

В 2018 году по-прежнему отлично работает со стандартными компонентами веб-браузера. Спасибо.

Ken Bekov 28.01.2018 16:26

writing-mode полностью разрушает макет в Safari (даже после закрытия окна печати).

Fabian von Ellerts 24.12.2019 13:06

Я создал пустой документ 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.

Как уже упоминалось, свойство 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 документация.

При использовании с начальной загрузкой это объявление должно храниться в отдельном файле .css, иначе, если оно встроено, объявление boostrap по умолчанию (size: a3) будет иметь приоритет.

caram 19.12.2019 18:51

Недостаточно просто повернуть содержимое страницы. Вот правильный 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мм х 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 27.06.2019 04:17

Откуда div.portrait, div.landscape?

zcahfg2 27.06.2019 04:37

Это сработало в IE 11 у кого-нибудь? Кажется, все элементы отключены.

mzonerz 25.09.2019 14:31

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

Denis 25.09.2019 15:20

@Denis Спасибо за ваши усилия .. На самом деле это единственное решение, которое у меня сработало до сих пор .. Замечательно !! Людям, которые интегрируют это решение в интранет-сайты sharepoint, возможно, потребуется отключить параметры просмотра в режиме совместимости.

mzonerz 26.09.2019 12:37

Я печатаю в PDF в lanscape, мне пришлось установить принтер «MS Print to PDF» на Landscape и поменять местами width и height на div.portrait и div.landscape. В остальном отлично работает!

caram 28.11.2019 18:20

Вы можете попробовать следующее:

@page {
    size: auto
}

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

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>

Если вы хотите видеть пейзаж на экране перед печатью, а также перед печатью, то в своем CSS вы можете установить ширину 900 пикселей и высоту 612 пикселей.

ОП не упомянул размер А4. Я предполагаю, что это размер Letter в моих числах выше.

Другие вопросы по теме