从HTML横向打印


244

我有一个HTML报告,由于列很多,因此需要横向打印。是否有一种方法可以执行此操作,而无需用户更改文档设置?

在浏览器中有哪些选择。

Answers:


379

在CSS中,您可以设置@page属性,如下所示。

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

@page是CSS 2.1规范的一部分,但是size问题的答案并未突出显示@page {size:landscape}是否已过时?

CSS 2.1不再指定size属性。CSS3 Paged Media模块的当前工作草案确实指定了它(但这不是标准的或不可接受的)。

如前所述,size选项来自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文档在选择打印后会创建PDF,然后允许用户打开并打印该PDF的原因。


28
奇怪的是,它说“大小”可以是风景,而实际上却是一个“方向”。
Magnus Smith,

1
@page size似乎不适用于所有现代浏览器,仅适用于Firefox。据我所知,Chrome和Opera都无视这一点。
Justin808

2
size: landscape虽然规则是CSS2.1的一部分,但它不是 CSS2.1的一部分@page。但是,它是CSS3的一部分。为了确认,请尝试使用W3C CSS验证,并输入@page {size: landscape}和VS 3级与“档案”组结果进行比较,以2.1的水平
daiscog

1
当一个div占据页面宽度或高度的100时,旋转不会使div占据纵向页面的空间,而是旋转一个横向的空间。因此,div的某些部分不在页面内。
奥利弗

6
@AbeerSul-老实说,关于CSS,在IE 有效的方法是什么;)
Tony

27

我的解决方案:

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

这部作品在IEFirefoxChrome


1
如果我希望某些classdiv出现在横向页面而不是整个页面上怎么办?
SearchForKnowledge 2015年

2
@SearchForKnowledge-这将是css3的转换:rotate(90deg)。
ToolmakerSteve

不明白我在做什么错,但这会破坏chrome的整个页面。这是我从代码@media print {@page {size:portrait;} body {writing-mode:tb-rl;}}复制的行
X-HuMan

对我来说,仅添加此@page {size:landscape; }。
库玛M

1
在2018年,标准WebBrowers组件仍然可以很好地工作。谢谢。
肯·贝科夫

14

仅仅旋转页面内容是不够的。这是适用于大多数浏览器(Chrome,Firefox,IE9 +)的正确CSS。

首先将主体设置margin为0,因为否则页边距将大于您在“打印”对话框中设置的页边距。还要设置background颜色以使页面可视化。

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

marginborder并且background是可视化页面所必需的。

padding必须设置为所需的打印边距。在打印对话框中,您必须设置相同的边距(在此示例中为10mm)。

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

A4页面的尺寸为210mm x 297mm。您需要从尺寸中减去打印边距。并设置页面内容的大小:

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

我使用276mm而不是277mm,因为不同的浏览器对页面的缩放略有不同。因此,其中一些将在两页上打印277毫米高的内容。第二页将为空。使用276mm更安全。

我们不需要任何marginborderpaddingbackground在打印页面上,所以其删除:

@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!此外,横向页​​面的内容必须向下移动276mm!

另外,如果您同时使用纵向和横向页面,IE会缩小页面。我们通过将其设置-ms-zoom为1.665来修复它。如果将其设置为1.6666或类似的内容,有时页面内容的右边框可能会被裁剪。

如果您需要IE8-或其他旧的浏览器支持,您可以使用-webkit-transform-moz-transformfilter: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>

非常感谢您,网页由横向和纵向两种模式结合而成,就像一个魅力(使用的Chrome)。
zcahfg2

div.portrait,div.landscape从哪里来?
zcahfg2

在IE 11中对任何人都有效吗?似乎所有元素都不合时宜。
mzonerz

1
@mzonerz我刚刚在IE 11中测试过,效果很好。我在答案的末尾添加了一个测试html。请注意,您应在打印设置中将页边距设置为10mm。如果需要其他页边距,则必须更新以下值:padding:10mm; 宽度:190mm; 高度:190mm;
丹尼斯

@Denis谢谢您的努力。.实际上,这是迄今为止对我唯一有效的解决方案。.nice!!,将此解决方案集成到sharepoint Intranet网站中的人们可能需要关闭“兼容性视图设置”。
mzonerz

13

引自CSS-Discuss Wiki

@page规则的范围从CSS2减少到CSS2.1。据说完整的CSS2 @page规则仅在Opera中实现(即使在那时也是如此)。我自己的测试表明IE和Firefox根本不支持@page。根据现已过时的CSS2规范第13.2.2节,可以覆盖用户的方向设置和(例如)在“横向”中强制打印,但是相关的“ size”属性已从CSS2.1中删除,这与事实相符当前没有浏览器支持。它已在CSS3页面媒体模块中恢复,但请注意,这只是一个工作草案(截至2009年7月)。

结论:暂时忘记@page。如果您觉得您的文档需要横向打印,请问问自己是否可以使设计更流畅。如果确实不能这样做(例如,可能是因为文档包含具有很多列的数据表),则需要建议用户将方向设置为“横向”,并概述在最常见的浏览器中的操作方式。当然,某些浏览器具有按比例打印(按比例缩小)功能(例如Opera,Firefox,IE7),但建议不要依赖具有此功能或已打开电源的用户。


4
那是“ CSS-Discuss Wiki”,而不是“ Wikipedia”。
jball 2010年

12

尝试将其添加到您的CSS中:

@page {
  size: landscape;
}

2
这对任何浏览器都有用吗?使用IE8和Firefox3.5,它对打印预览似乎没有任何影响。
Daniel Ballinger

不幸的是,打印预览并不遵循所有CSS属性。但这应该适用于所有当前的浏览器。
gizmo

感谢您对此进行跟进。在实际打印中,这似乎也不适合我。我错过了什么吗?我的测试文件如下:(我不得不截断段落内容以适合注释框)<html> <head> <title> Landscape testing Page </ title> <style> @Page {size:landscape; } </ style> </ head> <body> <p> Lorem ipsum dolor sit amet,... </ p> </ body> </ html>
Daniel Ballinger

我已经尝试过此页面上显示的@Page规则以及其他站点中的某些规则的所有组合,以及O'Reilly的HTML / XHTML:权威指南第五版中的示例。我一直无法在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文档的链接。


与引导程序一起使用时,此声明必须存储在一个单独的.css文件中,否则,如果它是内联的,则默认的boostrap声明(size: a3)将优先。
卡拉姆


5

您还可以使用非标准的仅IE的CSS属性write-mode

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

1
这确实可以重新调整页面内容的方向,但不会真正将页面布局更改为横向。即页眉和页脚仍将被添加,就像页面是纵向的一样。
Daniel Ballinger

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度,但打印输出仍以protrait格式显示。实际上,两个世界中最糟糕的一个,至少在ie8中。
arame3333'2

1

我尝试了Denis的答案并遇到了一些问题(在使用横向页面后,纵向页面无法正确打印),所以这是我的解决方案:

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中将宽度设置为900px,将高度设置为612px。

OP没有提到A4尺寸。我在上面的数字中假设是字母大小。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.