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

简介
安装
快速入门
最简单的打印预览
打印前设置打印参数
保留打印时的打印参数
第一次打印用当前配置,后续打印用最后一次打印配置
批量打印文档
多个文档共存在同一web页面中,区别打印
不显示文档,直接指定url打印
打印隐藏对象
仅在预览时可见,不输出到打印机的套打底图
打印结束后提交数据
为什么要使用回调方法
打印后关闭窗口
可视化设计套打       视频演示 
打印内容相对位置的事后调整及保存       视频演示
调整后的套打位置信息保存到服务端 
使用自动分页
表格自动分页,表头每页可见
页内多表自动分页
自动缩放打印
零边距打印
预览时提示生成
监视打印任务状态
手动双面打印模式
自动双面打印模式
打印份数控制
监听打印页数事件
显示页面设置对话框后打印
选择打印机进行打印
选择打印机,纸张类型,边距进行打印
纵横打印(有些页纵向打印,有些横打) 
设置图文并茂的页脚页眉
一次打印中的页号分组
用控件设置IE打印背景
使用插件,使jatoolsPrinter 支持 firefox、chrome、safari
附录:API 参考手册


简介:

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> 
<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>
在这个文档中,有两个div对象,假设每个div中包括一张要打印的发票,现在要求是把这两张发票打印出来,而且,一张发票占据一页,如果你使用ie自带的打印菜单来打印,有可能只打印一页,有可能打印超过两页,有可能发票打印到一半时就分页,总之,如何分页取决于打印纸张的大小,及发票的大小,你不能控制页数及分页位置。那么,jatoolsPrinter是如何处理这样的需求的呢?
 

首先,我们在页面中插入这个控件,如下所示。  

<html> 
<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>
 其次,调用控件的 print 方法实现打印,如下所示:  
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' // 版权声明必须 
}; 

多个文档共存在同一web页面中,区别打印

运行此示例
//打印文档对象 
var myDoc ={ 

documents: document, 

// 在同一页面中,有多个可打印文档,他们可以用 
// pagePrefix  属性来区别 
// pagePrefix属性 +page+页序号 构成可打印div的id, 
// 如前缀为 'report1' ,则找到以 'report1page1'为id的 
// div作为文档首页 
// 该属性,默认值为空 
pagePrefix: whichreport.value, // 本例中,可能是 'report1'或'report2' 

copyrights : '杰创软件拥有版权   www.jatools.com' 
}; 
 

不显示文档,直接指定url打印

运行此示例
//打印文档对象 
var myDoc ={ 

//文档页可以在url指定的一个文档中,用数组指定打印文档 
documents: new Array('simpleprint.htm'), 
copyrights : '杰创软件拥有版权   www.jatools.com' // 版权声明必须 
}; 

打印隐藏对象

你可以使用属性 classesReplacedWhenPrint ,将一个对象在显示时定义为不可见,在打印或打印预览时,定义为可见,这通过预定一个css类实现。如下所示。 运行此示例
<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}'), ... };

仅在预览时可见,不输出到打印机的套打底图

通过特殊的样式类 screen-only ,配合enableScreenOnlyClass 属性,你可以控制所有可视化元素要求其仅在预览时可见,如下图示。运行此示例
//打印文档对象 
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就会被新的文档替换,而打印控件对原文档还没有打印完,这时就会经常出现如下错误信息。


打印后关闭窗口

在回调方法(done)中调用window.close()即可;参照演示 运行此示例

可视化设计套打

在web套打程序的开发中,最烦琐的事情是打印内容与票据要保持一致,不能移位。在以前的版本中,如果用户想设计套打模板,必须通过网页设计工具做好网页,然后,放到杰表控件中来打印,如果发现打印内容的位置有偏差,再在网页设计工具中调整,然后再放到控件中,如此反复多次,效 率极低。现在有了可视化设计功能,可以使用户在控件中,就能调整位置,不仅如此,由于控件中指定位置,是在真实的、可视化的打印环境中,使用户不必考虑边距的问题,做到完全的所见即所得,可大大提升套打设计的效率。更多内容...

