jatoolsPrinter 使用手册
(更新日期:2017-03-20)

简介
安装
快速入门
最简单的打印预览
打印前设置打印参数
保留打印时的打印参数
第一次打印用当前配置,后续打印用最后一次打印配置
批量打印文档
多个文档共存在同一web页面中,区别打印
指定打印html文档中的元素
不显示文档,直接指定url打印
打印指定的html
打印隐藏对象
仅在预览时可见,不输出到打印机的套打底图
打印时样式类的自动插入(实现不打印表格线等)
样式文件(*.css)的显式导入 
打印结束后提交数据
为什么要使用回调方法
打印后关闭窗口
可视化设计套打(2.0)       视频演示 
可视化设计套打       视频演示 
打印内容相对位置的事后调整及保存(2.0)
打印内容相对位置的事后调整及保存       视频演示
调整后的套打位置信息保存到服务端
运行时新增套打模板
连续打印的套打偏移校正 
使用自动分页
表格自动分页,表头每页可见
页内多表自动分页
含合并单元格的表格自动分页 
表格的横向自动分页
大单元格分页
表格分页时计算本页小计,本页累计等 
自动缩放打印
指定缩放比例打印
零边距打印
预览时提示生成
监视打印任务状态
手动双面打印模式
自动双面打印模式
打印份数控制
打印指定页 
监听打印页数事件
显示页面设置对话框后打印
选择打印机进行打印
选择打印机,纸张类型,边距进行打印
纵横打印(有些页纵向打印,有些横打) 
Excel导出 
打印到图片文件 
打印非 HTML 文档(*.doc,*.xls,*.ppt,*.pdf)
附件方式打印非 HTML 文档(*.doc,*.xls,*.ppt,*.pdf)
打印TIFF文件 
取字体 
HTML元素截屏 
文本文件读写 
二进制文件base64读写 
html文件读入 
远程文件下载 
文件打开、保存对话框 
设置图文并茂的页脚页眉
个性化的页脚页眉(首页不打印页脚页眉)
一次打印中的页号分组
指定显示的起始页号
取本地MAC地址
取CPU序列号
用控件设置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-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> 
<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-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>
 其次,调用控件的 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-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' // 版权声明必须 
}; 

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

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

documents: document, 

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

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

指定打印html文档中的元素

运行此示例  

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

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

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

打印指定的html

运行此示例

打印隐藏对象

你可以使用属性 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> ...

打印时样式类的自动插入(实现不打印表格线等)

运行此示例


假设有这样的需求,套打票据是一个表格,且表格线已经印在上面。但你不想将票据底图按上一节所说,设置在打印页面上,而是输出打印页面时,也同时设置表格线,仅在打印时,让控件自动隐去表格线。

如何做到?方法是利用打印样式类自动插入功能,该功能在控件打印时,会自动在页面的父对象中,插入一个jatools-printing样式类,类似这样:

<div class='jatools-printing'><div id=page1>...</div></div>
有了这个自动插入的样式类,以上不打印表格线的需求,就可以很方便实现了,方法如下:
1. 如果你有一个表格,如下所示:
  <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>

样式文件(*.css)的显式导入

有些应用,往往需要引入庞大的css文件,尤其是一些使用开发框架开发的应用,比如 Oracle的ADF。如果这样大的css放到内存中,让打印控件来解析,必须会影响到控件的打印效率,因此,我们这里推荐用户用显式的css引入方法,可减轻控件对css的解析负担,从而大大提高控件的打印速度。要使用显式的css文件导入功能,只需要设置 importedStyle 属性即可,如: 运行此示例
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就会被新的文档替换,而打印控件对原文档还没有打印完,这时就会经常出现如下错误信息。


打印后关闭窗口

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

可视化设计套打(2.0)

下载安装包
开发web套打应用时,如快递单打印,一般要经过以下步骤:
1. 扫描快递单据,保存成一个图片文件
2. 将底图作成<img>
3. 在<img>上放置打印项,试着打印到打印机,观察有无偏移
4. 有偏移,则调整,再试打。
5. 无偏移,则将样张,改造成相应语言的动态页面,如jsp,asp,php等。

上述过程中,如果没有可视化的设计工具,3,4两步是最麻烦的,往往要经过多次调整,特别是单据比较多的应用,工作量挺大。所以,本控件的套打开发设计器,就是帮助你简化套打对齐工作,并可以为后续的运行时套打调整打好基础。
以前的套打设计,是在杰表打印控件的打印预览窗口中进行的,界面不友好,代码输出不规范。
 视频演示


可视化设计套打

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

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

