PAZU -- 4Fang WEB 打印控件
无限制免费版,完美您的WEB应用
一、概述
PAZU 是4Fang 为配合“四方在线”软件于2004年开发的WEB打印控件,适用于各种WEB软件项目的打印。
PAZU是客户端软件,使用于IE作为客户端的所有应用,与服务器端开发语言无关,即PAZU支持所有的开发语言开发的WEB应用,无论是Java还是Dot Net还是PHP 还是…都没有问题,客户端是IE就可以了。
如果你的应用的客户端不是IE,是firefox/chrome等非IE浏览器,您就需要PAZU的NP版本(NP版本我们的项目小组正在内部测试,估计在2009年10月份会推出给大家使用,敬请留意)
PAZU广泛支持IE6、IE7、IE8,支持WinXP以上操作系统,包括Windows Vista 和 Windows 7。
PAZU还支持IE内核的非IE浏览器, 如傲游、QQ浏览器、世界之窗等。
PAZU还支持使用IE浏览器编程对象自己编写的各种应用浏览器。
由于Windows Vista 以上操作系统和IE8以上版本在系统权限校验、安全性方面的巨大提升,使得目前网上公布的绝大部分WEB打印控件都不能完美支持WinVista和Win7、IE8等新一代WEB应用平台。PAZU的开发小组花费了大量的时间来使得PAZU具备最完全的兼容能力。
PAZU于2005年投入正式商用,是国内最早的WEB打印控件,被广大客户和朋友广泛应用于:电信、移动通信、银行、政府、医院、教育等各种大型应用中,这些前期付费的用户为PAZU和4Fang的发展贡献了宝贵的“粮草”,在此我们对前期付费购买PAZU许可的所有客户朋友表示最高的敬意。
2009年6月,4Fang 决定自2009年6月20日起,PAZU完全无限制免费推出,4Fang迈出的这一步这标志着4Fang的策略由一家相对技术封闭的应用软件开发公司走向技术开放的新里程。4Fang 将以:
标准、开放、易用
为新的技术指导策略,团结和凝聚更多的开发人员,为用户提供最简单实用的应用软件产品。4Fang 陆续还会开放4Fang专有WEB应用平台—LAPUTAC (一个同时支持数据在服务器、客户端存储,同时支持WEB应用模式和单独打包模式的领先应用平台,详见 http://www.4Fang.net/apps/Sheeta/ )
PAZU 的永久主站网址 http://www.4Fang.net/tech/pazu.html
PAZU 的永久下载网址 http://www.4Fang.net/4ff/sc_setup.exe
PAZU 开发包下载网址 http://www.4Fang.net/4ff/pazu.rar
PAZU的讨论和意见反馈请到4Fang的论坛 http://www.4Fang.net/BBS/
二、技术文档
1. 入门基础
PAZU 是一个ActiveX组件(NP版本是一个Plugin),本文档只讨论ActiveX版本(IE内核浏览器适用),NP版本的说明文档我们将另文发布。
PAZU 是一个已经通过微软代码认证签名的控件,用户可以在使用到这个控件的时候会自动提示安装,保证发布的便利性。
在你的WEB页里面使用<Object>标签可以引用PAZU控件,如下:
<object classid="clsid:AF33188F-6656-4549-99A6-E394F0CE4EA4"
codebase=“ http://www.4Fang.net/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才能正常工作。
注意:当你用 http://127.0.0.1/ 开头去访问你的应用的时候,或者是双击的你网页文件直接打开网页的时候,不填入许可PAZU也可以正常运作。因此如果你要测试或者体验PAZU的功能而不打算使用PAZU发布你的应用,您就不必要向4Fang提成免费许可申请。
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格式文件
|
|---------appWin 方法 旧版本兼容
|---------doPrint 方法 旧版本兼容
|--------- pageSetup 方法 旧版本兼容
|--------- Fly 方法 LAPUTAC平台专用
|--------- Run 方法 LAPUTAC平台专用
└-------- AddObj 方法 LAPUTAC平台专用
|--------- 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格式文件
|
|---------
|---------
|--------- Run 方法 LAPUTAC平台专用
└-------- AddObj 方法 LAPUTAC平台专用
3. TWin对象详解
TWin 对象
|------------ appWin 方法 隐藏IE菜单、工具条、标题栏、状态栏等,有一个bool的参数: appWin(true) appWin(false)
|------------ appWin 方法 隐藏IE菜单、工具条、标题栏、状态栏等,有一个bool的参数: appWin(true) appWin(false)
| 两者的区别在于是否隐藏标题栏
|------------ MaxWin 方法 窗口最大化 MaxWin()
|------------ MinWin 方法 窗口最小化 MinWin()
└----------- CloseWin 方法 关闭窗口 CloseWin()
|------------ 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 属性 右边距 数据类型:数字 单位: 毫米
marginBottom 属性 下边距 数据类型:数字 单位: 毫米
marginLeft 属性 左边距 数据类型:数字 单位: 毫米
marginRight 属性 右边距 数据类型:数字 单位: 毫米
例子:把上边距设置为10mm
pazu.TPrinter. marginTop=10
footer 属性 页脚 数据类型:字符串
header 属性 页眉 数据类型:字符串
header 属性 页眉 数据类型:字符串
例子:设置页眉
pazu.TPrinter.header=”这是新的页眉”
要取消页眉和页脚,只要赋给它们一个空字符串就行了,例如不要页眉:
pazu.TPrinter.header=””
同时页眉和页脚也支持左中右的对齐方式和自动用日期、URL、页码等的填充。这方面的信息可以参考IE这方面的相关文档
orientation 属性 纸张方向 数据类型:整数1或者2 , 1=纵向 2=横向
例子:设置纸张方向为横向
pazu.TPrinter. orientation=2
paperName 属性 纸张大小名称 数据类型:字符串
printerName 属性 打印机名称 数据类型:字符串
这两个属性我们都不要求完全匹配,可以采用左匹配的方式,举例:
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
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是带参数的,你可以指定获得那个打印机的纸张类别,没有参数或者参数为空字符表示获得当前默认打印机的纸张列表
和getPrinters类似,不同的是getPaperForms是带参数的,你可以指定获得那个打印机的纸张类别,没有参数或者参数为空字符表示获得当前默认打印机的纸张列表
例如:var ps=pazu.TPrinter.getPaperForms(“HP deskjet 300”);
getDefaultPrinter 方法 获得默认打印机的对象,返回一个Printer Object
printToDefaultPrinter 方法 把要打印的字符串输送到默认打印机(配合getDefaultPrinter 使用),参数:字符串
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 方法 弹出页面设置窗口 没有参数
doPageSetup 方法 执行页面参数的设置 没有参数
showPageSetup 方法 弹出页面设置窗口 没有参数
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="打印试试!" style="width: 301px" />
D. 连续循环打印?超多超大数据集的打印?
这种应用有两种实现方式,要具体看数据的多少。
1. 如果数据量不大(一个网页可以把所有要打印的数据显示出来,虽然网页要滚动才能显示,但是生成的HTML体积不大,而且用户不需要等待太长的时间来生成全部),如:一张出货单,需要分开多页打印出来
这种情况可以在网页要分页的地方 插入 一个css样式的分页,打印的时候就会自动分页打印了。我们的四方在线的凭证打印、账簿的打印、单据的打印都是采用这种方式。
具体实现例子如下:
这种应用有两种实现方式,要具体看数据的多少。
1. 如果数据量不大(一个网页可以把所有要打印的数据显示出来,虽然网页要滚动才能显示,但是生成的HTML体积不大,而且用户不需要等待太长的时间来生成全部),如:一张出货单,需要分开多页打印出来
这种情况可以在网页要分页的地方 插入 一个css样式的分页,打印的时候就会自动分页打印了。我们的四方在线的凭证打印、账簿的打印、单据的打印都是采用这种方式。
具体实现例子如下:
<!--以下三个div会自动分成三页打印-->
<div style="page-break-after:always"> 这是第一页的内容 </div>
<div style="page-break-after:always"> 这是第二页的内容 </div>
<div> 这是第三页的内容 </div>
2. 如果数据量大,或者程序设计上不能做到一个网页把所有要打印的内容都容纳进来, 例如要打印10万个客户的账单,账单的数据在服务器的数据库中
这种需求实际上是通过循环多次载入页面实现的,你可以动态载入动态页面来实现,在我们的四方在线软件里面就有一个按月打印凭证的功能,就是这样的一种应用方式。
具体实现如下:
//假设当前页面为:thispage.jsp
//利用javascript ,打印完成后自己载入下一页
//在页面中引入PAZU打印控件后,参考一下javascript
window.οnlοad=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的文档
这个函数可以把页面直接“打印”为Office的EXCEL或者Word格式,该函数是PAZU为4Fang Laputac平台所用,详细的应用请参考LAPUTAC的文档
PAZU
|--------- appWin 方法 旧版本兼容
|---------doPrint 方法 旧版本兼容
|--------- pageSetup 方法 旧版本兼容
|--------- Fly 方法 LAPUTAC平台专用
|--------- Run 方法 LAPUTAC平台专用
└--------AddObj 方法 LAPUTAC平台专用旧版本兼容
|---------
|--------- Run 方法 LAPUTAC平台专用
└--------
这些方法可以实现把程序从服务器端“漂移”到本地计算机运行,并且实现数据的本地存储和访问,也可以访问和存储远程服务器数据
7.特殊现象
8. 微软PrintTemplate技术
例如:
假设我们有这样的WEB打印需求:
某个WEB软件工程项目中,生成的WEB页,WEB页内容是动态生成的,内容一般会很长,一页纸肯定是打印不下的,那就必然要碰到分页打印的问题。
分页打印有两种实现方式:
1. 编程实现规范的分页,前提是我们知道应该在内容的什么地方按页分割开,这种情况适合规范的表单、报表、帐页等规范的内容。例如4Fang在线软件里面的所有单据、账簿和报表都是这样的。
这种实现方式我们在前面的文章里面已经有介绍,这里就不重复了。
2. 让浏览器自动分页,这种情况适合于大篇幅的文章等编程人员无法预知和计算应该在哪里分割开的时候。
这种情况又可以细分为以下两种情形:
2.1 没有页面页脚,或者页面页脚为无格式纯文本,这种情况很容易实现。直接指定页面页脚就可以了
2.2 页眉页脚需要插入图形或者HTML、表格等,这种情况就比较复杂一点,需要微软的PrintTemplate技术了。
这种情形的应用例程请点这里: www.4fang.net/article/tech/pazu-pt-demo.htm应用例程的打印模板文件(printTemplate URL)为: 您可以点击查看这个网页,并查看它的源代码。
某个WEB软件工程项目中,生成的WEB页,WEB页内容是动态生成的,内容一般会很长,一页纸肯定是打印不下的,那就必然要碰到分页打印的问题。
分页打印有两种实现方式:
1. 编程实现规范的分页,前提是我们知道应该在内容的什么地方按页分割开,这种情况适合规范的表单、报表、帐页等规范的内容。例如4Fang在线软件里面的所有单据、账簿和报表都是这样的。
这种实现方式我们在前面的文章里面已经有介绍,这里就不重复了。
2. 让浏览器自动分页,这种情况适合于大篇幅的文章等编程人员无法预知和计算应该在哪里分割开的时候。
这种情况又可以细分为以下两种情形:
2.1 没有页面页脚,或者页面页脚为无格式纯文本,这种情况很容易实现。直接指定页面页脚就可以了
2.2 页眉页脚需要插入图形或者HTML、表格等,这种情况就比较复杂一点,需要微软的PrintTemplate技术了。
这种情形的应用例程请点这里: www.4fang.net/article/tech/pazu-pt-demo.htm应用例程的打印模板文件(printTemplate URL)为: 您可以点击查看这个网页,并查看它的源代码。
三、许可授权
PAZU自2009年6月起采用免费的许可,免费许可码申请页面:
访问该网址,提供相应的资料,4Fang会发送许可号码给您。
注意:
1.我们不许可您更改PAZU的名称,在页面引用PAZU时候,也应该使用pazu这个id
2.我们不许可您把控件或者安装包等已经签名的文件进行重新签名,或者去除签名,否则,我们均视为侵权行为。
如果你要重新签名,您需要购买PAZU授权。
PAZU的打印控制部分的源代码4Fang公司也是可以出售的。这方面的需要请联系4Fang
四、技术支持
PAZU并非4Fang的主营产品,只是作为4Fang在线软件平台的一个附属产品,因此PAZU更多的会为四方在线平台的应用进行考虑。当然,4Fang会持续升级PAZU组件,由于操作系统补丁升级或者浏览器的补丁或者版本升级可能会导致PAZU某些功能不正常,4Fang会适时地更新,但不作任何明示或者暗示的保证。
欢迎大家访问4Fang的论坛,我们将会在4Fang论坛开辟一个专门的板块,供大家提问和交流,并反馈相关问题。技术支持我们一般只在论坛里面发布和回复,由于工作安排和时间关系,我们不能为每一个单独的用户或者开发者提供一对一的服务(免费前已付费的在服务期内的用户除外)
五、致谢
对2009年6月前付费购买PAZU的用户单位表示最高的敬意,你们的支持为PAZU的发展提供了强大动力。
我们将一如既往的为您提供优质的产品和服务。
对PAZU工作组的同事表示感谢,感谢他们多年来的辛勤劳动。
转载于:https://blog.51cto.com/2412152/433192