网页打印,可以通过浏览器的"打印"功能实现,但"打印模板"机制,却是 IE 5.5 /6.0 以及 Netscape 6.0 所独有的;准确一点, IE 5.5 只是一个机制雏形,在 IE 6.0 中才得以完全体现。IE 6.0 的打印功能模块,在精确控制页面边界,文本间隔,以及打印的统一性上,功能更为完备。
通过创建打印模板,你可以精确控制:
网页打印及预览时的页面风格与内容编排风格;
打印属性,如自动为打印的页面添加卷标或编号;
精确控制打印预览界面的各个元素与变量。
通过打印模板,你可以:
自动为所有打印页面添加固定内容,如公司标识,版权申明,或者指定广告;
自定义页面标头与尾注等元素,比如页码或卷标;
指定打印历史与任务;
书本化奇偶分页映射打印......
打印模板机制是建立在动态 HTML 语言基础上的,涉及到主要两个行为:DeviceRect, LayoutRect ,下面我们就这两个行为深入地探讨 IE 6.0 的打印机制。
另外需要说明的是,DHTML (动态超文本标识语言)的行为跟其他语言的"行为"一样,都是一种应用编程接口,初始状态下有自己的默认属性,在一定的事件下,由用户决定调用其承认的功能模块,从而产生相对应的"行为"。而且,"行为"可以自己编写,不过得以".htc"为其扩展名以供调用。
一.DeviceRect ,定义打印总体风格:
打印总体风格,包括为打印页面添加如公司标识的固定内容(网页上不一定有,只体现在打印纸张上或预览页面上,后同);打印页面的颜色风格;打印页面的边缘属性或图案;等等。
在进行 DeviceRect 引用前,先得确定页面风格,方法是用<Style>进行设置。
例一:我们来定制如下的打印模板
8.5 inch 宽
11 inch 高
黄色背景
1 pixel 宽的黑色实心左边界
1 pixel 宽的黑色实心上边界
4 pixels 宽的黑色实心右边界
4 pixels 宽的黑色实心下边界
所有边界与纸张边缘为 10 pixels 的距离
现在我们用 Style 进行设定,假设这个 Style 名为 Mystyle1:
<STYLE TYPE="text/css"> .Mystyle1 { width:8.5in; height:11in; background:#FFFF99; border-left:1 solid black; border-top:1 solid black; border-right:4 solid black; border-bottom:4 solid black; margin:10px; } </STYLE> |
<HTML XMLNS:IE> <HEAD> <?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default"> <STYLE TYPE="text/css"> .Mystyle1 { width:8.5in; height:11in; background:#FFFF99; border-left:1 solid black; border-top:1 solid black; border-right:4 solid black; border-bottom:4 solid black; margin:10px; } </STYLE> </HEAD> <BODY> <IE:DEVICERECT ID="page1" CLASS="Mystyle1" MEDIA="print"> </IE:DEVICERECT> <IE:DEVICERECT ID="page2" CLASS="Mystyle1" MEDIA="print"> </IE:DEVICERECT> </BODY> </HTML> |
<STYLE TYPE="text/css"> .contentstyle { width:5.5in; height:8in; margin:1in; background:white; border:1 dashed gray; } </STYLE> |
<HTML> <HEAD> <?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default"> <STYLE TYPE="text/css"> .contentstyle { width:5.5in; height:8in; margin:1in; background:white; border:1 dashed gray; } </STYLE> </HEAD> <BODY> <IE:LAYOUTRECT ID="layoutrect1" CONTENTSRC="2.html" CLASS="contentstyle" NEXTRECT="layoutrect2"/> <IE:LAYOUTRECT ID="layoutrect2" CLASS="contentstyle"/> </BODY> </HTML> |
<IE:DEVICERECT ID="page1" CLASS="masterstyle" MEDIA="print"> <IE:LAYOUTRECT ID="layoutrect1" CONTENTSRC="2.html" CLASS="contentstyle" NEXTRECT="layoutrect2"/> </IE:DEVICERECT> 下面是其他页面中的 DeviceRect 代码: <IE:DEVICERECT ID="page2" CLASS="masterstyle" MEDIA="print"> <IE:LAYOUTRECT ID="layoutrect2" CLASS="contentstyle"/> </IE:DEVICERECT> |
<HTML XMLNS:IE> <HEAD> <?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default"> <STYLE TYPE="text/css"> .contentstyle { width:5.5in; height:8in; margin:1in; background:white; border:1 dashed gray; } .Mystyle1 { width:8.5in; height:11in; background:#FFFF99; border-left:1 solid black; border-top:1 solid black; border-right:4 solid black; border-bottom:4 solid black; margin:10px; } </STYLE> </HEAD> <BODY> <IE:DEVICERECT ID="page1" CLASS="Mystyle1" MEDIA="print"> <IE:LAYOUTRECT ID="layoutrect1" CONTENTSRC="2.html" CLASS="contentstyle" NEXTRECT="layoutrect2"/> </IE:DEVICERECT> <IE:DEVICERECT ID="page2" CLASS="Mystyle1" MEDIA="print"> <IE:LAYOUTRECT ID="layoutrect2" CLASS="contentstyle"/> </IE:DEVICERECT> </BODY> </HTML> |
function addFirstPage() { newHTML = "<IE:DEVICERECT ID='devicerect1' MEDIA='print' CLASS='mystyle1'>"; newHTML += "<IE:LAYOUTRECT ID='layoutrect1' CONTENTSRC='2.html'" + "ONLAYOUTCOMPLETE='onPageComplete()' NEXTRECT='layoutrect2'" + "CLASS='contentstyle'/>"; newHTML += "</IE:DEVICERECT>"; devicecontainer.insertAdjacentHTML("afterBegin", newHTML); } |
function onPageComplete() { if (event.contentOverflow) { newHTML = "<IE:DEVICERECT ID='devicerect" + (lastPage + 1) + "' MEDIA='print' CLASS='mystyle1'>"; newHTML += "<IE:LAYOUTRECT ID='layoutrect" + (lastPage + 1) + "' ONLAYOUTCOMPLETE='onPageComplete()' NEXTRECT='layoutrect" + (lastPage + 2) + "' CLASS='contentstyle'/>"; newHTML += "</IE:DEVICERECT>"; devicecontainer.insertAdjacentHTML("beforeEnd", newHTML); lastPage++; } |
……