运行此示例   下载示例源代码
有时,你设计完应用,发现有些用户打印的时候,位置有偏移,或者字体不喜欢,那么,你可以让用户使用本功能。
经过上述可视化设计套打(2.0)设计出来的报表模板,你只需要几行代码,实现这个需求:
function doPosition(){
	var editorSettings={
		type:'user.position', // user.design:运行时设计报表模板,user.position,运行时调整打印位置,保存注册表
		url:'../demo_user_position_js/getPages.jsp?orders=100', // 用于拖放设计的页面,如果有多页,设计面板上只显示第一页,用于拖放
		settingsID:'mydoc1' // 拖放后,保存注册表时的对应settingsID
	};
	window
			.showModalDialog(
					'../jatoolsPrinter/index.htm',  // 套打设计器入口
					editorSettings,
					'dialogWidth=1150px;dialogHeight=670px;status=no;help=no;scroll=no;resizable=yes');
}


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

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

运行时新增套打模板

运行此示例   下载示例源代码
如果你帮淘宝卖家做快递单应用,设计时,你为用户默认设置了几个快递单据,看起来不错。但过些日子,你的用户换了一家不知名的快递公司合作,你的系统里,刚好没有这个快递单据,怎么办?你自己帮他们在程序里增加,会很麻烦,而且响应延时些,用户会抱怨,把这种吃力不讨好的事情,交给用户自己去做吧。
但让用户diy,你设计程序时,需要做不少工作,现在,利用本控件的本功能,可以分分钟内,加上这个很实用的功能。代码如下:
你设计完应用,发现有些用户打印的时候,位置有偏移,或者字体不喜欢,那么,你可以让用户使用本功能。
经过上述可视化设计套打(2.0)设计出来的报表模板,你只需要几行代码,实现这个需求:
function doRuntimeDesigner(){
			editorSettings={
				type:'user.design', // user.design:运行时设计报表模板,user.position,运行时调整打印位置,保存注册表
				url:'../demo_user_design_jquery/getPages2.0.jsp?orders='+selected, // 打印测试页
				backgroundUploadService:'../demo_user_design_jquery/uploadBackground.jsp',// '../demo_js_new/uploadBackground.jsp',//
				// 接收票据底图上传的服务位置
				templateService:'../demo_user_design_jquery/templateService.jsp?',// 
				// 可增加的字段
				// names = new String[] { "订单号", "收件人", "单位", "省", "市", "区",
				fields:[{
							type:'label',
							text:'+'
						},{
							type:'text',
							text:'订单号'
						},{
							type:'text',
							text:'收件人'
						}
						...
						,{
							type:'barcode',
							text:'订单号',
							codetype:'code128'
						}]
			};
			if(text=='修改模板'){
				editorSettings.settingsID=$('#templateSelector').val();
			}
			editorSettings.callback=function(lastSavedId){
				getTemplateList();
			}
			window
					.showModalDialog(
							'../jatoolsPrinter/index.htm',//控件运行时模板设计器入口
							editorSettings,
							'dialogWidth=1150px;dialogHeight=670px;status=no;help=no;scroll=no;resizable=yes');
		}


连续打印的套打偏移校正

因连续打印导致套打上下偏移的问题,是套打程序设计中的常见问题,如图所示:

                       第一张(正常)                                              第五十张 (向下偏移 1.2cm)

导致偏移的原因是什么呢? 一种原因,是打印纸张高度设置得不对,只要根据误差,调整纸张高度就行了。另一种原因,是打印机走纸不够精准,少打几页还看不出有啥问题,但连续打印后,因为误差累积起来,打印到10几张时,就很明显了,如果打印到100多张,上千张,必然谬之毫厘,差之千里了。

一般地,在打印多页后,如果出现向下偏移的情况,说明纸张高度设置过大了,调小一点即可,如果出现向上偏移的情况,说明纸张高度过小,调大一点即可。但这里有个坏消息,比如,进过测试,发现如果纸张高度设置为 200.1mm向下偏移,如果设成200.0mm向上偏移,很简单,设成它们俩的中间值:200.05mm试试。遗憾的是,windows不接受这个值,因为windows能接受的纸张高度,其精度只能达到0.1mm,即使你设置了这个中间值,打印机可能仍然以两值中的一个进行打印,也就是说,你设了这个中间值,打印仍然会存在偏移!碰到这种情况,我们做程序的也只能建议用户,换一台精度高一点的打印机,或者建议一次不要打印太多。

好消息是,本控件针对这个棘手的问题,提出了更有建设性的方法,那就是,在连续的票据打印过程中,插入若干校正页的办法来进行偏移纠正,此方法可图示如下:

控件启动一个打印任务,当打印完几张正常高度的票据后,打印一张用来纠偏的、特别高度的票据(以下称之为校正页),这样可以降低对打印机走纸精度的要求,也达到了纠偏的目的,此方法简单粗暴,直接有效,:)
下面介绍如何设置一个可插入校正页的打印任务:
1. 先测量出,票据的实际高度,比如120mm(宽)*100mm(高);
2. 按所得票据大小,设置自定义纸张,如下所示:
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 doNormalOffset()
{
jatoolsPrinter.setupNormalOffset('mydoc1'); // 设置校正参数
} ... <intput type=’button’ value=’打印’ onclick=’doPrint()’>
<intput type=’button’ value=’偏移校正设置’ onclick=’ doNormalOffset ()’> ...
行文至此,这个方案还是有点不够完美,因为,代码中出现两个按钮,一个是打印,一个是偏移校正,这个偏移校正按钮,对于大多数不存在偏移问题的用户来说,可能永远用不上,即使有少数用户存在偏移问题,也只需要设置一次,就可以了。这个按钮有点多余,我们来改造一下上面的代码,如下:
运行此示例
function doPrint(){   
	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()’>
...
上述代码,删除了用于校正的按钮,但doPrint代码里,加入了是否按下shift键的判断,如果用户在按下打印按钮的同时,也按了shift,则调用控件的校正设定方法,否则,就以正常打印处理。 这样,作为程序开发人员,只需要当用户发现有连续偏移时,才告诉他使用这个方法,来校正偏差。

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

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

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

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

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

remotelayout.htm
<%
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);
%>		     
     

使用自动分页

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

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

运行此示例

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



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



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

指定缩放比例打印

运行此示例


零边距打印

每个打印机都会有一个最小边距(最小边距因打印机不同而不同),如果你在纸张设置对话框中,设置的边距小于这个最小边距,那么,你的设置将不会起作用。这使你在套打时会产生这样的问题:你已经设置了最小的左(上)边距,但打印出来的东西,仍然是偏右(偏下)。这时,你可以设置 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 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>     


Excel导出

运行此示例

在日常开发中,经常需要将web页面上的表格导出成Excel,过去,我们自己在后台实现,现在借助杰表打印控件,也可以轻松导出Excel了。代码如下:

// 指定被输出表格的id,进行导出
jatoolsPrinter.exportAsExcel('mytable'); 
// 指定一个html的table对象进行导出 jatoolsPrinter.exportAsExcel(document.getElementById('mytable')); // 导出到 c:/mytest.xls jatoolsPrinter.exportAsExcel('mytable','c:/mytest.xls');

由上可见,控件方法exportAsExcel(table,filepath)接受两个参数:
table:必选参数,指定要导出的表格,字符型时,表示table的id,也可以是html对象。
filepath:可选参数,不指定时,控件将弹出文件对话框,由用户指定导出文件,如果指定,则不弹出文件对话框。
由于控件导出,使用的是excel机制,所以导出前,有必要检测一下,用户系统是否安装有Excel,检测的方法是 isExcelInstalled,如下所示:

if(!jatoolsPrinter.isExcelInstalled())
{
alert('你的系统没有安装excel,不能导出!');
return ;
}else jatoolsPrinter.exportAsExcel('mytable'); // 打印预览

打印到图片文件

运行此示例

打印非 HTML 文档(*.doc,*.xls,*.ppt,*.pdf)

运行此示例

杰表打印控件除了可以打印纯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'。


