discoverx

博客园 首页 新随笔 联系 订阅 管理
关键字: jatoolsprinter

入门
我们先来设计一个web页面,如下所示:

<html>
<head>
<title>我的第一个打印文档</title>
</head>
<body bgcolor="#e0e0e0">

<div id='page1'

style='background:#ffffff;margin:10;width:270;height:450;float:left'>文档第一页

</div>
<div id='page2'

style='background:#ffffff;margin:10;width:270;height:450;float:left'>文档第二页

</div>

</body>
</html> 

在这个文档中,有两个div对象,现在我想把这两个div对象打印输出,每个div作为单独的

一页进行打印。显然ie没有提供这样的功能, 在ie中,你不能指定哪些元素打印在第一页

,哪些元素打印在第二页等等,但是,jatoolsPrinter做到了,我们来看看

jatoolsPrinter是如何做到的,现在我们就在页面中插入这个控件,如下所示。

<html>
<head>
<title>我的第一个打印文档</title>

<!-- 插入打印控件 -->
<OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D975-4BE2-87FE-

057188254255" codebase="jatoolsPrinter.cab#version=2,1,0,3"></OBJECT>

</head>
<body bgcolor="#e0e0e0">

<div id='page1'

style='background:#ffffff;margin:10;width:270;height:450;float:left'>文档第一页

</div>
<div id='page2'

style='background:#ffffff;margin:10;width:270;height:450;float:left'>文档第二页

</div>

</body>
</html> 

这个控件的id是 jatoolsPrinter,这个控件有一个方法是 print 用来打印一系列div对象

。请看下面的脚本:

function doPrint()
{
       myreport = {
                            documents:document;    // 要打印的div 对象在本文档

中,控件将从本文档中的 id 为 'page1' 的div对象,作为首页打印
                                                                         // id

为 'page2' 的作为第二页打印
                           };
       jatoolsPrinter.print(myreport,false);   // 直接打印,不弹出打印机设置对

话框      
}                      

由上可见,你打印若干 div对象时,需要告诉控件,这些div们所属的文档对象(html的

document对象),另外,这些div对象的id,也需要按 ‘page+序号‘ 的规则命名,序号从

1开始计,也就是说,id为'page1'的div对象,总是作为首页打印。这些设置使用一个

javascript对象来描述,也就是上面的myreport对象,具体使用方法请参 考 文档打印对

象 ,下面是完整的html代码:

<html>
<head>
<title>我的第一个打印文档</title>

<!-- 插入打印控件 -->
<OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D975-4BE2-87FE-

057188254255" codebase="jatoolsPrinter.cab#version=2,1,0,3"></OBJECT>
<script>
function doPrint()
{
       myreport = {  documents:document,   // 要打印的div 对象在本文档中,控件

将从本文档中的 id 为 'page1' 的div对象,作为首页打印
                                                                         // id

为 'page2' 的作为第二页打印
                               copyrights:'杰创软件拥有版权 www.jatools.com'   

     // 版权声明,必须
                           };
       jatoolsPrinter.print(myreport,false);   // 直接打印,不弹出打印机设置对

话框      
}  
<script>
</head>
<body bgcolor="#e0e0e0">

<div id='page1'

style='background:#ffffff;margin:10;width:270;height:450;float:left'>文档第一页

</div>
<div id='page2'

style='background:#ffffff;margin:10;width:270;height:450;float:left'>文档第二页

</div>

<input type="button" value="按钮"  onClick=' doPrint()'>
</body>
</html>
 

最后,有几点需要说明:
控件在打印指定div对象时,如果纸张太小不够打印时,超出部分将被截掉(clip)。
被指定的div中的内容,可以是html任何可见对象,图片,flash,或文本等等。
控件打印时,边距可设,不设则取打印机默认值。
另外,页眉页脚的高度也设为0,所以你设计div时,就把他看作是完整的一页。如果你想

要页脚页眉的效果,你也需要在这个div的上边或下边,自己加上。
div的id必须连续,如果你的div,存在 'page1'、‘page2’、‘page4’,而不存在

‘page3’,则控件只打印前两页,page4不会被打印。
div对象在页面中的位置,可以是随意的,比如,page1显示在最后,也是合法的。
指定的div会被打印,没被指定的html元素将不会被打印,比如,本示例中的‘打印’按钮


copyrights属性是版权信息,必须写。


使用示例

