1. 入门基础
PAZU 是一个ActiveX组件(NP版本是一个Plugin),本文档只讨论ActiveX版本(IE内核浏览器适用),NP版本的说明文档我们将另文发布。
PAZU 是一个已经通过微软代码认证签名的控件,用户可以在使用到这个控件的时候会自动提示安装,保证发布的便利性。
在你的WEB页里面使用<Object>标签可以引用PAZU控件,如下:
<object classid="clsid:AF33188F-6656-4549-99A6-E394F0CE4EA4"
021yin.com/4ff/sc_setup.exe”
id="pazu"
name="pazu" >
<param name="License" value="You Need a License from 4Fang"/>
</object>
说明:<object> 元素是用于嵌入ActiveX的,Flash也是通过这种方式嵌入到页面里面的。
Classid里面的字符串是指向PAZU的专属标识,是不能更改的。系统通过这个值检索并载入PAZU控件
Codebase 是指向用户可以下载到PAZU安装包的网址,如果安装包在你自己的网站上,你可以更改这个codebase属性,使得用户可以顺利下载安装PAZU控件。如果这个网址设置错误,IE将不会提示用户下载安装。
Id 属性允许你通过javascript或者vbscript使用getElementById方法,获得PAZU控件对象。
Name属性和id属性类似
按我们的免费授权约定,您不应该也不允许更改id 和 name 的值。
Param 参数,必须有一个License 的属性,value 是这个参数属性的值。它的意义是4Fang的授权许可。
您可以向4Fang申请一个免费的授权,详细的申请方法请看本文的许可授权章节,你要把你获得的授权码填入到Value值里面,PAZU才能正常工作。
注意:当你用提成免费许可申请。
2. 属性和方法
PAZU内置两个对象:TWin 和 TPrinter
PAZU这个对象结构的属性和方法如下:
PAZU
|--------- TWin 对象
| |------------ appWin 方法 隐藏IE菜单、工具条、标题栏、状态栏等
| |------------ MaxWin 方法 窗口最大化
| |------------ MinWin 方法 窗口最小化
| └----------- CloseWin 方法 关闭窗口
|--------- TPrinter 对象
| |------------ marginTop 属性 上边距
| |------------ marginBottom 属性 下边距
| |------------ marginLeft 属性 左边距
| |------------ marginRight 属性 右边距
| |------------ footer 属性 页脚
| |------------ header 属性 页眉
| |------------ orientation 属性 整型:纸张方向 1=纵向 2=横向
| |------------ paperName 属性 纸张大小名称
| |------------ printerName 属性 打印机名称
| |------------ isPrintBackground 属性 是否打印背景 true / false
| |------------ isZoomOutToFit 属性 是否缩放以适应大小打印 true / false
| |------------ printTemplate 属性 打印模板的URL
| |------------ copies 属性 打印份数
| |------------ range 属性 页面范围
| |------------ isCopyByCopy 属性 是否整份打印结束后再打印下一份 true / false
| |------------ getDefaultPrinter 方法 获得默认打印机的对象
| |------------ printToDefaultPrinter 方法 把要打印的字符串输送到默认打印机(配合getDefaultPrinter 使用)
| |------------ getPaperForms 方法 返回所有纸张格式的列表,以vbCrlf 分割
| |------------ getPrinters 方法 返回一个打印机列表,以vbCrlf 分割
| |------------ createPaper 方法 按指定的宽度和高度创建自定义纸张
| |------------ doPrint 方法 执行打印
| |------------ doPrint_ 方法 执行打印但是不进行页面参数设置
| |------------ doPreview 方法 打印预览
| |------------ doPageSetup 方法 执行页面参数的设置
| |------------ showPageSetup 方法 弹出页面设置窗口
| |------------ writeHTMLtoOfficeFile 方法 把HTML导出为Office EXCEL或者 Word格式文件
| └----------- onlyPrintElementID 属性(2012-1-2新增) 指定要打印的页面元素的ID(IFrame也可),其他元素不会被打印
|--------- appWin 方法 旧版本兼容
|---------doPrint 方法 旧版本兼容
|--------- pageSetup 方法 旧版本兼容
|--------- Fly 方法 LAPUTAC平台专用
|--------- Run 方法 LAPUTAC平台专用
└-------- AddObj 方法 LAPUTAC平台专用
版本20130423 添加一个新事件onafterpazuprint到window对象:
你可以使用以下语句来获得打印完成事件的通知
window.onafterpazuprint= function(){
//添加你自己的处理代码
特别地:
1. 此事件只在调用doPrint方法时而且isPromtUser参数为false时有效
如果弹出打印对话框则本事件不会触发.
2. 当IE在保护模式下工作(您的应用域名或者IP没有在"信任区域"里面)时, 本事件不会起作用
3. 请注意这个事件是被添加到 window 对象的, 而不是在PAZU对象中.
4. 本事件不代表物理打印过程已经完成, 仅代表需要打印的内容已经发送到操作系统的打印服务. 最终打印是否成功是无从得知,也是不可控制的(例如打印过程卡纸了或者没墨了而导致打印失败)
3. TWin对象详解
TWin 对象
|------------ appWin 方法 隐藏IE菜单、工具条、标题栏、状态栏等,有一个bool的参数: appWin(true) appWin(false)
| 两者的区别在于是否隐藏标题栏
|------------ MaxWin 方法 窗口最大化 MaxWin()
|------------ MinWin 方法 窗口最小化 MinWin()
└----------- CloseWin 方法 关闭窗口 CloseWin()
Javascript实例代码:
//1.把IE窗口变成App窗口,不隐藏标题栏
pazu.TWin.appWin(false);
//2.把IE窗口变成App窗口,隐藏标题栏
pazu.TWin.appWin(true);
//3.最大化
pazu.TWin.MaxWin();
//4.最小化
pazu.TWin.MinWin();
//5.关闭窗口
pazu.TWin.CloseWin();
DEMO和实例网页请看目录下的pazu_twin.html
4. TPrinter对象详解
DEMO和实例网页请看目录下的pazu_tprinter.html
marginTop 属性 上边距 数据类型:数字 单位: 毫米
marginBottom 属性 下边距 数据类型:数字 单位: 毫米
marginLeft 属性 左边距 数据类型:数字 单位: 毫米
marginRight 属性 右边距 数据类型:数字 单位: 毫米
例子:把上边距设置为10mm
pazu.TPrinter. marginTop=10
footer 属性 页脚 数据类型:字符串
header 属性 页眉 数据类型:字符串
例子:设置页眉
pazu.TPrinter.header=”这是新的页眉”
要取消页眉和页脚,只要赋给它们一个空字符串就行了,例如不要页眉:
pazu.TPrinter.header=””
同时页眉和页脚也支持左中右的对齐方式和自动用日期、URL、页码等的填充。这方面的信息可以参考IE这方面的相关文档
orientation 属性 纸张方向 数据类型:整数1或者2 , 1=纵向 2=横向
例子:设置纸张方向为横向
pazu.TPrinter. orientation=2
paperName 属性 纸张大小名称 数据类型:字符串
printerName 属性 打印机名称 数据类型:字符串
这两个属性我们都不要求完全匹配,可以采用左匹配的方式,举例:
假设您有两台打印机,一台是 Epson 1600K III ,一台是 HP Deskjet 300。如果你要制定打印机为 HP Deskjet 300 你有两种方式:
方式一:全匹配 pazu.TPrinter. printerName=” HP Deskjet 300”
方式二:左匹配 pazu.TPrinter. printerName=” HP”
纸张的大小也是一样的道理,例如,指定用B5纸:
pazu.TPrinter. paperName=”B5”
提示:所有纸张格式和所有打印机的列表都可以通过pazu的相应方法取得,你还可以自定义纸张的大小。请看本文相应的章节。
isPrintBackground 属性 是否打印背景 数据类型:Boolean true / false
isZoomOutToFit 属性 是否缩放以适应大小打印 数据类型:Boolean true / false
printTemplate 属性 打印模板的URL
copies 属性 打印份数 数据类型:整数,默认为1
range 属性 页面范围 数据类型:字符串
isCopyByCopy 属性 是否整份打印结束后再打印下一份 数据类型:Boolean true / false
说明:
copies属性允许你当前内容打印多份拷贝
range 你可以指定打印的页面,例如:
只打印1到5页:pazu.TPrinter.range=”1-5”
只打印1,3,5,7页:pazu.TPrinter.range=”1,3,5,7”
提示:利用range属性可以实现双面打印功能
printTemplate属性是打印模板的URL,详细的内容请参考微软的printTemplate技术的说明。
getPrinters 方法 返回一个打印机列表,返回以一个回车换行符分隔的字符串
例如:获得所有的打印机
var ps=pazu.TPrinter.getPrinters();
//获得是一个以回车换行分隔的字符串
//alert(ps);
var pa=ps.split("\r\n");
for(var i=0;i<pa.length;i++){
alert(pa[i]);
getPaperForms 方法 返回所有纸张格式的列表,返回以一个回车换行符分隔的字符串
和getPrinters类似,不同的是getPaperForms是带参数的,你可以指定获得那个打印机的纸张类别,没有参数或者参数为空字符表示获得当前默认打印机的纸张列表
例如:var ps=pazu.TPrinter.getPaperForms(“HP deskjet 300”);
getDefaultPrinter 方法 获得默认打印机的对象,返回一个Printer Object
printToDefaultPrinter 方法 把要打印的字符串输送到默认打印机(配合getDefaultPrinter 使用),参数:字符串
通过返回的对象,你可以控制该打印机,调用该打印机的EndDoc等方法,来实现直接输出内容到打印机
createPaper 方法 按指定的宽度和高度创建自定义纸张
有两个参数,paperWidth 和 paperHeight ,参数类型都是数字,单位是毫米。如果你指定的大小的纸张存在,则返回该纸张的名称,如果不存在,就先创建新的纸张格式并放回新的格式名称
例如:strDefaultPaper=pazu.TPrinter.createPaper(200,140); //创建20cm*14cm的纸张格式
alert('成功创建纸张格式:'+strDefaultPaper);
doPrint 方法 执行打印
有一个Boolean的参数,该参数表示是否要弹出打印机选择对话框
例如:不提示用户直接打印:
pazu.TPrinter.doPrint(false)
doPrint_ 方法 执行打印但是不进行页面参数设置
和doPrint类似,但是没有参数,而且执行打印前不去进行页面参数的设置,也不提示用户
doPreview 方法 打印预览 没有参数
doPageSetup 方法 执行页面参数的设置 没有参数
showPageSetup 方法 弹出页面设置窗口 没有参数
onlyPrintElementID 属性(2012-1-2新增加) 用于指定打印或者预览页面内的某个ID的元素,可以是任意元素(IFRAME也可以),除此外的页面上的其他内容将不会被打印。
如果是IFRAME,请注意:
A。请务必注意必须是用一个域内的网页,因为IE不允许跨域访问。
B。IFrame内的网页和父页面最好是同一个相对目录,如果不是同一个目录,则Iframe内的图片引用请使用绝对路径(或相对于跟目录)的引用,否则可能无法正确打印该图片
C。本属性只在');协议)本属性是无效的
D。使用完成后请最好重置本属性值为空字符,以释放资源。
5. 特殊应用
A. 打印指定的frame ,如果我们有多个iframe 或者frame ,我们想打印其中的某一个,怎么办?
方法一:在要打印的frame中嵌入PAZU,用户在打印的时候,点击该frame的打印按钮
方法二:打印前先用javascript 让要打印的frame获得焦点,再调用doPrint(false) 方法
例子:
window.frames['myifrm'].focus();
pazu.TPrinter.doPrint(false);
B.页面载入的时候立即打印或者获得打印机和纸张列表
你可以在<body>的onload事件里面完成你要的工作
C.同一个页面里面,有些内容,如某个DIV或者按钮我们不想打印出来,但是屏幕上有需要显示,怎么办?
<!-- //设置某些页面元素不打印,只要在该元素的样式类class里面添加一个p__就可以了,看myDIV的class-->
<div class="myDIVClass p__" id="myDIV">这个DIV和"打印试试"按钮都不会被打印</div>
<input class="p__" name="Button1" type="button" value="打印试试!" onclick="demo();" style="width: 301px" />
D. 连续循环打印?超多超大数据集的打印?
这种应用有两种实现方式,要具体看数据的多少。
1. 如果数据量不大(一个网页可以把所有要打印的数据显示出来,虽然网页要滚动才能显示,但是生成的HTML体积不大,而且用户不需要等待太长的时间来生成全部),如:一张出货单,需要分开多页打印出来
这种情况可以在网页要分页的地方 插入 一个css样式的分页,打印的时候就会自动分页打印了。我们的四方在线的凭证打印、账簿的打印、单据的打印都是采用这种方式。
具体实现例子如下:
<!--以下三个div会自动分成三页打印-->
<div style="page-break-after:always"> 这是第一页的内容 </div>
<div style="page-break-after:always"> 这是第二页的内容 </div>
<div style=""> 这是第三页的内容 </div>
2. 如果数据量大,或者程序设计上不能做到一个网页把所有要打印的内容都容纳进来, 例如要打印10万个客户的账单,账单的数据在服务器的数据库中
这种需求实际上是通过循环多次载入页面实现的,你可以动态载入动态页面来实现,在我们的四方在线软件里面就有一个按月打印凭证的功能,就是这样的一种应用方式。
具体实现如下:
//假设当前页面为:thispage.jsp
//利用javascript ,打印完成后自己载入下一页
//在页面中引入PAZU打印控件后,参考一下javascript
window.onload=function(){
//先对页面参数进行设置
pazu.TPrinter.header="";
//其他设置,这里省略....
//执行打印,打印的时候注意不能预览,也不能提示用户选择打印机,而是让pazu直接输出到打印机
pazu.TPrinter.doPrint(false);
//延迟一点时间,让页面重新载入下一页
setTimer("printNextPage();",1000);
function printNextPage(){
window.location.href="thispage.jsp?pageid=NextPage";
6. 保留功能
pazu.TPrinter.writeHTMLtoOfficeFile 方法 把HTML导出为Office EXCEL或者 Word格式文件
这个函数可以把页面直接“打印”为Office的EXCEL或者Word格式,该函数是PAZU为4Fang Laputac平台所用,详细的应用请参考LAPUTAC的文档
PAZU
|--------- appWin 方法 旧版本兼容
|--------- doPrint 方法 旧版本兼容
|--------- pageSetup 方法 旧版本兼容
|--------- Fly 方法 LAPUTAC平台专用
|--------- Run 方法 LAPUTAC平台专用
└-------- AddObj 方法 LAPUTAC平台专用 旧版本兼容
这些方法可以实现把程序从服务器端“漂移”到本地计算机运行,并且实现数据的本地存储和访问,也可以访问和存储远程服务器数据
7.特殊现象
021yin.com/apps/d4/Default.aspx?nodeid=4337
8. 微软PrintTemplate技术
021yin.com/apps/d4/Default.aspx?nodeid=4355
例如:
假设我们有这样的WEB打印需求:
某个WEB软件工程项目中,生成的WEB页,WEB页内容是动态生成的,内容一般会很长,一页纸肯定是打印不下的,那就必然要碰到分页打印的问题。
分页打印有两种实现方式:
1. 编程实现规范的分页,前提是我们知道应该在内容的什么地方按页分割开,这种情况适合规范的表单、报表、帐页等规范的内容。例如4Fang在线软件里面的所有单据、账簿和报表都是这样的。
这种实现方式我们在前面的文章里面已经有介绍,这里就不重复了。
2. 让浏览器自动分页,这种情况适合于大篇幅的文章等编程人员无法预知和计算应该在哪里分割开的时候。
这种情况又可以细分为以下两种情形:
2.1 没有页面页脚,或者页面页脚为无格式纯文本,这种情况很容易实现。直接指定页面页脚就可以了
2.2 页眉页脚需要插入图形或者HTML、表格等,这种情况就比较复杂一点,需要微软的PrintTemplate技术了。
021yin.com/article/tech/pazu-pt-demo.htm
021yin.com/article/tech/pt-test.htm 您可以点击查看这个网页,并查看它的源代码。