附件方式打印非 HTML 文档(*.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>      

打印TIFF文件

运行此示例


取字体

运行此示例


HTML元素截屏

运行此示例


文本文件读写

运行此示例


二进制文件base64读写

运行此示例


html文件读入

运行此示例


远程文件下载

运行此示例


文件打开、保存对话框

运行此示例


设置图文并茂的页脚页眉

运行此示例

 


个性化的页脚页眉(首页不打印页脚页眉)

运行此示例

 

一次打印中的页号分组

运行此示例

在一次打印中,我们往往希望在页眉或页脚上,显示页号,总页数,在默认情况下,总页数会显示这次打印任务中的所有打印页的总数。

但有时,我们不希望使用这种页号编码方式,考虑这样一种情形:你需要一次打印几个人的体检表,每个人的体检表,又是一个大表格,有可能会被打印成几页,你希望每个人按自己的体检表总页数进行编码。

如下所示,假设小王的体检表被打印成三页,小张的体检表打印成两页,你希望在小王的体检表的页脚上,分别显示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地址

运行此示例

取得本地mac地址,使用控件方法 getLocalMacAddress() 即可,如下所示:

	alert(jatoolsPrinter.getLocalMacAddress());

取CPU序列号

运行此示例

取CPU序列号,使用控件方法 getCPUSerialNo() 即可,如下所示:

	alert(jatoolsPrinter.getCPUSerialNo());

用控件设置IE打印背景

运行此示例

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

同时,本属性也将影响到高版本IE上的 "打印背景颜色和图像" 选项,如下图所示:


使用插件,使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,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>
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-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的文档时,自动按该设置打印

方法详情

print

function print(Object doc,Boolean prompt=false) : Boolean
打印指定文档。
参数:
  • doc: Object (必选)
    打印文档参数。你可以用这个参数来指定打印对象,设置打印页面参数。该对象有如下属性:
    • documents:Document/String/Object/Array (必选)
      用来设定要打印的内容来自哪个页面,控件默认要打印的页面里面,必须包含page1,page2,...等这些div。如果指定的页面不包含这些标识的div,则报"不存在可打印的页"错误。
      类型为Document:
      表示你需要打印的页面(<div id=page1….><div id=page2….>)在哪个document对象上。这个document对象可以是声明控件的那个文档,也可以是其他任何合法document对象,比如iframe里的document,举例如下:
      var mydoc = {
      ...
      documents:document,// div们在控件所在页面上
      // document:myiframe.contentWindow.document, div们在iframe上
      ...
      }
      jatoolsPrinter.print(mydoc);
      类型为String:
      表示要打印的div们所在文档的URL。URL可以是绝对地址,也可以相对地址。可以指向静态页面,也可以是一个动态页面,比如jsp,php等:
      documents:'/abc.htm'
      documents:'/abc.jsp?id=1'
      documents:'http://www.xxx.com/abc.jsp?id=1'
      类型为Object:
      当你有一个html的字符串,想把它打印成一页时,可以采用带html属性的js对象来指定,如下所示:
      documents:{html:'<h2>hi,你好!</h2>'}
      类型为数组(Array)
      如果你想一次打印多个页面中的div,则可采取数组方式指定各页面,元素类型可以是以上二种中的任意一种。如:
      documents:['x.htm',
      document,
      {html:'<p>hi</p>'},
      myiframe.contentWidnow.document]
      1. settingsID:String (可选)
        打印文档的设置参数ID。 如果你想让控件记住某个文档最后一次打印使用的设置,以便下一次打印同一文档时自动采用,则需要设置该属性。
        当你设置了该属性,且loadPrintSettingstrue, 则控件在打印前,自动从系统的注册表中查找对应的历史打印设置信息,如果找到,则采用找到的参数来设置打印机,此时忽略setttings属性中指定的纸张设置。如果没找到,则使用setttings属性中的设置。
        当你指定了该参数,且savePrintSettingstrue,则控件在打印后,即将打印参数保存到系统中,以便下一次打印同一settingsID的文档时取用。如果你不指定该参数,则系统不从注册表中装载,也不会将打印设置保存到注册表。
        可以保存的打印设置参数属性即是以下settings属性对象中的内容,比如输出打印机,页高、页宽等。
        1. settings:Object (可选)
      你可以使用这个参数来设置你的打印机输出,包括输出到哪个打印机、纸张大小、打印方向。当你指定了 settingsID属性,而且在系统中找到该settingsID的历史打印设置时,本属性所设无效,打印参数将依照历史参数设置之,而忽略本属性中的参数。参照settingsID属性。
      settings对象有如下属性:
      • printer:String (可选/默认值=系统默认打印机) 
        输出打印机,当你的系统安装了多台打印机时,比如,有针式打印机,激光打印机,你可以使用这个属性来设置你要求输出的打印机,如果不设置,系统将用默认打印机进行输出。
      • paperName:String(可选/默认=打印机的默认纸张大小)
        打印纸张类型。对于标准纸张类型,如A3,A4,可以采用本属性来指定纸张大小,对于非标准纸张,建议采用paperWidth,paperHeight来指定纸张大小。本属性值大小写任意:
        var mydoc =...
        mydoc.settings.paperName ='a3'; // 'A3'亦可
        jatoolsPrinter.print(mydoc);
      • paperWidth / paperHeight:Number(可选/默认=打印机的默认纸张大小)
        打印纸张的宽度与高度,以1/10毫米为单位。paperWidth必须与paperHeight一起指定,如果仅指定一个参数,则系统忽略。
        如果你指定的纸张是非标准的纸张大小,控件会自动创建一个自定义纸张,如果你的打印机支持自定义纸张,则选用之,如果不支持,则不设置纸张。
        多数激光打印机,不支持自定义纸张。针式的票据打印机,一般都会支持。
        控件自动创建的自定义纸张名称类似这种形式 jatools 1000_9000,即按“Custom 宽_高”规则取名。
        你的打印机是否支持自定义纸张,可以通过控件的  iscustompapersupport.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
      • duplex: Number(可选/默认值=1)
        对于支持双面打印的打印机,你可以使用本属性,来设置双面打印方式 ,可取值1/2/3= 不双面打印/左侧装订/上方装订。
      • 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:Number, pageSize:Number) (可选)
      回调函数,当打印完一页之后就会调用此函数
    • 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对象,包括以下属性:
    • 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); // 不显示打印机选择对话框进行打印
      }             
}

getLastSettings

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


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