打印内容相对位置的事后调整及保存

在web套打程序的开发过程中,你可能会发现,即使是同一套打网页,在不同的打印机中,打印出来的相对位置,也有差别,有的打印机打印出来的内容凑得紧些,有的则离得开些,这种偏差不能通过设置打印机边距的方式进行调整。借助杰表打印控件的可视化设计功能,使用户可以根据自己的打印机状况,自行调整打印内容的位置,并保存到注册表,下次打印时,自动根据自设的位置进行打印。 这种微调,不会影响到其他打印机,这对有大量前台打印,并有不同类型打印机打印同一种票据的场合,非常实用。更多内容...


调整后的套打位置信息保存到服务端

运行此示例   下载此示例代码

上一功能"打印内容相对位置的事后调整及保存"只将位置微调后的信息保存到本地注册表,所以某个用户的位置微调不会影响到其他用户,而本功能可以使调整后的位置信息保存到服务端,因此 某个用户的位置微调将影响到所有其他客户。 这在需要由专人负责调整套打位置的场合,非常有用。

实现此功能的原理,是监听用户微调后的确定按钮事件,你可以在此事件代码中,得到用户的最新位置信息,再通过ajax传递到后台保存,用户在下一次请求打印页面时,在页面的<style>中加入该位置信息。

下面以jsp语言为例说明本功能,如下所示,加入监听事件只需要设置 myDoc.dragDesigner.ok 为一个函数即可,当用户点击确定时,控件将调用这个方法,并传入两个参数,sid和styles. sid就是你设置的 settingsID属性. styles是一个javascript对象,形式如{f1:'top:200;left:200', f2:'top:100;left:300'},本例是将此对象转换成css字符串后,ajax到后台.

adjustablecheque.jsp
<%
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);
%>		     
  

使用自动分页

设置 autoBreakPage属性为true即可;运行此示例

表格自动分页,表头每页可见

运行此示例

如果你有一个行数较多的表格,想分页打印,那么,仅仅使用上节介绍的自动分页功能是不够的,因为自动分页功能,会使表格线在折页处,出现被折断的情况,如下图所示:



这个问题在InternetExplorer 打印中,你也经常碰到,微软也没有给出一个彻底的解决办法。为解决这个问题,本控件采用动态分页技术,引入 autoBreakTable属性,来避免此种现象的发生。 以下是使用autoBreakPage属性后的不断线分页效果:



代码如下所示:
 
    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,   //必要时缩放打印
	  
              ...
            }; 


零边距打印

每个打印机都会有一个最小边距(最小边距因打印机不同而不同),如果你在纸张设置对话框中,设置的边距小于这个最小边距,那么,你的设置将不会起作用。这使你在套打时会产生这样的问题:你已经设置了最小的左(上)边距,但打印出来的东西,仍然是偏右(偏下)。这时,你可以设置 marginIgnored属性为true, 在此模式下,控件将强制上、下、左、右边距为零,忽略你所有的代码或页面设置对话框中的边距设置。
运行此示例  
 
    myDoc = {... 
	      marginIgnored:true,   // 强制上、下、左、右边距为零
	     settings:{   // 当前设置 
                  topMargin:3   // 在 marginIgnored为 true时,此处设置(top/right/left/bottom)Margin被忽略,所以不需设.
                 }, 
              ...
            }; 


预览时提示生成

运行此示例

当你打印预览时,控件会进行分页运算,当页面较多时,或自动分页一个大表格时,这个过程可能会比较耗时。这时,你可以使用本功能,使控件在分页运算时显示一个等待对话框。如下所示:

如果将 printPreview 方法中的第二个参数设为true,即可显示上述提示,如下所示:
 
    myDoc = {...}; 
	jatoolsPrinter.printPreview(myDoc,true); // 显示等待提示
	// jatoolsPrinter.printPreview(myDoc,false); // 为不显示提示
	// jatoolsPrinter.printPreview(myDoc); // 默认,为不显示
 

