2.8        增强打印功能

2.8.1    纵横打印(有些页纵向打印,有些横打)

纵横打印(有些页纵向打印,有些横打)

有时,一次打印中需要有些纸张纵向打印,有些纸张横向打印。本来,这些纵横不同的页面,可以分成多个打印任务来实现,但这样,不能保证打印的次序,和页码的连续性,使用本功能,可确保一次打印出纵横不同的页面。如图:

要实现纵横打印,需要设置 myDoc.settingsorientationMixed ,和orientation 

1.   <script>  

2.   var myDoc = {  

3.               settings : {  

4.     

5.                   orientationMixed : true, // 开启纵横混打模式  

6.                   orientation : 1  // 1为纵向,2为横向  

7.               },  

8.     

9.               documents : document,   

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

11.          };  

12.    

13.      getJCP().print(myDoc);  

14.      ...   

15.  </script>  

16.  <div id='page1'> ...</div>  

17.  <div id='page2' orientation='2'> ...</div>  

18.  <div id='page3'> ...</div>  

JCP发现设置了orientationMixedtrue ,即进入纵横混合打印模式,在此模式下,JCP会查看page div上的orientation 属性,如果有,就采用该属性上的纸张方向打印,如果没有,会采用 myDoc.settings.orientation上的属性。

 

orientation取值,可以是 1,或者2,分别表示纵向和横向打印。

 

本例中的 page1page2page3依次按纵向、横向、纵向打印。

 

2.8.2    打印水印

水印示例

JCP支持水印打印,类似上图中的,内部资料,妥善保管

要实现以上效果,需要设置myDoc.watermark属性,如下所示:

1.   var myDoc = {  

2.       watermark : {  

3.           image : 'water.jpg'// 水印图片路径  

4.           opacity : 0.3,// 控制水印图片的透明度,0.0-1之间,数值越小,水印越淡,默认为 0.2  

5.           repeat : 'no-repeat'/* repeat: 左右上下,重复平铺(默认) 

6.                       repeat-x: 只在水平方向上重复平铺 

7.                     repeat-y: 只在垂直方向上重复平铺 

8.                     no-repeat: 只在页面中间显示一次 

9.           */  

10.          hideWhenPreview : false     // 是否预览时隐藏,即打印和预览均可见,true,则只有打印时可见.默认可见.  

11.      },  

12.      documents : document,  

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

14.  }  

15.  getJCP().print(myDoc);  

 

2.8.3    POS小票打印

自动高度,POS机小票打印

POS小票打印时,每次打印的页面高度是变化的,比如,超市小票,如果你购买的东西越多,纸张就越长,也就是纸张高度越高。在JCP中,这种纸张高度随内容变化的情况,只需要设置paperHeightauto就行了:

1.   var myDoc = {  

2.       settings : {  

3.           paperWidth : 80,  

4.           paperHeight : "auto" // 小票打印,高度自动                     

5.       },  

6.         

7.       documents : document,  

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

9.   };  

10.    

11.  getJCP().print(myDoc);  

12.     

JCP发现paperHeightauto,则会计算所需要的纸张高度,再结合paperWidth值,并自动创建该大小的纸张。

 

不同内容高度下的纸张高度:

 

2.8.4    打印TIFF文件

TIFF打印演示

TIFF文件,是一种特殊格式的图片文件,它可以在一个文件中,包含多个图片,主要来源扫描仪、图片处理软件等。TIFF还不能被浏览器支持,所以也不能在浏览器中直接打印TIFF文件。

 

使用JCPprintTIFF方法,可以打印TIFF文件,方法如下:

1.   var myDoc = {  

2.       tiffStyle : 'height:680px',  

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

4.   };  

5.   // 调用打印方法  

6.   if (how == '打印预览...')  

7.       how = 'printpreview';  

8.   else if (how == '打印...')  

9.       how = 'printprompt';  

10.  else  

11.      how = 'print';  

12.  getJCP().printTIFF('tiff.tif', myDoc, how); // 打印前弹出打印设置对话框  

printTIFF方法的第一参数,表明tiff文件的所在位置。

