我有一个 HTML 报告,由于列多,需要横向打印。有没有办法做到这一点,而用户不必更改文档设置?
浏览器中有哪些选项。
在您的 CSS 中,您可以设置 @page 属性,如下所示。
@media print{@page {size: landscape}}
@page 是CSS 2.1 规范的一部分,但这size
并没有像问题的答案所强调的那样@Page { size:landscape} 已过时?:
CSS 2.1 不再指定 size 属性。CSS3 Paged Media 模块的当前工作草案确实指定了它(但这不是标准或被接受的)。
如前所述,尺寸选项来自CSS 3 Draft Specification。理论上,它可以设置为页面大小和方向,尽管在我的示例中省略了大小。
该支持与在 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 并允许用户打开并打印的原因。
我的解决方案:
<style type="text/css" media="print">
@page {
size: landscape;
}
body {
writing-mode: tb-rl;
}
</style>
media="print"
仅适用于打印。IE
,Firefox
和Chrome
如前所述,该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 文档的链接。
仅仅旋转页面内容是不够的。这是适用于大多数浏览器(Chrome、Firefox、IE9+)的正确 CSS。
首先将 body 设置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 毫米高的内容。第二页将为空。使用276mm更安全。
我们不需要任何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>
@page 规则的范围已从 CSS2 缩减到 CSS2.1。据报道,完整的 CSS2 @page 规则仅在 Opera 中实现(即使在那时也是错误的)。我自己的测试表明 IE 和 Firefox 根本不支持 @page。根据现已过时的 CSS2 规范第 13.2.2 节,可以覆盖用户的方向设置和(例如)在横向中强制打印,但相关的“大小”属性已从 CSS2.1 中删除,与事实一致当前没有浏览器支持它。它已在 CSS3 Paged Media 模块中恢复,但请注意,这只是一个工作草案(截至 2009 年 7 月)。
结论:暂时忘记@page。如果您觉得您的文档需要横向打印,问问自己是否可以让您的设计更加流畅。如果您真的不能(例如,可能因为文档包含具有许多列的数据表),您将需要建议用户将方向设置为横向,并可能概述如何在最常见的浏览器中执行此操作。当然,一些浏览器具有打印适合宽度(shrink-to-fit)功能(例如 Opera、Firefox、IE7),但不建议依赖拥有此功能或将其打开的用户。
尝试将此添加到您的 CSS:
@page {
size: landscape;
}
您也许可以使用CSS 2 @page 规则,该规则允许您将'size' 属性设置为 Landscape。
您还可以使用非标准的 IE-only css 属性writing-mode
div.page {
writing-mode: tb-rl;
}
我创建了一个带有横向设置的空白 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 上测试。
我尝试了丹尼斯的回答并遇到了一些问题(在横向页面之后没有正确打印纵向页面),所以这是我的解决方案:
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>
这就是我想出的 - 为<html>
元素添加负旋转和相等 abs 值的正旋转<body>
。这样就不必添加大量的 CSS 来设置正文样式,而且它的作用就像一个魅力:
html {
transform: rotate(-90deg);
}
body {
transform: rotate(90deg);
}
我曾经试图解决这个问题,但我所有的研究都把我引向了 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 标签中添加 table 标签并在最后关闭 div 标签。
此表格将仅以横向模式打印,所有其他页面将仅以纵向模式打印。但问题是如果表格大小超过页面宽度,那么我们可能会丢失一些行,有时还会丢失标题。当心。
祝你有美好的一天。
谢谢你,纳文·梅塔帕利。
-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) { … }
我遇到的问题可能和你一样。这里的每个人都使用 CSS 来静态提供它,但我不得不寻找一个动态的解决方案,以便它可以根据活动元素进行更改,而无需重新加载页面..
我创建了 2 个文件,portrait.css 和 Landscape.css。
Portrait.css 是空白的,但 Landscape.css 有一行。
@media print{@page {size: landscape}}
在我的主文件中,我添加了这行 html 以将 Portrait.css 指定为默认值。
<link rel="stylesheet" id="PRINTLAYOUT" href="portrait.css" type="text/css" /></link>
现在,要切换,您只需更改元素中的 href 即可切换打印模式。
$("#PRINTLAYOUT").attr("href","landscape.css")
// OR
document.getElementById("PRINTLAYOUT").href = "landscape.css" // I think...
这对我很有用,我希望它可以帮助其他像我一样艰难地做事的人。请注意,$ 代表 JQuery。如果您还没有使用它,我强烈建议您现在开始。
您可以尝试以下方法:
@page {
size: auto
}