最简单的打印预览
下面是一个最简单的打印,打印按默认设置进行。运行此示例 simpleprint.htm

 //打印文档对象
var myreport ={

documents: document, // 打印页面(div)们在本文档中
copyrights : '杰创软件拥有版权 www.jatools.com' // 版权声明必须
};
...
jatoolsPrinter.print(myreport,false);  


打印前设置打印参数
你可以打印前设置打印参数,如设置输出的打印机,打印方向,纸张大小。 运行此示例

printwithsettings.htm

 //打印文档对象
var myreport ={
print_settings:{
                                  // 如果想使用默认打印机,不需要设置
                                  // printer: '联想激打',

                                 // 指定纸张的高宽以毫米为单位z,本设置实际是指

定为a4大小
                                pageWidth : 2100,
                                pageHeight : 2970,

                               // 指定打打印方向为横向, 1/2 = 纵向/横向
                               orientation : 2 },
documents: document, // 打印页面(div)们在本文档中
copyrights : '杰创软件拥有版权 www.jatools.com' // 版权声明必须
}; 


保留打印时的打印参数
可以保留打印时的打印参数,待下一次打印同一文档时自动配置打印参数 。运行此示例

savesettingsafterprint.htm  

//打印文档对象
 var myreport ={
 //待保留的打印设置id,打印后将被保存在注册表中,
 //下一次启动相同值的print_settings_id,打印文档时,
 //控件将用保留的参数,自动设置打印机
 print_settings_id:"mysettings1",

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

第一次打印用当前配置,后续打印用最后一次打印配置
运行此示例 setandload.htm
 

//打印文档对象
var myreport ={
print_settings:{   // 当前设置
                         // printer: '联想激打',
                         pageWidth : 2100,
                         pageHeight : 2970,
                         orientation : 2
                         },

//第一次打印时,注册表中没有‘mysettings2’的打印参数
//所以使用上面指定的参数
//打印后,控件自动将最后一次打印设置保存
//后续打印时将用注册表中的设置,来自动配置打印机
//上述的print_settings将被忽略
print_settings_id : "mysettings2",

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

一次打印若干文档
运行此示例 batchprint.htm

注意,批量打印时,而且打印文档数超过一个,只能进行无提示的直接打印操作。

//打印文档对象
 var myreport ={

//批量打印时,需要用数组来指定打印文档
//文档页可以在一个document对象中,也可以在url指定的一个文档中
documents: new Array(
                                        document, // 打印页面(div)们在正显示在

本文档中
                                        'append1.htm', // 打印页面(div)们在一个

url指定的文档中
                                        'append2.htm',
                                        'append3.htm'
)
copyrights : '杰创软件拥有版权 www.jatools.com' // 版权声明必须
}; 

多个文档共存在同一web页面中,区别打印
运行此示例 distinctprint.htm  

//打印文档对象
var myreport ={

documents: document,

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

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

不显示文档,直接指定url打印
运行此示例 printurl.htm

//打印文档对象
 var myreport ={

//文档页可以在url指定的一个文档中,用数组指定打印文档
documents: new Array('simpleprint.htm'),

copyrights : '杰创软件拥有版权 www.jatools.com' // 版权声明必须
}; 


打印隐藏对象
你可以使用属性 classesReplacedWhenPrint, 将一个对象在显示时定义为不可见,在打印

或打印预览时,定义为可见,这通过预定一个css类实现。如下所示。 运行此示例

print_hidden_object.htm  

<style>
...
.only_for_print {display:none}
...
</style>
...
//左面是两个隐藏的页
<div id=page1 class='only_for_print' ...
<div id=page2 class='only_for_print' ...
...
打印印文档对象
var myreport ={
...
// 打印时,only_for_print取值为显示
classesReplacedWhenPrint: new Array('.only_for_print{display:block}'),
...
};
 

仅在预览时可见,不输出到打印机的套打底图
通过特殊的样式类 hide_for_jatools_print,你可以控制所有可视化元素要求其仅在预览

时可见,如下图示。 运行此示例 printcheque.htm  

<style>
<!-- 套打底图,在预览时需要显示,但不打印,为达到此效果,你可以新增样式类,如下所示

-->
.hide_for_jatools_print {}                 // 空的样式类
.title{ ... ... }
</style>
...
<img class='hide_for_jatools_print' src='background.jpg'  alt='本图片只在预览中

可见'>
<div class='hide_for_jatools_print title' > 本层中的内容只在打印预览时可见

</div>
... 

打印结束后提交数据
下面一个示例,意图是在打印成功后,将打印数据提交到服务器保存。  示例见

callback.htm

function doPrint()
{
       myreport = {...
                            documents: document,
                            };
       myreport.ondone=function(){
               if(jatoolsPrinter.state=='ok')   
                      myform.submit();       // 提交表单
               else
                     alert(jatoolsPrinter.error);  
       }
       jatoolsPrinter.print(myreport,false);   // 直接打印,不弹出打印机设置对

话框    

}      
... 

你可以在打印结束时,让控件自动调用一个脚本方法,回调方法必须通过打印对象的

ondone属性来指定。在打印结束后,你可以通过查询控件的 state 属性,来判断打印是否

成功,打印成功,state值为 'ok',打印失败为 'cancel',正在打印为 'printing' ,出

错原因可以通过error属性获得。



为什么要使用回调方法
不使用回调方法,按下面的代码运行可以吗?回答是不可以!

function doPrint()
{
       myreport = {...
                            documents: document,
                            };
     
       jatoolsPrinter.print(myreport,false);   // 直接打印,不弹出打印机设置对

话框    
       if(jatoolsPrinter.state=='ok')   
              myform.submit();       // 多数情况下,不执行
}      
... 

上述代码中,myform.submit(),总是不会被执行,因为打印过程是异步进行的,在执行

jatoolsPrinter.print 后,打印控件的状态为 'printing'。

下面的代码,更加错误。

function doPrint()
{
       myreport = {...
                            documents: document,
                            };
     
       jatoolsPrinter.print(myreport,false);   // 直接打印,不弹出打印机设置对

话框    
        myform.submit();       // 极端错误
}      
... 

因为不管三七二十一,就提交了表单,提交后,当前窗口的document就会被新的文档替换

,而打印控件对原文档还没有打印完,这时就会经常出现如下错误信息。


打印后关闭窗口
很多用户反映,用了杰表打印控件后,window.close()不起作用, 解决办法是使用

webbrowser.execwb(45,1); 参照演示 closewindow.htm

忽略页边距打印
控件在 2.0版本之前,都是忽略页边距的,你即使在页面设置对话框中设置了页边距,打

印、预览仍然会从页面的(0,0)位置显示你的打印页(div),这样做的好处是你设计套打

网页时,不必因为各种打印机默认边距的不同而需要调整。 即使你确实需要调整起始位置

,也可以采用 css的 margin属性,来进行调整。
尽管忽略页边距打印,结合css属性有足够的灵活性,但作为打印控件,不能设置页边距,

还是令广大用户困惑不已。因此,从2.0版本开始增加页边距设置功能。
2.0版本增加了一个 marginIgnored 属性,该属性为 true,表示忽略页边距,这种方式就

是2.0版本以前的做法,打印、预览从页面的(0,0)位置开始。如下代码。

 //打印文档对象
var myreport ={
documents: document,
marginIgnored:true,  // 忽略页边距,默认为不忽略

}; 

同一文档,在忽略、不忽略预览打印的效果,参照演示 marginignored.htm

安装问题
当你访问使用打印控件的网页时,浏览器将从服务器上下载控件,自动安装到ie中。但事

实并不总是这样,因为这取决于服务器端,浏览器端是否都得到合适的设置。

1. 服务端
先来看一个示例网页 test.htm

<html>
...
<OBJECT ID="jatoolsPrinter" CLASSID="CLSID:B43D3361-D975-4BE2-87FE-

057188254255" codebase="jatoolsPrinter.cab#version=2,1,0,3"></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=2,1,0,3
jatoolsPrinter.cab地址:http://www.abc.com/print/xyz/jatoolsPrinter.cab

例二、
网页地址:                    http://www.abc.com/print/test.jsp
codebase属性:            /jatoolsPrinter.cab#version=2,1,0,3
jatoolsPrinter.cab地址:http://www.abc.com/jatoolsPrinter.cab

注:服务器可以是任何操作系统,任何开发平台。

2. 浏览器端
你如果使用的是未签名版本,需要设置ie浏览器的安全属性。方法是 ie浏览器->工具->

internet 选项->安全->自定义级别,设置 ‘下载未签名的 ActiveX ’为'启用'状态"。如

下图所示:





如果你使用已签名版本,无须设置ie属性,按提示安装即可。签名版本是收费的,有需要

可与我们qq群联系。

注:
1. 浏览器端必须是windows平台(win95/98现不支持),浏览器版本为 ie5.5及以上版本


2. 除了自动安装外,jatoolsPrinter付费版本也提供一个离线安装软件包,使你避免ie安

全设置的麻烦。

参考手册
在打印前,你必须设置打印文档的参数,文档参数是用一个javascript对象来封装,你可

以使用静态命名数组的形式构造参数对象,如下所示:

var myreport = {
   print_settings: {
   printer: '联想激光打印机',
   pageWidth:2790,
   pageHeight: 2100    },
   copyrights : 杰创软件拥有版权 www.jatools.com'}
}
 

  你也可以使用new方法来构建参数对象,如下所示:

var myreport = new Object();
settings = new Object();
settings.printer =  '联想激光打印机';
settings.pageWidth = 2790;
settings.pageHeight = 2100;
myreport.print_settings = settings;
copyrights = '杰创软件拥有版权 www.jatools.com';
...
 myreport.print_settings.pageWidth = 2100;    // 修改某一属性
 

文档打印对象
文档打印对象
 描述 
print_settings  打印前,你可以使用这个参数,来设置你的打印机,包括设置输出到哪

个打印机,纸张大小,打印方向。当你指定了 print_settings_id属性,而且在系统中找

到该id的历史打印设置时,本属性所设无效,打印参数将依照历史参数设置之,而忽略本属

性中的参数。 
printer  输出打印机,当你的工作站连接了多台打印机时,比如,有针式打印机,激光打

印机,你可以使用这个属性来设置你要求输出的打印机,如果不设置,系统将用默认打印机

进行输出。 
pageWidth,pageHeight  打印纸张的宽度与高度,以毫米为单位。pageWidth必须与

pageHeight一起指定,如果仅指定一个参数,则系统忽略。如果不指定,则默认纸张大小,

为系统默认打印机的首选纸张类型。
如果你指定的纸张是非标准的纸张大小,控件会自动创建一个自定义纸张,如果你的打印

机,支持自定义纸张,则选用之,如果不支持,则不设置纸张。
多数激光打印机,不支持自定义纸张。针式的票据打印机,一般都会支持。
控件自动创建的自定义纸张名称类似这种形式 Custom 1000_9000,即按 'Custom 宽_高'

规则取名。
你的打印机,是否支持自定义纸张,可以通过 demo.htm 来测试,注意其中有一个只读属性"

支持自定义纸张"。 
orientation  打印方向,以纵向还是横向打印,纵向取值为1,横向为2,如果不指定该参数

,则打印方向为指定打印机的首选打印方向。 
topMargin, leftMargin, bottomMargin, rightMargin  你可以使用上述属性设置页边距

。topMargin, leftMargin, bottomMargin, rightMargin分别表示上,左,下,右边距。

单位是 1/1000 (mm) 。多数打印机有最小边距问题,如果你的设置太小,将不会起作用。

 
print_settings_id  当你使用了该属性,则系统在打印前,自动从系统的注册表中查找对

应的历史打印设置信息,如果找到,则采用的找到的参数,来设置打印机,而忽略所有在

print_settings中指定的参数。
当你指定了该参数,则文档在打印后,即将打印参数保存到系统中,以便下一次打印同一

print_settings_id的文档时取用。参照print_settings参数。如果你不指定该参数,则系

统不从注册表中装载,也不会将打印设置保存到注册表。 
documents  可打印页所在的文档对象,可打印页也即是web页面中的div对象。文档对象可

以是javascript 的document对象,也可以是数组,数组中的元素可以是document对象,也

可以是字符串类型的url,数组的情况用于批量打印。如示 
classesReplacedWhenPrint  在打印时替换 css类选择器的定义。你可以在打印或打印预

览时,动态地修改这个类的定义。如下 如示
 
load_print_settings_if_exists  是否从注册表中,装载历史设置,如果是则装载,反之

不装载,即使你已经指定了 print_settings_id属性。 默认为装载。 
save_print_settings_after_print  是否将最后一次打印参数,保存到系统中,如果是则

保存,反之不保存,即使你已经指定了 print_settings_id属性。 默认为保存。 
ondone  打印结束时回调方法,具体参见示例 打印结束后提交数据。请不要为

printPreview(report) 方法设置该属。 
copyrights  版权信息,属性值始终为'杰创软件拥有版权 www.jatools.com',必须。 

 
控件方法
控件方法  描述 
printPreview(report)  打印预览,report为一个文档打印对象,当多于一个文档的批量

打印时,该方法无效。 如示
 
print(report,prompt)  打印命令,report为一个文档打印对象,prompt参数指出,是否

在打印前弹出打印机选择对话框。当多于一个文档的批量打印时,只能进行不提示打印。

如示
 

控件属性
控件方法  描述 
state  取得打印控件状态,可能的取值为 'printing',‘ok’,‘cancel’。
打印控件调用print方法后,取值为 'printing',当打印结束时,成功则为 'ok',不成功

,则为 'cancel'。 具体参见示例 打印结束后提交数据。 
error  取得打印过程中,是否发生错误。只有当state为 'cancel' 时,error才会有错误

信息。
 
printers  取得所有可用的打印机,如果存在打印机,返回值是一个非空字符串,反之,

返回空串,如果存在多个打印机,则打印机名称以换行符('\n')分割。 请参照下一节中的

示例。 
papers(printer)  取得指定打印机的所有可用纸张类型,可用纸张列表是一个字符串对象

,不同纸张采用以换行符('\n')分割 ,纸张名称与规格以一个制表符('\t')分割,高与宽以

字符 'x'分割,类似 'A4\t2100x2790\nA5\t2000x2100',请参照以下示例代码。 如示 

myreport.documents = documnet;                             // 正确,
myreport.documents = parent.frame['main'].document;       // 正确
myreport.documents = new Array

(document,'http://localhost:8080/report1.htm','/report2.htm');                 

   // 正确,批量打印.
myreport.documents = 'report1.htm' ;                      // 不正确, 不能用字符

串直接作为documents的值
myreport.documents = new Array('report1.htm'); // 正确 

<style>
...
.normal_class {background-color:red}
...
</style>
...
//两个隐藏的页
<div id=page1>
      <div class=normal_class >本段文字在显示时,背景为红色,打印时背景为白色

</div>
</div>

打印印文档对象
var myreport ={
...
classesReplacedWhenPrint: new Array('.normal_class {background-color:white}'),
...
};
... 
myreport = new Object();
myreport.document = documnet;
myreport.copyrights='杰创软件拥有版权 www.jatools.com';
jatoolsPrinter.printPreview(myreport);      //正确

myreport.documents = new Array(document,'test1.htm'); // 打印多于一个文档.
jatoolsPrinter.printPreview(myreport); // 警告,多于一个文档不能预览报表

mhyreport.documents = new Array(document); // 只一个文档.
jatoolsPrinter.printPreview(myreport); // 不警告
 
myreport = new Object();
myreport.document = documnet;
myreport.copyrights='杰创软件拥有版权 www.jatools.com';
jatoolsPrinter.print(myreport,false);    /正确,不提示对话框打印
jatoolsPrinter.print(myreport,true);   //正确,提示对话框打印

mhyreport.documents = new Array(document,'test1.htm');     // 打印多于一个文档.
jatoolsPrinter.print(myreport,true);     // 警告,多于一个文档不能提示对话框打



jatoolsPrinter.print(myreport,false);     //正确
 
printers = jatoolsPrinters.printers;
       if(printers) {                                                          

  //存在打印机,多个打印机用换行符分割
       printers = printers.split('\n');
          for(i = 0;i <printers.length;i++)
          {     
                  var info = '第'+(i+1)+'个打印机 :'+ printers[i]+'\n';
                  info += '可用的纸张列表 :\n';
                  papers = jatoolsPrinter.papers(printers[i]); // 可用纸张列表

是一个字符串对象,不同纸张采用以换行符('\n')分割 ,纸张名称与规格以一个制表符

('\t')分割,高与宽以字符 'x'分割,类似 'A4\t2100x2790\nA5\t2000x2100'
                  papers = papers.split('\n');
                  for(k = 0;k < papers.length;k ++)  {
                             paper = papers[k].split('\t');
                             paperName = paper[0];
                             paperSize = paper[1].split('x');
                             paperWidth = paperSize[0];
                             paperHeight = paperSize[1];
                             info += (paperName + '('+paperWidth+'mm x

'+paperHeight+'mm)\n');
                  }
                  alert(info);
          }

posted on 2009-02-20 15:30  discoverx  阅读(1865)  评论(0编辑  收藏  举报