第二个参数myDocprint方法的第一个参数用法上完全一致,你可以在在这里可以设置打印机、纸张等,但不需要设置documents属性,其中只对printTIFF方法有效的属性是 tiffStyle ,表示该图片的样式。

 

第三个参数,表示打印方式,可以为:

printpreview:打印预览

printprompt:显示打印机选择对话框打印

print:直接打印

 

2.8.5    多语言支持

多语言支持

JCP 涉及到界面的地方不多,打印预览算是最主要的一个,针对不同语言背景的用户,你可以用 myDoc.lang 属性设置预览界面的语言类别:

 

1.  function doPrint() {  

2.      var myDoc = {  

3.          lang : "en"// 设置为英文预览界面  

4.          documents : document,  

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

6.      };  

7.    

8.      getJCP().printPreview(myDoc, false);  

9.  }  

 

JCP可以支持的语言种类有 中文简体(zh)、中文繁体(zh-tw)、英文(en)、日文(jp)。

 

你也可以让JCP根据操作系统的语言,自动设置预览界面语言:

1.  function doPrint() {  

2.      var myDoc = {  

3.          lang : "auto,en"// 根据操作系统语言设置预览语言,如果不在支持之列,则显示英文界面  

4.          documents : document,  

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

6.      };  

7.    

8.      getJCP().printPreview(myDoc, false);  

9.  }  

自动选择语言,逗号前必须是固定值 auto,逗号后的值,表示万一操作系统的语言,不在上述四种支持语言之列,则该显示哪种语言,本例是显示成英文。

 

以下依次为中文简体(zh)、中文繁体(zh-tw)、英文(en)、日文(jp)预览界面

 

 

 

2.9        页眉页脚

页眉页脚即是打印在每页上部、下部的内容,JCP允许你在myDoc对象中,设置页眉,页脚,也可以在页眉、页脚中显示当前页号,总页数,当前日期等信息。

 

2.9.1    设置图文并茂的页眉页脚

图文并茂的页脚页眉

要生成如图所示页眉,需要设置如下:

1.   <script>  

2.       function print() {  

3.             var myDoc = {  

4.               header : {  

5.                   html : document.getElementById('myheader') // 也可以为字符串类型,如'<span>杰创软件</span>'

6.               },  

7.               documents : document,  

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

9.             }  

10.            getJCP().printPreview(myDoc);  

11.      }  

12.  </script>  

13.    

14.  <div id='myheader' style='display:none'>  

15.      <div style="border-bottom: 1px solid black; text-align: right">  

16.          <img style="float: left" border="0" src="logojj.gif" width="176" height="53">  

17.          <span>  

18.              <strong>杭州杰创软件有限公司</strong><br> 地址:杭州市西斗门路3号天堂软件园A19A   邮编:310012<br> 总机:0571-88254255   北京办事处:010-51297501  

19.          </span>  

20.      </div>  

21.  </div>  

其中myDoc.header属性是一个Object对象,该对象可以有两个属性:

html 表示页眉上应该显示的html内容,该对象为HTML DOM 对象时,如本例,则取其 innerHTML为页眉内容,如果是字符串,则直接就是页眉内容。

height: 表示该页眉需要占用的高度,以像素为单位,默认以html内容形成的高度。

 

 

页脚用 myDoc.footer属性指定,可以有 htmlheight属性,用法与header类似。

如下所示:

1.   var myDoc = {  

2.       footer : {  

3.           html : '<div style="text-align: right; border-top: 1px solid black;"><strong> #D #T  #p/#P </strong></div>',  

4.           height:50  

5.       },  

6.       documents : document,  

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

8.     

9.   }  

10.  getJCP().printPreview(myDoc);  

效果如下:

 

页脚中,显示了当前日期及时间,和当前页,总页数。

 

JCP发现页眉页脚中,有#号开始的字符,就会从以下表中,找到有没有对应项,如果有,就计算并替换:

#p

当前页号

#P

总页数

#d

当前日期,以控制面板/区域与语言选项中设置的短日期格式

#D

当前日期,长日期格式

#t

当前时间,长时间格式

#T

当前时间,长时间格式

 

2.9.2    在正文中打印页号,总页数等

打印总页数

实际上,上例中的#字符替换,也可以出现在打印页面的page div 里,如:

page div 的内容:

 

替换后的效果:

 

实现正文替换的代码如下:

1.   <script>  

2.       function doPrint() {  

3.           var myDoc = {  

4.               evalClass : 'eval-here',/*  

5.                * 表示正文中,所有带有 jp-eval  

6.                * 类名的元素,其中有变量引用的地方,则自动替换,类似页脚页眉,变量名可以有:  

7.                * #p 当前页号   

8.                * #P 总页数  

9.                * #d 当前日期,以控制面板/区域与语言选项中设置的短日期格式   

10.               * #D 当前日期,长日期格式   

11.               * #t 当前时间,短时间格式   

12.               * #T 当前时间,长时间格式  

13.               */  

14.              documents : document,  

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

16.          }  

17.          getJCP().print(myDoc);  

18.      }  

19.  </script>  

20.  ...  

21.  <div id="page1">  

22.  ...  

23.  本合同共<span class="eval-here" style="font-size:200%;color:red;">#P</span>页,一式两份,双方各执一份  

24.  ...  

25.  </div>  

当你定义了myDoc.evalClass属性,JCP就会找出页面中所有带有该属性指出的样式类(本例是 eval-here)的HTML元素,本例是 eval-here 样式类元素,并在页面生成的最后阶段,替换这些html元素上的#字变量。

 

2.9.3    按每个page div 进行分页编码

按每个page div 进行分页编码

设想一下,你有一份销售合同,该合同有一份附件,比如商品清单,你希望正文和附件同时打印,但希望商品清单从1开始分页编码,即类似次序:正文第1页、正文第2页、正文第3页、...、商品清单第1页、商品清单第1页、...

这时,你可以将正文放在page1中,自动分页,将商品清单放在 page2中,自动分页,并且设置myDoc.pageNumberOn 'local',如下所示:

1.  <script type="text/javascript">  

2.      function doPrint() {  

3.          var myDoc = {  

4.              pageNumberOn:"local",  

5.              footer : {  

6.                  html : "<div> #p/#P</div>"  

7.              },  

8.              documents : document,   

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

10.         };  

11.   

12.         getJCP().print(myDoc, false);   

13.     }  

14. </script>  

15.   

16. <div id='page1' class='breakable'>  

17.     <H1>合同正文</H1>  

18.     ...  

19. </div>  

20. <div id='page2' class='breakable'>  

21.     <H1>商品清单</H1>  

22.     ...  

23. </div>  

 

JCP 发现 pageNumberOn值为 local时,会在每一个page div上,重新开始页码编号,即从页码编号上看,互不相关。

 

假如本例,正文的page div 被分成三页,商品清单被自动分页成两页,则页脚上会依次显示:

1/3

2/3

3/3

1/2

2/2

 

2.9.4    带封面的页码

带封面的页码

有时,文档的第一页(或者开始若干页),是不进行页编码的,即只对正文内容,这时,你可以设置page1 div的类为 header-page,如:

1.  <script type="text/javascript">  

2.      function doPrint() {  

3.          var myDoc = {  

4.              footer : {  

5.                  html : "<div> #p/#P</div>"  

6.              },  

7.              documents : document,   

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

9.          };  

10.   

11.         getJCP().print(myDoc, false);   

12.     }  

13. </script>  

14. ...  

15. <div id='page1' class='header-page'>  

16.     <H1>销售合同 2018011001 </H1>  

17. </div>  

18. <div id='page2' class='breakable'>  

19.     ...  

20. </div>  

JCP 发现 page div有类 header-page时,则不显示页脚、页眉,且不计页号和总页数。

 

本例第一页,是封面页,不会显示页脚,page2 会显示页脚,从第一页开始编码。

 

有时,目录页也是不计页码的,这时,你可以将目录页也设置为 header-page,即封面页可以多于一页。如:

1.  <div id='page1' class='header-page'>  

2.      <H1>销售合同 2018011001 </H1>  

3.  </div>  

4.  <div id='page2' class='header-page'>  

5.      <H1>目录 </H1>  

6.          ...  

7.  </div>  

8.  <div id='page3' class='breakable'>  

9.      ...  

10. </div>