jatoolsPrinter 2.0 使用手册

入门
使用示例
        最简单的打印预览
        打印前设置打印参数
         保留打印时的打印参数
         第一次打印用当前配置,后续打印用最后一次打印配置
        一次打印若干文档
        多个文档共存在同一web页面中,区别打印
       不显示文档,直接指定url打印
       打印隐藏对象
       仅在预览时可见,不输出到打印机的套打底图
       打印结束后提交数据
       打印后关闭窗口
       忽略页边距打印  
安装问题     
参考手册
        文档打印对象
                print_settings
                        printer
                        pageWidth
                        pageHeight
                        orientation
                        topMagin, leftMargin, bottomMargin, rightMagin
               print_settings_id
               documents
               classesReplacedWhenPrint
               load_print_settings_if_exists
               save_print_settings_after_print
               ondone            
               copyrights 
       控件方法
               printPreview(report)
               print(report,prompt)
       控件属性
               state
               error
               printers
               papers(printer)

 

入门

我们先来设计一个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>


最后,有几点需要说明:
  1. 控件在打印指定div对象时,如果纸张太小不够打印时,超出部分将被截掉(clip)。
  2. 被指定的div中的内容,可以是html任何可见对象,图片,flash,或文本等等。
  3. 控件打印时,边距可设,不设则取打印机默认值。
  4. 另外,页眉页脚的高度也设为0,所以您设计div时,就把他看作是完整的一页。如果您想要页脚页眉的效果,您也需要在这个div的上边或下边,自己加上。
  5. div的id必须连续,如果您的div,存在 'page1'、‘page2’、‘page4’,而不存在‘page3’,则控件只打印前两页,page4不会被打印。
  6. div对象在页面中的位置,可以是随意的,比如,page1显示在最后,也是合法的。
  7. 指定的div会被打印,没被指定的html元素将不会被打印,比如,本示例中的‘打印’按钮。
  8. 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群联系。

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

参考手册

在打印前,您必须设置打印文档的参数,文档参数是用一个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,如果不指定该参数,则打印方向为指定打印机的首选打印方向。
topMagin, leftMargin, bottomMargin, rightMagin 您可以使用上述属性设置页边距。topMagin, leftMargin, bottomMargin, rightMagin分别表示上,左,下,右边距。单位是 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',请参照以下示例代码。 如示

<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);
          }

 

 

引用:http://www.jatools.com/print/guide.htm#print_settings

  • 2261b859-17ce-314d-a299-485dfbf7fcf4-thumb
  • 描述: 第一张图片
  • 大小: 14.6 KB
  • 11f2e9f2-0f8a-3b11-b192-b6de2db2b11d-thumb
  • 描述: 第二张图片
  • 大小: 40.2 KB
评论
发表评论

您还没有登录,请登录后发表评论

joerong666
搜索本博客
存档
最新评论