jatoolsPrinter 使用手册
(更新日期:2011-10-08)




jatoolsPrinter 是一款实现网页套打的专门工具。作为web应用开发者,我们经常会遇到在浏览器中打印报表、票据的需求,浏览器本身
提供的打印功能一般不能满足这些需求,如精确分页,套打等。jatoolsPrinter正是为了解决这些需求而专门研发的。
使用jatoolsPrinter可以最大限度地实现对web页面的打印控制,比如,输出到哪个打印机,什么纸张类型,是否打印附件等。设置图文并茂的页眉、页脚,自动分页或程序分页。你也可以利用jatoolsPrinter随心所欲地定制出自己的打印设置界面,更好地满足项目需求。
jatoolsPrinter不同于报表工具,它只解决web客户端的html页面的打印问题,至于这些页面如何生成,格式怎样需要你自己做后端的开发(使用jsp,asp,或php等)
,因此,你可以有很大的自由度来定制格式。jatoolsPrinter也没有可视化的票据或报表设计工具,而一般报表工具都有可视化的报表设计器。jatoolsPrinter只需要在web服务器的一个目录中,放置一个控件文件即算配置完成,而报表工具一般在服务端需要配置报表服务引擎。
jatoolsPrinter是本公司报表产品杰表的一个组件,2006年起单独发展成品。如果你需要可视化的套打设计工具、各种格式(Excel,pdf)导出、表格无折断分页等更为强大的功能,建议你采用本公司的报表产品,杰表.2008。
服务端:可以是任何操作系统,任何web服务器,比如iis、tomcat、weblogic、websphere等。
客户端:windows操作系统(除win95/98外),Internet Explorer5.5及以上版本。
1. 服务端
先来看一个示例网页 test.htm
<html> ... <OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D075-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,7,0,0"></OBJECT> ... </html>
如果你访问该网页的地址是:
http://www.abc.com/print/test.htm
则你必须将 jatoolsPrinter.cab放在 http://www.abc.com/print/jatoolsPrinter.cab 可以访问到的地方。总之,jatoolsPrinter.cab位置,需要根据当前网页路径与codebase属性,来确定。请体会以下示例:
例一、
网页地址: http://www.abc.com/print/test.htm
codebase属性: xyz/jatoolsPrinter.cab#version=5,7,0,0
jatoolsPrinter.cab地址: http://www.abc.com/print/xyz/jatoolsPrinter.cab
例二、
网页地址: http://www.abc.com/print/test.jsp
codebase属性: /jatoolsPrinter.cab#version=5,7,0,0
jatoolsPrinter.cab地址: http://www.abc.com/jatoolsPrinter.cab
2. 浏览器端
当你访问使用打印控件的网页时,浏览器将从服务器上下载控件,自动安装到ie中。
当然,如果你的IE安全设置过高,也可能不能自动安装,这时,你需要改变IE的安全设置,或进行离线安装。如果你需要离线安装,可以向我们申请离线安装包。
IE安全设置方法如下:
IE 浏览器->工具-> internet 选项->安全->自定义级别,设置下载未签名的 ActiveX为启用状态。如下图所示:
注:jatoolsPrinter 4.0以后的版本,都经过微软认证的签名,因此,多数情况下无须设置IE安全属性。
我们先来设计一个web页面,如下所示:
<html>在这个文档中,有两个div对象,假设每个div中包括一张要打印的发票,现在要求是把这两张发票打印出来,而且,一张发票占据一页,如果你使用ie自带的打印菜单来打印,有可能只打印一页,有可能打印超过两页,有可能发票打印到一半时就分页,总之,如何分页取决于打印纸张的大小,及发票的大小,你不能控制页数及分页位置。那么,jatoolsPrinter是如何处理这样的需求的呢?
<head>
<title>我的第一个打印文档</title>
</head>
<body bgcolor="#e0e0e0">
<div id='page1' style='background:#ffffff;margin:10;width:270;height:450;float:left'>发票1 金额:80</div>
<div id='page2' style='background:#ffffff;margin:10;width:270;height:450;float:left'>发票2 金额:100</div>
</body>
</html>
首先,我们在页面中插入这个控件,如下所示。
<html>其次,调用控件的 print 方法实现打印,如下所示:
<head> <title>我的第一个打印文档</title>
<!-- 插入打印控件 --> <OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D075-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,7,0,0"></OBJECT>
</head>
<body bgcolor="#e0e0e0">
<div id='page1' style='background:#ffffff;margin:10;width:270;height:450;float:left'>发票1 金额:80</div>
<div id='page2' style='background:#ffffff;margin:10;width:270;height:450;float:left'>发票2 金额:100</div>
</body>
</html>
function doPrint()
{
myDoc = {
documents:document; // 要打印的div 对象在本文档中,控件将从本文档中的 id 为 'page1' 的div对象,作为首页打印
// id 为 'page2' 的作为第二页打印
};
jatoolsPrinter.print(myDoc,false); // 直接打印,不弹出打印机设置对话框
}
由上可见,你打印若干 div对象时,需要告诉控件,这些div们所属的文档对象(html的document对象),另外,这些div对象的id,也需要按 ‘page+序号‘ 的规则命名,序号从1开始计,也就是说,id为'page1'的div对象,总是作为首页打印。这些设置使用一个javascript对象来描述,也就是上面的myDoc对象,下面是完整的html代码:
<html>运行示例
<head>
<title>我的第一个打印文档</title>
<!-- 插入打印控件 --> <OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D075-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,7,0,0"></OBJECT>
<script> function doPrint() {
myDoc = { documents:document, // 要打印的div 对象在本文档中,控件将从本文档中的 id 为 'page1' 的div对象,作为首页打印
// id 为 'page2' 的作为第二页打印
copyrights:'杰创软件拥有版权 www.jatools.com' // 版权声明,必须
};
jatoolsPrinter.print(myDoc,false); // 直接打印,不弹出打印机设置对话框 }
</script>
</head>
<body bgcolor="#e0e0e0">
<div id='page1' style='background:#ffffff;margin:10;width:270;height:450;float:left'>发票1 金额:80</div>
<div id='page2' style='background:#ffffff;margin:10;width:270;height:450;float:left'>发票1 金额:100</div>
<input type="button" value="打印" onClick=' doPrint()'>
</body>
</html>
//打印文档对象
var myDoc ={
documents: document, // 打印页面(div)们在本文档中
copyrights : '杰创软件拥有版权 www.jatools.com' // 版权声明必须
};
...
jatoolsPrinter.print(myDoc,false);
//打印文档对象
var myDoc ={
settings:{
// 如果想使用默认打印机,不需要设置
// printer: '联想激打',
// 指定纸张的高宽以十分之一毫米为单位,本设置实际是指定为a4大小
paperWidth : 2100,
paperHeight : 2970,
// 指定打打印方向为横向, 1/2 = 纵向/横向
orientation : 2 },
documents: document, // 打印页面(div)们在本文档中
copyrights : '杰创软件拥有版权 www.jatools.com' // 版权声明必须
};
//打印文档对象
var myDoc ={
//待保留的打印设置id,打印后将被保存在注册表中,
//下一次启动相同值的settingsID,打印文档时,
//控件将用保留的参数,自动设置打印机
settingsID:"mysettings1",
documents: document,
copyrights : '杰创软件拥有版权 www.jatools.com'
};
为什么需要保存设置功能?
保存设置功能,通常用在以下两种情况:
(1)一个套打系统,由于各客户端打印机不同,或者进纸盒的位置不同,或者其他原因,可能引起打印出来的票据位置发生偏移,用户希望能根据自己打印机的状况,自行调整边距以纠正位置,但不希望每次打印前,都进行一次手工调整。
(2)一个客户端配置了多台打印机,分别用于打印不同类型的文档,用户不希望每次打印一个文档前,选择一次打印机;
对于第一种情况,你可以这样解决:
1. 页面中设置两个按钮,一个"直接打印",一个"打印预览";
2. 当客户发现位置有偏移时,可以点击"打印预览"按钮,调整左、上边距,并打印这个页面;
3. 如果发现位置还不理想,则重复第2步,如果正确,则下一次打印这个票据时,只需点击"直接打印"即可保证位置正确。
对于第二种多种打印机的情况,你可以这样解决:
1. 页面中设置两个按钮,一个"直接打印",一个"打印预览";
2. 第一次打印时,可以点击"打印预览"按钮,选择你想要的打印机进行打印;
3. 则下一次打印这个票据时,只需点击"直接打印"即可保证输出到正确的打印机。
提一点建议:因为"打印预览"按钮不常用,最好不要跟"直接打印"按钮并排放在一起,以避免干扰。
保存设置参数的工作原理是怎样的?
控件是如何保留设置参数的,有些用户感觉困惑,下面介绍一下保留与加载打印参数的工作原理。
保存设置参数原理:
1. 客户打印一个文档到打印机后;
2. 控件触发打印完成事件;
3. 控件响应打印完成事件,查询本次打印是否有myDoc.settingsID属性,如果有,则保存本次打印的配置参数到注册表(如果注册表中存在该id设置,则替换以前设置)。
所以,保存打印参数的前提是:已经输出到打印机,并且设置了myDoc.settingsID。
有些用户,只在控件的预览窗口中设置了边距等,而不实际打印,这样,控件是不会保留你的设置的。
加载打印参数原理:
1. 客户在预览或打印前,控件查询是否有 myDoc.settingsID属性;
2. 如果有myDoc.settingsID属性,控件尝试从注册表中读入该id相关的配置参数,如果存在,则用该配置参数来设置打印机(即忽略myDoc.settings里的设置),转第4步;
3. 根据用户的myDoc.settings里的设置,设置打印参数;
4. 根据设置,启动打印或打印预览。
//打印文档对象
var myDoc ={
settings:{ // 当前设置
// printer: '联想激打',
paperWidth : 2100,
paperHeight : 2970,
orientation : 2
},
//第一次打印时,注册表中没有‘mysettings2’的打印参数
//所以使用上面指定的参数
//打印后,控件自动将最后一次打印设置保存
//后续打印时将用注册表中的设置,来自动配置打印机
//上述的settings将被忽略
settingsID : "mysettings2",
documents: document,
copyrights : '杰创软件拥有版权 www.jatools.com'
};
注意,批量打印时,而且打印文档数超过一个,只能进行无提示的直接打印操作。
//打印文档对象
var myDoc ={
//批量打印时,需要用数组来指定打印文档
//文档页可以在一个document对象中,也可以在url指定的一个文档中
documents: new Array(
document, // 打印页面(div)们在正显示在本文档中
'attache1.htm', // 打印页面(div)们在一个url指定的文档中
'attache2.htm'
)
copyrights : '杰创软件拥有版权 www.jatools.com' // 版权声明必须
};
//打印文档对象
var myDoc ={
documents: document,
// 在同一页面中,有多个可打印文档,他们可以用
// pagePrefix 属性来区别
// pagePrefix属性 +page+页序号 构成可打印div的id,
// 如前缀为 'report1' ,则找到以 'report1page1'为id的
// div作为文档首页
// 该属性,默认值为空
pagePrefix: whichreport.value, // 本例中,可能是 'report1'或'report2'
copyrights : '杰创软件拥有版权 www.jatools.com'
};
//打印文档对象
var myDoc ={
//文档页可以在url指定的一个文档中,用数组指定打印文档
documents: new Array('basic.htm'),
copyrights : '杰创软件拥有版权 www.jatools.com' // 版权声明必须
};
<style>
... .only_for_print {display:none} ... </style>
... //左面是两个隐藏的页 <div id=page1 class='only_for_print' ...
<div id=page2 class='only_for_print' ...
... 打印印文档对象 var myDoc ={ ... // 打印时,only_for_print取值为显示 classesReplacedWhenPrint: new Array('.only_for_print{display:block}'), ... };
//打印文档对象
var myDoc ={
enableScreenOnlyClass:true // 为了使screen-only起作用,必须设置 enableScreenOnlyClass为true
经此设置,引用screen-only样式类的对象,只在显示或预览时可见,打印时不可见.
};
...
<img class='screen-only' src='background.jpg' alt='本图片只在预览中可见'>
<div class='screen-only title' > 本层中的内容只在打印预览时可见 </div>
...
假设有这样的需求,套打票据是一个表格,且表格线已经印在上面。但你不想将票据底图按上一节所说,设置在打印页面上,而是输出打印页面时,也同时设置表格线,仅在打印时,让控件自动隐去表格线。
如何做到?方法是利用打印样式类自动插入功能,该功能在控件打印时,会自动在页面的父对象中,插入一个jatools-printing样式类,类似这样:
<div class='jatools-printing'><div id=page1>...</div></div>有了这个自动插入的样式类,以上不打印表格线的需求,就可以很方便实现了,方法如下:
<table id='sample'><tr><td>...</table>2. 为使打印页面在显示和打印预览时,显示表格线,需要加上边框样式,类似这样:
<style>
#sample td {border:solid 1px solid}
</style>
3. 为使打印时表格线不可见,增加以下粗线部分,即可:
<style>>
#sample td {border:solid 1px black}
.jatools-printing #sample td{border:none;}
</style>
原理是,当控件打印时,sample表格有一个带样式类 .jatools-printing 的祖先对象,因此,上一行有表格线的样式会被下一行没表格线的样式所覆盖,也就是打印时,不显示表格线了。
实际上,也许你已经体会到,通过本功用可以精细控制打印对象在预览时和打印时的不同样式,不仅仅是本例中的对表格线的控制。
<style>
#sample td {border:solid 1px black}
.jatools-printing #sample td{border:none;}
</style>
<table id='sample'><tr><td>...</table>
function doPrint()
{
myDoc = {...
documents: document,
importedStyle:['a.css'], // 可同时引入多个css,可以是相对路径,也可以是绝对路径
};
jatoolsPrinter.print(myDoc,false);
}
...
function doPrint()
{
myDoc = {...
documents: document,
};
myDoc.done=function(err){
if(!err)
myform.submit(); // 提交表单
else
alert(err);
}
jatoolsPrinter.print(myDoc,false); // 直接打印,不弹出打印机设置对话框
}
...
你可以在打印结束时,让控件自动调用一个脚本方法,回调方法必须通过打印对象的done属性来指定。在打印结束后,你可以通过该方法的err参数,来判断打印是否成功,err为空,则打印成功,非空在打印失败,err表示错误信息。
不使用回调方法,按下面的代码运行可以吗?回答是不可以!
下面的代码错误。
function doPrint()
{
myDoc = {...
documents: document,
};
jatoolsPrinter.print(myDoc,false); // 直接打印,不弹出打印机设置对话框
myform.submit(); // 极端错误
}
...
因为不管三七二十一,就提交了表单,提交后,当前窗口的document就会被新的文档替换,而打印控件对原文档还没有打印完,这时就会经常出现如下错误信息。



var myDoc={
settings:{
paperWidth:1200, // 以1/10毫米为单位
paperHeight:1000
},
settingsID:’mydoc1’ // 必须设置一个唯一id号
...
}
3. 当发现有连续偏移时,只要调用控件的 setupNormalOffset()方法,设置相应的校正参数即可,如下所示:jatoolsPrinter. setupNormalOffset(‘mydoc1’); // 唯一参数,标识对哪一个打印任务进行校正设定。此方法将使控件弹出如下对话框:

你打印了多少张:表示你用来测试的页数,测试页数越多,误差越大,校正效果越好。
共偏移了多少毫米(向上偏移为负):表示你经过上一参数连续打印后,第一页与最后一页的偏移距离,以毫米为单位,当向下偏移时,设置为正,反之为负,也可以设置一个小数位。
每隔几张插入一个校正页:表示校正页的插入频度。此参数建议在5~15之间为好。
清除:可能换了好的打印机,不需要校正了,那就采用此按钮,清除校正设置。
确定:设置完了,保存。
取消:即不保存,也不清除,退出。
如果你设置了校正参数,按确定以后,控件将在本地注册表中保存这些参数,当下一次myDoc.settingsID为 ”mydoc1” 的打印任务启动时,控件将按这些参数自动插入校正页。
另外,你需要
注意:
1. 因为校正参数是按settingsID来保存的,所以不会干扰到其他打印任务。
2. 因为校正参数是保存在用户的本地注册表中,所以某一个用户的校正设置,不会影响到其他用户的。
下面是打印与校正设置的部分代码:
运行此示例
function doPrint()行文至此,这个方案还是有点不够完美,因为,代码中出现两个按钮,一个是打印,一个是偏移校正,这个偏移校正按钮,对于大多数不存在偏移问题的用户来说,可能永远用不上,即使有少数用户存在偏移问题,也只需要设置一次,就可以了。这个按钮有点多余,我们来改造一下上面的代码,如下:
{
var myDoc ={
settings:{ paperWidth:1200, paperHeight:1000 },
settingsID:'mydoc1',
documents: document, copyrights : '杰创软件拥有版权 www.jatools.com'
}
jatoolsPrinter.print(myDoc,false); // 直接打印
}
function function doNormalOffset()
{
jatoolsPrinter.setupNormalOffset('mydoc1'); // 设置校正参数
} ... <intput type=’button’ value=’打印’ onclick=’doPrint()’>
<intput type=’button’ value=’偏移校正设置’ onclick=’ doNormalOffset ()’> ...
function doPrint()上述代码,删除了用于校正的按钮,但doPrint代码里,加入了是否按下shift键的判断,如果用户在按下打印按钮的同时,也按了shift,则调用控件的校正设定方法,否则,就以正常打印处理。 这样,作为程序开发人员,只需要当用户发现有连续偏移时,才告诉他使用这个方法,来校正偏差。
{
if(window.event.shiftKey)
{
jatoolsPrinter.setupNormalOffset('mydoc1'); // 设置校正参数
}else
{
var myDoc ={
settings:{
paperWidth:1200, paperHeight:1000
},
settingsID:'mydoc1',
documents: document, // 打印页面(div)们在本文档中
copyrights : '杰创软件拥有版权 www.jatools.com' // 版权声明必须
};
jatoolsPrinter.print(myDoc,false); // 直接打印
}
}
... <intput type=’button’ value=’打印’ onclick=’doPrint()’>
...
<%
String styles = (String) application.getAttribute("globalcheque");
if (styles == null) {
styles = "";
}
%>
<style>
<%=styles%> // 保存到服务端的位置信息,成为style的一部分,从而影响到后面的html元素.
.f1{left:533;top:422}
.f2{left:124;top:146}
...
function doPrint() {
myDoc = {
settings: {
paperWidth: 2500,
paperHeight: 1800,
orientation: 2
},
documents: document,
dragDesigner: {
viewSource: false,
ok: function (sid,styles) { //在拖放设计完毕后点击确定按钮会调用此函数,获取到sid和style的信息
/* styles={f1:'top:200;left:200',
f2:'top:100;left:300'
}
转换成:
div#f1{top:200;left:200}
div#f2{top:100;left:300};*/
var newstyles = ''; //style的信息返回的格式入注释中的形式,这个时候我们就对style的内容进行处理,
for(var a in styles) //转换成div#f1{top:200;left:200}这样的形式
{
newstyles +='div#'+a+'{'+styles[a]+'}\n';
}
$.ajax({
url: 'http://localhost:8080/jatools/globalstyles.jsp',//将拖放的信息提交到后进行保存。
type: 'POST',
data: {
sid:sid,
styles: newstyles //将sid和style的信息提交到后台
},
error: function () {
alert('保存出错!');
},
success: function () {
alert("调整后的位置,已经保存到服务端!");
}
});
}
},
settingsID: 'globalcheque',
copyrights: "杰创软件拥有版权 www.jatools.com"
}
jatoolsPrinter.printPreview(myDoc);
}
globalstyles.jsp
本文件,仅仅响应客户端位置信息的ajax递交,并将它缓存在全局session中以备remotelayout.htm取用。你可以根据需要,保存在其他机制中,比如,数据库,或本地文件等。
<%
String sid = request.getParameter("sid");
String styles = request.getParameter("styles");
application.setAttribute(sid,styles);
%>


myDoc = {...
...
};
...
//autoBreakTable='break-table'需要自动折页的表格 id
<div id=page1 autoBreakTable='break-table' >
<h1 class='first-only'> 工资表 </h1> // 所有只想在第一页中出现的对象,需要设置class属性为 first-only ,否则每页都显示
<table headerRows='1' id='break-table'> ... </table> //headerRows='1' 表格标题行数, 标题行将在每个页面中出现
</div>
如果一个page div内,有多个大大小小的表格,那么每一个表格都有可能被分页,这时,那你只需要在该page div的autoBreakTable属性设置为'*'即可,如下所示:
<div id='page1' autoBreakTable='*' > <table> ...</table> <table> ...</table> <table headerRows='1'> ...</table> // 该表格如果被分页,第一行作为表头,重复显示 <table> ...</table> ... <div>
如果需要打印一个有很多列的表格,因为纸张宽度有限,后面的列可能打印不出来,怎么办?一开始,我们建议用户使用控件的自动缩放打印功能,但用户的问题是,当表格很宽时,这样缩小后的页面,打印出来的字就太小,甚至可能无法辨认。本功能专门解决此类需求。
需要打印的宽表格
自动横向分页后的效果
本功能可以实现单个单元格中,有多个,多层html元素的自然分页(不断纵横边框线,不在文字中间断行),即使单元格内容由word转换而来亦可。
有时一页的内容宽度或高度超过了,选择纸张的大小,这在正常情况下,超出的部分就会被截去,如下图所示(A)所示,为了避免这种情况,控件允许你通过设置 fitToPage属性,来缩小打印,这样就可以在纸张过小的情况下,也能打印所有的页面内容,如下图(B)所示。

(A) 纸张宽度不够,右边的部分列被截去

(B) 设置 fitToPage 为 true,自动缩小打印,所有列可见
myDoc = {...
fitToPage :true, //必要时缩放打印
...
};
myDoc = {...
marginIgnored:true, // 强制上、下、左、右边距为零
settings:{ // 当前设置
topMargin:3 // 在 marginIgnored为 true时,此处设置(top/right/left/bottom)Margin被忽略,所以不需设.
},
...
};

myDoc = {...};
jatoolsPrinter.printPreview(myDoc,true); // 显示等待提示
// jatoolsPrinter.printPreview(myDoc,false); // 为不显示提示
// jatoolsPrinter.printPreview(myDoc); // 默认,为不显示
myDoc = {...
onState:function(job)
{
alert(job.status+job.statusText);
}
...
};
当打印状态发生变化时,会触发 onState方法,你可以通过 job参数,取得当前打印任务的相关属性,比如,打印机(printerName)、文档名(document)、打印状态(status)、打印状态描述(statusText)等,其中,job.status是数值型,你可以通过位运算,如下所示。
function getStatusText(status) {
var JOB_STATUS_PAUSED = 1;
var JOB_STATUS_ERROR = 2 ;
var JOB_STATUS_DELETING = 4 ;
var JOB_STATUS_SPOOLING = 8 ;
var JOB_STATUS_PRINTING = 16 ;
var JOB_STATUS_OFFLINE = 32 ;
var JOB_STATUS_PAPEROUT = 64 ;
var JOB_STATUS_PRINTED = 128 ;
var JOB_STATUS_DELETED = 148 ;
var JOB_STATUS_BLOCKED_DEVQ = 512;
var JOB_STATUS_USER_INTERVENTION = 1024;
var JOB_STATUS_RESTART = 2048;
var message = '';
if (status & JOB_STATUS_PAUSED) message += "暂停 -";
if (status & JOB_STATUS_ERROR) message += "出错 -";
if (status & JOB_STATUS_DELETING) message += "正在删除 -";
if (status & JOB_STATUS_SPOOLING) message += "进入队列 -";
if (status & JOB_STATUS_PRINTING) message += "正在打印 -";
if (status & JOB_STATUS_OFFLINE) message += "脱机 -";
if (status & JOB_STATUS_PAPEROUT) message += "没纸了 -";
if (status & JOB_STATUS_PRINTED) message += "打印结束 -";
if (status & JOB_STATUS_DELETED) message += "删除 -";
if (status & JOB_STATUS_BLOCKED_DEVQ) message += "堵了 -";
if (status & JOB_STATUS_USER_INTERVENTION) message += "用户正在介入 -";
if (status & JOB_STATUS_RESTART) message += "重启了 -";
return message;
}
function print()
{
var doc = {
settings:{
duplex:2, // 按左侧装订,即左右翻页.
// 1: 不双面打印, 2:左侧装订, 3: 上方装订
...
},
}
}
function print()
{
var doc = {settings:{
copies:3, //打印份数
copyway:'112233' //打印顺序 默认为123123
},
documents: document,
copyrights: '杰创软件拥有版权 www.jatools.com'
}
jatoolsPrinter.print(doc,false); // 不显示打印机选择对话框进行打印
}
function print()
{
var myDoc = {
...
pageFrom:2, //这里的pageFrom 和 pageTo的从第二页打印到第五页
pageTo:5,
...
};
jatoolsPrinter.print(doc,false); // 不显示打印机选择对话框进行打印
}
function print()
{
var doc = {
onPagePrinted:function(i,size){ //i当前打印页 size打印总页数
var j = i+1; //i以0开始
if(j==size)
alert('所有打印结束,总计'+size+'页');
else
alert('第'+j+'页打印结束.')
},
documents: document,
copyrights: '杰创软件拥有版权 www.jatools.com'
}
jatoolsPrinter.print(doc,false); // 不显示打印机选择对话框进行打印
}
function print()
{
var mySettings = jatoolsPrinter.showPageSetupDialog();
if(mySettings)
{
var doc = {settings: mySettings,
documents: document,
copyrights: '杰创软件拥有版权 www.jatools.com'
}
jatoolsPrinter.print(doc,false); // 不显示打印机选择对话框进行打印
}
}
function loadPrinters()
{
var printers = jatoolsPrinter.getPrinters(); // 打印机列表是字符串数组
if(printers)
{
for (i=0;i< printers.length;i++)
printer_list.options[i+1]=new Option(printers[i],printers[i]);
printer_list.options[0].selected = true;
}
}
function print()
{
var myDoc = { settings:{printer: printer_list.value},…}
jatoolsPrinter.print(myDoc);
}
<select name="printer_list"/>
有时,有些页面适合纵向(横向)打印,如果采用横向(纵向)打印则不美观,或根本打印不全。这时,你可以采用本功能,本功能允许在一次打印任务中,设置有些页纵向打印,有些页横向打印。方法是使用 myDoc.settings的orientationMixed 属性和 打印页面对象的orientation属性,如下所示:
var myDoc = {
settings:{
...
orientationMixed:true, // 此属性通知控件,存在有纵有横的打印页面
orientation:1, // 设置控件的默认打印方向,是纵向
...
}...}
...
<div id='page1'>纵打</div> // 采用控件的默认打印方向
<div id='page2' orientation='2'>横打</div> // 打印页面对象有orientation属性,
// 就采用该属性指定的方向打印,1为纵打,2为横打
<div id='page3'>纵打</div>
杰表打印控件除了可以打印纯HTML的web页面外,也允许你打印 MS Office、PDF文档。要打印这些文档,你可以使用控件的printDocument方法,如下所示:
jatoolsPrinter.printDocument("a.doc"); // 必须安装Word
jatoolsPrinter.printDocument("a.xls"); // 必须安装Excel
jatoolsPrinter.printDocument("a.ppt"); // 必须安装PowerPoint
jatoolsPrinter.printDocument("a.pdf"); // PDF文档,必须已经安装 Acrobat Reader
由上可见,控件可以打印的文档类型有:Word、Excel、PowerPoint、PDF,而且,在打印某类文档时,客户机必须已经安装相应的软件,如打印*.doc文件,必须安装有 MS Word软件。
打印的文档可以是动态的,也就是说,可以是加参数的url,用Word文档做报表或套打模板时,用带参数的url动态生成报表,是很常见的。如:
//动态文档,需要有第二个参数,来指明该文档类型,可能的取值是 'doc','xls','ppt','pdf'
jatoolsPrinter.printDocument('http://www.jatools.com/a.doc?myname=li','doc');
控件提供 isPrintableFileType 方法来帮助你判断客户机是否安装了有关软件,如下所示:
if(jatoolsPrinter.isPrintableFileType('doc')) // 判断是否可以打印doc文档
jatoolsPrinter.printDocument('a.doc');
else
alert('请先安装 MS OFFICE !');
isPrintableFileType方法,接受一个字符型参数,表示某一文档类型,可能的取值是 'doc','xls','ppt','pdf'。
在打印中,有的时候我们除过需要打印页面上的page中的内容之外,还希望一起打印doc、xls、ppt、pdf这些文件,要实现这个功能,就可以用 以下的方式来进行:
myDoc={
...
useAttaches:true, //useAttaches设成true
...
}
//打印完 page1后,接着打印a.doc,再接着打印 page2,打印 a.xls,...
<div id='page1' attaches='doc#a.doc'>页面1</div> //在div中加入attaches属性 doc是打印文档类型#之后是打印文件的路径
<div id='page2' attaches='xls#a.xls doc#a.doc'>页面2</div> //也可以一次加入多个文档 中间用空格隔开
<div id='page3' attaches='ppt#http://....a.ppt'>页面3</div> //文档路径也可以是绝对路径
<div id='page4' attaches='pdf#a.pdf'>页面4</div>
在一次打印中,我们往往希望在页眉或页脚上,显示页号,总页数,在默认情况下,总页数会显示这次打印任务中的所有打印页的总数。
但有时,我们不希望使用这种页号编码方式,考虑这样一种情形:你需要一次打印几个人的体检表,每个人的体检表,又是一个大表格,有可能会被打印成几页,你希望每个人按自己的体检表总页数进行编码。
如下所示,假设小王的体检表被打印成三页,小张的体检表打印成两页,你希望在小王的体检表的页脚上,分别显示1/3、2/3、3/3,小张的分别显示1/2、2/2,而不是显示
1/5、2/5、... 5/5。
<div id='page1' autoBreakTable='t1'> // 假设 有3页 小王的体检表 <table id='t1' > ...</table> </div> <div id='page2' autoBreakTable='t2'> // 假设 有2页 小张的体检表 <table id='t2' > ...</table> </div>要实现上述效果,也就是这种以每个page div作为一个页码分组进行页码编号,只需要设置 pageNumberOn 属性为 'local' 即可,如下所示:
var myDoc ={
pageNumberOn : 'local',
...
};
pageNumberOn 可以有以下取值:
global (控件默认值): 一次打印任务中,所有打印页成为一个页码分组;
document: 如果documents以数组方式指定打印文档,如 documents:['a.htm','b.htm'],则按
a.htm、b.htm各为一个页码分组;
local: 以每个 page div作为一个页码分组;
user: 以每个有 pageNumberReset='true' 的 page div,作为一个页码分组的开始。
取得本地mac地址,使用控件方法 getLocalMacAddress() 即可,如下所示:
alert(jatoolsPrinter.getLocalMacAddress());
取CPU序列号,使用控件方法 getCPUSerialNo() 即可,如下所示:
alert(jatoolsPrinter.getCPUSerialNo());
IE默认是不打印背景色及背景图的,如果你想打印背景图,只需要设置控件的printBackground属性为true,即可,当然,IE提供了手工设置方法,如下:
IE 浏览器->工具-> internet 选项->高级->打印背景颜色和图像。
如何让jatoolsPrinter 同时支持 IE及firefox,代码修改:
<html> ... <script type="text/javascript"> <!--调用控件的print方法实现打印--> function doPrint(how)pluginspage是插件包(jatools.xpi)存放在(http://www.abc.com/print/)的目录下。
{ //打印文档对象 var myDoc ={ documents: document,// 要打印的div 对象在本文档中,控件将从本文档中的 id 为 'page1' 的div对象,作为首页打印 // id 为 'page2' 的作为第二页打印 copyrights:'杰创软件拥有版权 www.jatools.com' // 版权声明必须 }; var jatoolsPrinter = navigator.userAgent.indexOf('MSIE')>-1 ? ojatoolsPrinter : ejatoolsPrinter;//判别IE或者非IE // 调用打印方法
if(how == '打印预览...'){
jatoolsPrinter.printPreview(myDoc);//打印预览 } else if(how == '打印...'){
jatoolsPrinter.print(myDoc ,true);// 打印前弹出打印设置对话框 } else{
jatoolsPrinter.print(myDoc ,false); // 不弹出对话框打印
} } </script>
... <!-- 插入打印控件 同时支持IE及firefox--> <object name="ojatoolsPrinter" codebase="jatoolsPrinter.cab#version=5,7,0,0" classid="clsid:B43D3361-D075-4BE2-87FE-057188254255" width="0" height="0" > <embed name="ejatoolsPrinter" type="application/x-vnd.jatoolsPrinter" pluginspage="http://www.abc.com/print/jatools.xpi" width="0" height="0" /> </object> ... </html>
http://www.abc.com/print/test.htm当jatools.xpi第一次安装时,则firefox有如下提示:
当你在网页中嵌入jatoolsPrinter控件后,你就可以使用 javascript 来调用该控件方法。其中常见的方法有打印输出(print),启动打印预览界面(printPreview),取得(getDefaultPrinter)和设置(setDefaultPrinter)默认打印机,显示页面设置对话框(showPageSetupDialog)等。下面是调用打印输出的一个示例:
<!—使用Object标签,嵌入jatoolsPrinter控件 -->
<OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D075-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,7,0,0"></OBJECT> <script type="text/javascript"> function print() { //打印文档对象 var doc ={ documents:document, // 打印页面(div)们在本文档中 copyrights:'杰创软件拥有版权 www.jatools.com' }; jatoolsPrinter.print(doc); } … <div id=’page1’> … </div> <div id=’page2’> … </div>
| 方法 | ||
|---|---|---|
print(Object doc,Boolean prompt): Boolean | ||
| 打印指定文档。 | ||
printPreview(Object doc): Boolean | ||
| 预览打印文档。 | ||
getPrinters(): Array | ||
| 取得系统已安装的打印机列表。 | ||
getPapers(String printer): Array | ||
| 取得指定打印机的可用纸张列表。 | ||
isCustomPaperSupported(String printer): Boolean | ||
| 判断指定打印机是否支持自定义纸张大小。 | ||
getDefaultPrinter(): String | ||
| 取得系统的默认打印机。 | ||
setDefaultPrinter(String printer): void | ||
| 设置系统的默认打印机。 | ||
showPageSetupDialog(): Object | ||
| 显示纸张设置对话框,并取得纸张设置参数 | ||
getLastSettings(String settingsID): Object | ||
| 取得指定打印设置settingsID,在注册表中保存的参数 | ||
setLastSettings(String settingsID,Object settings): void | ||
| 设置某个文档打印参数,以后打印这个settingsID的文档时,自动按该设置打印 | ||
function print(Object doc,Boolean prompt=false) : Boolean doc: Object (必选)
documents:Document/String/Object/Array (必选)
(Array)settingsID:String (可选) loadPrintSettings为true, 则控件在打印前,自动从系统的注册表中查找对应的历史打印设置信息,如果找到,则采用找到的参数来设置打印机,此时忽略setttings属性中指定的纸张设置。如果没找到,则使用setttings属性中的设置。 savePrintSettings为true,则控件在打印后,即将打印参数保存到系统中,以便下一次打印同一settingsID的文档时取用。如果你不指定该参数,则系统不从注册表中装载,也不会将打印设置保存到注册表。 settings属性对象中的内容,比如输出打印机,页高、页宽等。
settings:Object (可选)settingsID属性,而且在系统中找到该settingsID的历史打印设置时,本属性所设无效,打印参数将依照历史参数设置之,而忽略本属性中的参数。参照settingsID属性。settings对象有如下属性:printer:String (可选/默认值=系统默认打印机) paperName:String(可选/默认=打印机的默认纸张大小)
paperWidth / paperHeight:Number(可选/默认=打印机的默认纸张大小) paperWidth必须与paperHeight一起指定,如果仅指定一个参数,则系统忽略。isCustomPaperSupported 来测试。 topMargin / leftMargin / bottomMargin / rightMargin:Number(可选/默认值=打印机默认边距)topMargin, leftMargin, bottomMargin, rightMargin分别表示上,左,下,右边距,单位是 1/10毫米 。多数打印机有最小边距问题,如果你的设置太小,将不会起作用。orientation:Number(可选/默认值=打印机默认纸张方向) copies:Number(可选/默认值=打印机默认份数) copyway:String(可选/默认值='123123') duplex: Number(可选/默认值=1)
header:Object (可选/默认值=不显示页眉) 页眉对象。该对象有两个属性,分别是:
html: String/HTML Element(必选)
| 宏变量 | 含义 |
| #p | 当前页号 |
| #P | 总页数 |
| #d | 当前日期,以控制面板/区域与语言选项中设置的短日期格式 |
| #D | 当前日期,长日期格式 |
| #t | 当前时间,短时间格式 |
| #T | 当前时间,长时间格式 |
height:Number(必选) footer:Object (可选/默认值=不显示页脚) done:function(err:String) (可选) onPagePrinted:function(pagePrint:Number, pageSize:Number) (可选)
pagePrefix:String (可选/默认值='') 打印页面ID的前缀, 控件查找打印页面序列的规则是: autoBreakPage:Boolean(可选/默认值=false) autoBreakPage为true,从而让控件来帮你分页。 loadPrintSettings:Boolean (可选/默认值=true) settingsID属性配合使用,参照settingsID属性。savePrintSettings:Boolean (可选/默认值=true) settingsID属性配合使用,参照settingsID属性。classesReplacedWhenPrint:Array(可选) copyrights:String (必选) prompt:Boolean(可选/默认值=false) Boolean function printPriew(Object doc) : Boolean doc: Object (必选)。Boolean
function getPrinters() : Array 无Array
…
function loadPrinters()
{
var printers = jatoolsPrinter.getPrinters();
if(printers))
{
for (i=0;i< printers.length;i++)
printer_list.options[i]=new Option(printers[i],printers[i]);
}
}
loadPrinters();
…
<FORM >
<Select name="printer_list">
</FORM >
function getPapers(String printer) : Array
无Array
…
function loadPapers()
{
var printers = jatoolsPrinter.getPrinters();
if(printers)
{
var papers = jatoolsPrinter.getPapers(printers[0])
if(papers)
{
for (i=0;i< papers.length;i++)
{
var name = papers[i].name;
var dimension = {
width:papers[i].width,
height:papers[i].height};
paper_list.options[i]=new Option(name, dimension);
}
}
}
}
loadPapers();
…
<FORM >
<Select name=" paper_list" >
</FORM >
function isCustomPaperSupported(String printer) : Boolean
printer:String(必选)
Boolean
function getDefaultPrinter () : String 无String
function setDefaultPrinter(String:printer) : Boolean printer:String(必选) Boolean
function showPageSetupDialog() : Object
无Object
paperWidth / paperHeight:Number 纸张宽度和高度(以1/10毫米为单位,下同)。topMargin / leftMargin / bottomMargin / rightMargin:Number 纸张的上左下右的边距。orientation:Number 纸张方向:1代表纵向;2代表横向。
function printWithSetupPage()
{
var mySettings = jatoolsPrinter.showPageSetupDialog();
if(mySettings)
{
var doc = {settings: mySettings,
documents: document,
copyrights: '杰创软件拥有版权 www.jatools.com'
}
jatoolsPrinter.print(doc,false); // 不显示打印机选择对话框进行打印
}
}
function getLastSettings(String settingsID): Object
settingsID:String(必选)
Object
printer:String 输出打印机名称。paperWidth / paperHeight:Number 纸张宽度和高度(以1/10毫米为单位,下同)。topMargin / leftMargin / bottomMargin / rightMargin:Number 纸张的上左下右的边距。orientation:Number 纸张方向:1代表纵向;2代表横向。function setLastSettings(String settingsID,Object settings) : void
settingsID:String(必选)
settings :Object(必选)
printer:String 输出打印机名称。paperWidth / paperHeight:Number 纸张宽度和高度(以1/10毫米为单位,下同)。topMargin / leftMargin / bottomMargin / rightMargin:Number 纸张的上左下右的边距。orientation:Number 纸张方向:1代表纵向;2代表横向。无