jatoolsPrinter 使用手册
[ chm格式下载 ]
(更新日期:2010-06-22)


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-D975-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,2,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,2,0,0
jatoolsPrinter.cab地址: http://www.abc.com/print/xyz/jatoolsPrinter.cab
例二、
网页地址: http://www.abc.com/print/test.jsp
codebase属性: /jatoolsPrinter.cab#version=5,2,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-D975-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,2,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-D975-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,2,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大小
pageWidth : 2100,
pageHeight : 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: '联想激打',
pageWidth : 2100,
pageHeight : 2970,
orientation : 2
},
//第一次打印时,注册表中没有‘mysettings2’的打印参数
//所以使用上面指定的参数
//打印后,控件自动将最后一次打印设置保存
//后续打印时将用注册表中的设置,来自动配置打印机
//上述的settings将被忽略
settingsID : "mysettings2",
documents: document,
copyrights : '杰创软件拥有版权 www.jatools.com'
};
注意,批量打印时,而且打印文档数超过一个,只能进行无提示的直接打印操作。
//打印文档对象
var myDoc ={
//批量打印时,需要用数组来指定打印文档
//文档页可以在一个document对象中,也可以在url指定的一个文档中
documents: new Array(
document, // 打印页面(div)们在正显示在本文档中
'attaches1.htm', // 打印页面(div)们在一个url指定的文档中
'attaches2.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('simpleprint.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>
...
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就会被新的文档替换,而打印控件对原文档还没有打印完,这时就会经常出现如下错误信息。

<%
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: {
pageWidth: 2500,
pageHeight: 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中以备adjustablecheque.jsp取用。你可以根据需要,保存在其他机制中,比如,数据库,或本地文件等。
<%
String sid = request.getParameter("sid");
String styles = request.getParameter("styles");
application.setAttribute(sid,styles);
%>


myDoc = {...
...
};
...
//autoBreakPag='break-table'需要自动折页的表格 id
<div id=page1 autoBreakPag='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>
有时一页的内容宽度或高度超过了,选择纸张的大小,这在正常情况下,超出的部分就会被截去,如下图所示(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 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>
在一次打印中,我们往往希望在页眉或页脚上,显示页号,总页数,在默认情况下,总页数会显示这次打印任务中的所有打印页的总数。
但有时,我们不希望使用这种页号编码方式,考虑这样一种情形:你需要一次打印几个人的体检表,每个人的体检表,又是一个大表格,有可能会被打印成几页,你希望每个人按自己的体检表总页数进行编码。
如下所示,假设小王的体检表被打印成三页,小张的体检表打印成两页,你希望在小王的体检表的页脚上,分别显示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,作为一个页码分组的开始。
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,2,0,0" classid="clsid:b43d3361-d975-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-D975-4BE2-87FE-057188254255" codebase="jatoolsPrinter.cab#version=5,2,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:Object/Array (必选) settingsID:String (可选) loadPrintSettings为true, 则控件在打印前,自动从系统的注册表中查找对应的历史打印设置信息,如果找到,则采用找到的参数来设置打印机,此时忽略setttings属性中指定的纸张设置。如果没找到,则使用setttings属性中的设置。 savePrintSettings为true,则控件在打印后,即将打印参数保存到系统中,以便下一次打印同一settingsID的文档时取用。如果你不指定该参数,则系统不从注册表中装载,也不会将打印设置保存到注册表。 settings属性对象中的内容,比如输出打印机,页高、页宽等。settings:Object (可选)settingsID属性,而且在系统中找到该settingsID的历史打印设置时,本属性所设无效,打印参数将依照历史参数设置之,而忽略本属性中的参数。参照settingsID属性。settings对象有如下属性:printer:String (可选/默认值=系统默认打印机) pageWidth / pageHeight:Number(可选/默认=打印机的默认纸张大小) pageWidth必须与pageHeight一起指定,如果仅指定一个参数,则系统忽略。isCustomPaperSupported 来测试。 topMargin / leftMargin / bottomMargin / rightMargin:Number(可选/默认值=打印机默认边距)topMargin, leftMargin, bottomMargin, rightMargin分别表示上,左,下,右边距,单位是 1/10毫米 。多数打印机有最小边距问题,如果你的设置太小,将不会起作用。orientation:Number(可选/默认值=打印机默认纸张方向) copies:Number(可选/默认值=打印机默认份数) copyway:String(可选/默认值='123123') header:Object (可选/默认值=不显示页眉) 页眉对象。该对象有两个属性,分别是:
html: String/HTML Element(必选)
| 宏变量 | 含义 |
| #p | 当前页号 |
| #P | 总页数 |
| #d | 当前日期,以控制面板/区域与语言选项中设置的短日期格式 |
| #D | 当前日期,长日期格式 |
| #t | 当前时间,短时间格式 |
| #T | 当前时间,长时间格式 |
height:Number(必选) footer:Object (可选/默认值=不显示页脚) done:function(err:String) (可选) onPagePrinted:function(pagePrint:int, pageSize:int) (可选) 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
pageWidth / pageHeight: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 输出打印机名称。pageWidth / pageHeight: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 输出打印机名称。pageWidth / pageHeight:Number 纸张宽度和高度(以1/10毫米为单位,下同)。topMargin / leftMargin / bottomMargin / rightMargin:Number 纸张的上左下右的边距。orientation:Number 纸张方向:1代表纵向;2代表横向。无