监视打印任务状态

运行此示例

你可以通过onState监控正在打印的文档状态,监控代码如下:
 
    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;
}

 

手动双面打印模式


先打奇数页,再打偶数页,设置 myDoc.settings.manualDuplex 为true即可. 对于不支持双面打印的打印机,你可以使用这个属性,来进行正反面打印。运行此示例

自动双面打印模式

运行此示例

对于支持双面打印的打印机,你可以使用 duplex属性进行双面打印控制。 如下所示:
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打印背景

运行此示例

IE默认是不打印背景色及背景图的,如果你想打印背景图,只需要设置控件的printBackground属性为true,即可,当然,IE提供了手工设置方法,如下:
IE 浏览器->工具-> internet 选项->高级->打印背景颜色和图像。


使用插件,使jatoolsPrinter 支持 firefox、chrome、safari

运行示例

如何让jatoolsPrinter 同时支持 IE及firefox,代码修改:

<html> 
...
<script type="text/javascript">
<!--调用控件的print方法实现打印-->
function doPrint(how)
{ //打印文档对象 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>
pluginspage是插件包(jatools.xpi)存放在(http://www.abc.com/print/)的目录下。
如果用firefox访问该网页的地址是:

http://www.abc.com/print/test.htm 
当jatools.xpi第一次安装时,则firefox有如下提示:


点击"安装缺失插件(I)"按钮,弹出插件搜索服务对话框:


点击"
手动安装"按钮,弹出安装软件对话框:

点击"立即安装"按钮安装插件,然后重启firefox完成插件的安装。

 

附录:API 参考手册

当你在网页中嵌入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的文档时,自动按该设置打印

方法详情

print

function print(Object doc,Boolean prompt=false) : Boolean
打印指定文档。
参数:
  • doc: Object (必选)
    打印文档参数。你可以用这个参数来指定打印对象,设置打印页面参数。该对象有如下属性:
    • documents:Object/Array (必选)
      打印文档源。就是指定你需要打印的页面(<div id=page1….><div id=page2….>)在哪个document对象上。 如果你需要批量打印多个文档,你可以用字符串Array方式指定文档源,数组元素表示一个合法的文档url,url可以是绝对地址,也可以相对地址。如:
      new Array('http://www.jatools.com/abc.jsp','http://www.jatools.com/123.jsp&id=1');
      1. settingsID:String (可选)
        打印文档的设置参数ID。 如果你想让控件记住某个文档最后一次打印使用的设置,以便下一次打印同一文档时自动采用,则需要设置该属性。
        当你设置了该属性,且loadPrintSettingstrue, 则控件在打印前,自动从系统的注册表中查找对应的历史打印设置信息,如果找到,则采用找到的参数来设置打印机,此时忽略setttings属性中指定的纸张设置。如果没找到,则使用setttings属性中的设置。
        当你指定了该参数,且savePrintSettingstrue,则控件在打印后,即将打印参数保存到系统中,以便下一次打印同一settingsID的文档时取用。如果你不指定该参数,则系统不从注册表中装载,也不会将打印设置保存到注册表。
        可以保存的打印设置参数属性即是以下settings属性对象中的内容,比如输出打印机,页高、页宽等。
        1. settings:Object (可选)
      你可以使用这个参数来设置你的打印机输出,包括输出到哪个打印机、纸张大小、打印方向。当你指定了 settingsID属性,而且在系统中找到该settingsID的历史打印设置时,本属性所设无效,打印参数将依照历史参数设置之,而忽略本属性中的参数。参照settingsID属性。
      settings对象有如下属性:
      • printer:String (可选/默认值=系统默认打印机) 
        输出打印机,当你的系统安装了多台打印机时,比如,有针式打印机,激光打印机,你可以使用这个属性来设置你要求输出的打印机,如果不设置,系统将用默认打印机进行输出。
      • pageWidth / pageHeight:Number(可选/默认=打印机的默认纸张大小)
        打印纸张的宽度与高度,以1/10毫米为单位。pageWidth必须与pageHeight一起指定,如果仅指定一个参数,则系统忽略。
        如果你指定的纸张是非标准的纸张大小,控件会自动创建一个自定义纸张,如果你的打印机支持自定义纸张,则选用之,如果不支持,则不设置纸张。
        多数激光打印机,不支持自定义纸张。针式的票据打印机,一般都会支持。
        控件自动创建的自定义纸张名称类似这种形式 Custom 1000_9000,即按“Custom 宽_高”规则取名。
        你的打印机是否支持自定义纸张,可以通过控件的  custompapersupport.htm 来测试,该测试页面使用使用控件方法 isCustomPaperSupported 来测试。
      • topMargin / leftMargin / bottomMargin / rightMargin:Number(可选/默认值=打印机默认边距)
        你可以使用上述属性设置页边距。topMargin, leftMargin, bottomMargin, rightMargin分别表示上,左,下,右边距,单位是 1/10毫米 。多数打印机有最小边距问题,如果你的设置太小,将不会起作用。
      • orientation:Number(可选/默认值=打印机默认纸张方向)
        打印方向,以纵向还是横向打印,纵向取值为1,横向为2。
      • copies:Number(可选/默认值=打印机默认份数)
        可以在这里指定要打印的份数
      • copyway:String(可选/默认值='123123')
        打印顺序,取值112233打印顺序为112233, 取值123123 打印顺序为123123
      • header:Object (可选/默认值=不显示页眉) 页眉对象。该对象有两个属性,分别是:
        • html: String/HTML Element(必选)
          html对象,可以是包含html标签的字符串,也可以是一个HTML Element,比如<div>对象。本属性中,可以包含以下宏变量,以取得相应的页号或时间。
          宏变量含义
             #p当前页号
             #P总页数
             #d当前日期,以控制面板/区域与语言选项中设置的短日期格式
             #D当前日期,长日期格式
             #t当前时间,短时间格式
             #T当前时间,长时间格式
        • height:Number(必选)
        • 页眉对象的高度,以象素为单位
      • footer:Object (可选/默认值=不显示页脚)
        页脚对象。属性与页眉对象一致。
    • done:function(err:String) (可选)
      打印结束时调用。如果打印成功,则err为空,如果打印出错,err表示出错原因信息。注意,这里的打印成功,表示打印内容已经成功发送到打印队列,并不表示已经成功输出到打印机,也就是说,一些打印机错误,比如卡纸等情况,不在此函数监控之列。
    • onPagePrinted:function(pagePrint:int, pageSize:int) (可选)
      回调函数,当打印完一页之后就会调用此函数
    • pagePrefix:String (可选/默认值='') 打印页面ID的前缀, 控件查找打印页面序列的规则是:
      pagePrefix +'page'+页序号(以1开始递增)
      如本属性为 'doc1' ,则控件以 doc1page1,doc1page2,…这样的顺序查找打印页。
    • autoBreakPage:Boolean(可选/默认值=false)
      是否自动分页打印。true为自动分页,false为不自动分页。当自动分页时,page1,page2…指定的内容如果一页打印不下时,打印不下的内容会自动另起一页打印。false时,控件隐藏打印不下内容(不会另起一页打印)
      如果有一个表格,行数可能超过一页,你不想用程序分页,你就可以将这个大表格放在page1中,然后,设定autoBreakPagetrue,从而让控件来帮你分页。
    • loadPrintSettings:Boolean (可选/默认值=true)
      是否从注册表中,装载历史设置,如果是则装载,反之不装载。应与settingsID属性配合使用,参照settingsID属性。
    • savePrintSettings:Boolean (可选/默认值=true)
      是否将最后一次打印参数,保存到注册表中,如果是则保存,反之不保存。应与settingsID属性配合使用,参照settingsID属性。
    • classesReplacedWhenPrint:Array(可选)
      在打印时替换 css类选择器的定义。你可以在打印或打印预览时,动态地修改这个类的定义。
    • copyrights:String (必选)
      版权信息,取值必须为'杰创软件拥有版权 www.jatools.com'。
  • prompt:Boolean(可选/默认值=false)
    是否在打印前显示打印机选择对话框。
返回:
  • Boolean
    是否可以打印。如果false表示doc参数设置有问题,不能打印。如果true,表示可以打印。

printPreview

function printPriew(Object doc) : Boolean
预览打印文档。
参数:
  • doc: Object (必选)。
    参照print 方法
返回:
  • Boolean
    是否可以打印预览。如果false表示doc参数设置有问题,不能预览,如果true,表示可以预览。

getPrinters

function getPrinters() : Array
取得系统已安装的打印机列表。
参数:
返回:
  • Array
    可用的打印机名称数组。如果没有安装任何打印机,则返回为null。
示例:将取得的可用打印机列表,显示在表单的HTML Select对象上:
…
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 >

getPapers

function getPapers(String printer) : Array
取得指定打印机的可用纸张列表
参数:
返回:
  • Array
    可用的打印机名称数组。如果没有安装任何打印机,则返回为null。
示例:将取得的可用打印机列表,显示在表单的HTML Select对象上:
…
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 >

isCustomPaperSupported

function isCustomPaperSupported(String printer) : Boolean
判断指定打印机是否支持自定义纸张大小。 一般针式打印机都支持自定义纸张,而部分激光打印机不支持。
参数:
  • printer:String(必选)
    指定打印机名称。
返回:
  • Boolean
    true 表示支持自定义纸张,false 表示不支持。

getDefaultPrinter

function getDefaultPrinter () : String
取得系统的默认打印机
参数:
返回:
  • String
    默认打印机名称,如果为空,表示没有安装任何打印机。

setDefaultPrinter

function setDefaultPrinter(String:printer) : Boolean
设置系统的默认打印机。
参数:
  • printer:String(必选)
    指定默认打印机名称。
返回:
  • Boolean
    true为设置成功,false为设置不成功。

showPageSetupDialog

function showPageSetupDialog() : Object
显示纸张设置对话框,并取得纸张设置参数。
参数:
返回:
  • Object
    纸张对话框中设置的参数,用户点击了取消按钮后,,返回值为null,用户点击确定,则返回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); // 不显示打印机选择对话框进行打印
      }             
}

