我有一个HTML报告,由于有很多列,需要横向打印。有没有一种方法可以在不让用户更改文档设置的情况下实现?
在各种浏览器中有哪些选项可供选择。
在CSS中,您可以设置如下所示的@page属性。
@media print{@page {size: landscape}}
@page是CSS 2.1规范的一部分,但是这个size
并不像回答@Page { size:landscape}是否过时?中所强调的那样:
CSS 2.1不再指定大小属性。CSS3页面媒体模块的当前工作草案确实指定了它(但这不是标准或被接受的)。
如上所述,大小选项来自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">
我的解决方案:
<style type="text/css" media="print">
@page {
size: landscape;
}
body {
writing-mode: tb-rl;
}
</style>
media="print"
只在打印时应用。IE
、Firefox
和Chrome
中都有效。class
的 div 横向显示而不是整个页面怎么办? - SearchForKnowledgesize
属性是你需要的属性,就像之前提到的那样。如果想在打印时设置页面的方向和大小,可以使用以下代码:
@media print {
body {
size: [横向长度] [纵向长度];
orientation: [方向];
}
}
/* 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
文件中,否则如果它是内联的,则默认的Bootstrap声明(size: a3
)将优先。 - caram仅仅旋转页面内容是不够的。这里是一份适用于大多数浏览器(Chrome、Firefox、IE9+)的正确CSS。
首先将的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;
}
A4纸的尺寸为210毫米 x 297毫米。您需要从尺寸中减去打印边距。并设置页面内容的大小:
div.portrait {
width: 190mm;
height: 276mm;
}
div.landscape {
width: 276mm;
height: 190mm;
}
我使用276毫米而不是277毫米,因为不同的浏览器会稍微以不同的比例缩放页面。 因此,其中一些浏览器将把高度为277毫米的内容打印在两个页面上。 第二页将为空白。 使用276毫米更加安全。@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>
div.portrait
和div.landscape
的width
和height
。否则效果非常好! - caram尝试将以下内容添加到您的CSS中:
@page {
size: landscape;
}
@page规则从CSS2降级到了CSS2.1。据报道,只有Opera浏览器完整支持CSS2的@page规则,即使那样也存在错误。我的测试显示,IE和Firefox根本不支持@page规则。根据现已过时的CSS2规范第13.2.2节,可以覆盖用户的方向设置(例如)强制横向打印,但相关的“size”属性已从CSS2.1中删除,这与当前浏览器都不支持它的事实一致。在CSS3分页媒体模块中重新引入了此规则,但请注意,这仅是工作草案(截至2009年7月)。
结论:目前先忘记@page规则吧。如果您认为必须以横向方式打印文档,请考虑是否可以使您的设计更加流畅。如果您真的无法做到这一点(例如文档包含许多列的数据表),则需要建议用户将方向设置为横向,并可能概述如何在最常见的浏览器中进行设置。当然,一些浏览器具有适合宽度(缩小到适合)功能(例如Opera,Firefox,IE7),但不建议依赖用户拥有此功能或已开启此功能。
我尝试了丹尼斯的建议,但是遇到了一些问题(在横向页面之后,纵向页面无法正常打印),所以这里是我的解决方案:
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>
我创建了一个横向设置的空白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>