解析IE6.0打印机制(转)

打印

网页打印,可以通过浏览器的"打印"功能实现,但"打印模板"机制,却是 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>

下面我们给出 DeviceRect 引用的完全页面代码
 

<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>

  在这个页面中,共进行了两个 DeviceRect引用。作为一种规则,每一个单独的打印页面,必须有一个相对应的 DeviceRect 标记,如果有1000 个页面,那就得有 1000 个 DeviceRect标记!吓住了?别担心,后面我们会教你一个方法,让所有的 DeviceRect 标记自动完成!

  在上面的代码中,ID 是标志属性,不同的页面必须有自己不同的标识;CLASS 引用了 Style 属性;MEDIA属性则指明了本页面的最终用途是进行打印;<?IMPORT NAMESPACE="IE"IMPLEMENTATION="#default">这句话则是指输入默认的行为,它们分别是 DeviceRect,LayoutRect。

 

二.LayoutRect ,定义页面内容风格:
 

跟 DeviceRect 一样,不同的页面,要进行LayoutRect 引用时都需要添加 LayoutRect 标记,其智能添加方法将在后面介绍; LayoutRect 与DeviceRect 如果在同一个页面中同时出现,则前者需放在后者之内;另外,LayoutRect 对内容风格的设定,也通过 Style 得以实现。

例二:我们来定制如下的内容风格的打印模板

5.5 inches 宽
8 inches 高
与打印纸张边缘,四边保持 1 inch 的宽度(加上页面本身的边缘宽度,为实际的打印边缘宽度)
白色背景
1 inch 宽的虚线边界

先定制名为 contentstyle 的风格:
 

<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>
 

  跟例一中的源代码相比,例二中只是以 LayoutRect 代替了原来的DeviceRect 标记;DeviceRect定制的是模板整体风格,而 LayoutRect 定制的是具体内容的版面风格;LayoutRect的 ID 属性也具有唯一性; CONTENTSRC 属性则指明了具体的将起作用网页文件;CLASS 指明了风格的引用对象;跟DeviceRect 不同,在进行 LayoutRect引用时,必须在每个页面指定 NEXTREC ,即依次排列的下一个内容风格,这里的"下一个内容"用其页面的相应 ID 进行标识,如本例中的 LayoutRect2。
 

三.DeviceRect 与 LayoutRect 的协同作战:
 

上面我们分别讨论了 DeviceRect 与LayoutRect 的作用与引用方法,现在我们来看一下,如何在同一个打印模板中进行定制与引用。

在每一个打印模板上,必然包含两方面的内容,一个是整体的模板风格(DeviceRect),另一个是内容风格(LayoutRect);第一个打印页面跟其他页面是不同的,因为第一个页面中必须指明CONTENTSRC 属性,而同一打印任务中的其他页面不再需要进行 CONTENTSRC 的指定。
 

例三:

下面是第一个页面中的 DeviceRect 代码:
 

<IE:DEVICERECT ID="page1" CLASS="masterstyle"MEDIA="print">

时间: 2024-09-22 23:06:33

解析IE6.0打印机制(转)的相关文章

Android6.0 消息机制原理解析_Android

消息都是存放在一个消息队列中去,而消息循环线程就是围绕这个消息队列进入一个无限循环的,直到线程退出.如果队列中有消息,消息循环线程就会把它取出来,并分发给相应的Handler进行处理:如果队列中没有消息,消息循环线程就会进入空闲等待状态,等待下一个消息的到来.在编写Android应用程序时,当程序执行的任务比较繁重时,为了不阻塞UI主线程而导致ANR的发生,我们通常的做法的创建一个子线程来完成特定的任务.在创建子线程时,有两种选择,一种通过创建Thread对象来创建一个无消息循环的子线程:还有一

IE5.0、IE5.5、IE6.0、IE7.0、FF1.5、FF2.0兼容CSS Hack代码范例

css IE7.0简体中文正式版终于发布了,对于我等常和网页打交道的人来说网页兼容性问题也随之而来了.IE7.0有一个显著的改变就是支持!important了,是件好事情,但是也给广大的在IE6时代使用!important来区分处理IE和FF的网页制作者带来了不少问题,Noker也遇到了这个问题,所以翻阅网上资料,写了下面这个能够兼容现今大多数主流浏览器,覆盖绝大多数用户的Hack代码,发布在自己的论坛上,供大家查看,研究,取用.如有相关问题欢迎跟贴探讨,谢谢! 兼容浏览器版本:IE5.0,IE