getLastSettings

function getLastSettings(String settingsID): Object
取得指定打印设置settingsID,在注册表中保存的参数。
参数:
  • settingsID:String(必选)
    需要取得设置的ID。
返回:
  • Object
    保存在注册表中对应settingsID的打印设置,如果null则表示无指定settingsID的打印设置,如果存在则返回Object对象,包括以下属性:
    • printer:String 输出打印机名称。
    • pageWidth / pageHeight:Number 纸张宽度和高度(以1/10毫米为单位,下同)。
    • topMargin / leftMargin / bottomMargin / rightMargin:Number 纸张的上左下右的边距。
    • orientation:Number 纸张方向:1代表纵向;2代表横向。

setLastSettings

function setLastSettings(String settingsID,Object settings) : void
设置某个文档打印参数,以后打印这个settingsID的文档时,自动按该设置打印。
参数:
  • settingsID:String(必选)
    需要设置的打印设置ID。
  • settings :Object(必选)
    打印设置对象,有如下属性:
    保存在注册表中对应settingsID的打印设置,如果null则表示无指定settingsID的打印设置,如果存在则返回Object对象,包括以下属性:
    • printer:String 输出打印机名称。
    • pageWidth / pageHeight:Number 纸张宽度和高度(以1/10毫米为单位,下同)。
    • topMargin / leftMargin / bottomMargin / rightMargin:Number 纸张的上左下右的边距。
    • orientation:Number 纸张方向:1代表纵向;2代表横向。
返回:


JATOOLS SOFTWARE CO.,LTD. - Copyright © 2009-2010
All rights reserved.