WSE3.0构建Web服务安全(1) WSE3.0安全机制与实例开发

继<WCF分布式应用程序开发必备知识>系列之后,经过一周的时间,我准备了关于如何使用WSE3.0进行Web Service安全开发的文章--<WSE3.0构建Web服务安全>,写出来一起与大家分享.<WCF分布式应用程序开发必备知识系列>第4节Web服务已经涉及到Web服务安全的问题.这个系列仍是对以前技术的整理和学习的文章.我在整理的过程中也收获很多,对整个WSE3.0的安全机制有的新的认识.不管高手还是菜鸟,都希望你能从我的这个系列文章里有所收获.那么我们就来一起学

如何给IE6.0浏览器清理ie缓存?

  经常在网上见到网友提问IE浏览器如何清除缓存,小编就教大家IE6.0浏览器如何清理自己的IE缓存.记住,IE缓存一定要定期清理,这样浏览器就不会老是出现问题了,例如网页打不开,FLASH游戏加载到一半就不动了,网页错误等等情况就可以基本避免啦. 任意打开一个网页,点击网页上方的"工具"= >"Internet选项". 1.在常规页面点击删除Cookies,会自动弹出一个窗口再点击确认; 2.点击删除文件,将"删除所有脱机内容"方框中打上

c++如何解析ActionScript3.0用socket发送的图片ByteArray还原成图片?

问题描述 c++如何解析ActionScript3.0用socket发送的图片ByteArray还原成图片? ActionScript3.0用socket给c++发送了一个图片的二进制数组ByteArray,c++收到数据,但是怎么解析这个接收到的数据,从而把它还原成图片? 原谅菜鸟新人没有银子-- 解决方案 你这个问题应该是怎么把图像的二进制数组数据转换为图像来存储,试试能否直接写成某一图像格式的文件,fwrite看看 解决方案二: socket接收到数据后,存入BYTE的数组中,然后你fop

后台action返回json对象,IE6.0下面乱码

问题描述 后台ACTION返回JSON对象,中文的提示信息.FIREFOX下,能够正常显示中文信息.IE6.0下面乱码,不知道如何解决?有遇到过此类问题的朋友嘛? 问题补充:7454103 写道 解决方案 你确定 action 设置了! request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); 然后你在 debug一下! 在action 返回数

js优化针对IE6.0起作用(详细整理)_javascript技巧

js优化针对IE6.0起作用,总结一下几点: 一,字符串拼接:用数组拼接 复制代码 代码如下: function func2(){ var start = new Date().getTime(); var array = []; for(var i = 0; i < 10000; i++){ array[i] = "<input type='button' value='a'>"; } 二,for 循环:先把长度算出来直接调用 复制代码 代码如下: function

IE6.0/IE7.0/IE8.0 的CSS-HACK写法与注释

ie6.0/ie7.0/ie8.0. 为了让所写代码在各主流浏览器中正常运行,我们不得不为各种浏览器写对应的样式.本文,博主将为你总结css针对各浏览器的兼容hack(以ie6/ie7/ie8 /ff为主),以及ie特有的条件注释使用方法. 一.通用区分方式: ie系列可识别 9 ; ie6.ie7能识别*,标准浏览器(如ff)不能识别*: ie6能识别*,但不能识别 !important: ie7能识别*,也能识别 !important: ie8能识别,不能识别*,+,_,* 加!import

CSS&amp;nbsp;Hack代码范例:兼容IE5.0、IE5.5、IE6.0、IE7.0、FF1.5、

本CSS Hack代码范例,可以直观显示各个版本浏览器hack的使用.兼容IE5.0.IE5.5.IE6.0.IE7.0.FF1.5.FF2.0. IE7.0简体中文正式版发布了,对于我等常和网页打交道的人来说网页兼容性问题也随之而来了.IE7.0有一个显著的改变就是支持!important了,是件好事情,但是也给广大的在IE6时代使用!important来区分处理IE和FF的网页制作者带来了不少问题,Noker也遇到了这个问题,所以翻阅网上资料,写了下面这个能够兼容现今大多数主流浏览器,覆盖绝