zoukankan      html  css  js  c++  java
  • web 打印,web打印控件的三种实现方法

    做管理系统的时候,打印一直是个棘手的问题,做B/S的系统这个问题就更加突出了!下面举出三种常用的web打印处理方式

    1、利用word或者excel来实现web打印(如果不修改ie设置,可以在web服务器端生成xls文件,然后通过xlBook = xls.Workbooks.Open(remotePath) 获取对象打印)

       实现过程:先将需要打印的数据导入到word或者excel中,再利用word或者excel的打印功能来实现web打印。
       下面以excel为例实现如何打印的过程
       将网页中数据导入excel中的方法有很多,这里先介绍一种,利用ActiveX控件的方式,即 Excel.Application, 这个控件是MS为excel提供的编程接口,在很多种编程语言种都可以通过该接口来操纵excel表格。
       下面用javascript脚本来实现一个简单的例子。
    < script language="javascript">

    function ExcelPrint(){

    var excelApp;//存放Excel对象

    var excelBook;//存放Excel工件簿文件

    var excelSheet;//存放Excel活动工作表

    try{

    excelApp = new ActiveXObject("Excel. Application");//创建Excel对象}

    catch(e){

    alert("请启用ActiveX控件设置!");

    return;}

    excelBook = excelApp.Workbooks.Add();//创建Excel工作簿文件

    excelSheet = excelBook.ActiveSheet;//激活Excel工作表

    var rowLen = printTable.rows.length;//table对象的行数

    for (var i=0;i< rowLen;i++){

    var colLen = printTable.rows(i).cells.length;//table对象的列数

    for (var j=0;j< colLen;j++)//为Excel表的单元格赋值

    excelSheet.Cells(i+1,j+1).value = printTable.rows(i).cells(j).innerText;} //将表格中的每个单元格的innerText导入到excel的单元格中

    excelApp.Visible = true;//设置Excel对象可见}

    excelSheet.PrintOut(); //打印工作表

    excelBook.Close(true); //关闭文档

    excelApp.Quit(); //结束excel对象

    excelApp=null;  //释放excel对象

    < /script>
      
       注意:
       运行该程序的前提是 IE要允许对没有标记为安全的Activex控件进行初始化和脚本运行。设置方法如下:
       打开控制面板→Internet选项→安全性→自定义级别→对没有标记为安全的ActiveX控件进行初始化和脚本运行→选中启用,这样我们的程序就可以 运行了。如果没有启用该ActiveX控件设置,那么程序在执行创建Excel对象时会抛出一个异常,这时可以通过catch()语句来捕获这个异常,并 且做出相应的处理。
       运行该程序必须客户端安装了MS EXCEL,否则Activex驱动不了。
      
      
      
    2、利用浏览器自带的打印控件来实现web打印
       实现过程:直接调用IE的打印功能或者在程序中调用window.print()来实现web打印,页眉和页脚会有网页标题、页码、网址,日期等信息,这 些打印时如果不需要,怎样能去掉呢。做法其实很简单,只有在IE的文件菜单中打开页码设置对话框,去掉页眉页脚中设置的哪些信息,就可以了。但是这需要每 个客户端都去手动设置一次。如果不想让每个客户端都手动去设置一次,也可以用代码通过修改注册表的键值来实现。
       下面是用VBScript来实现的修改注册表的过程:
       < script language="VBScript">

    dim path, reg

    'path存放IE打印设置的注册表地址, reg存放WScript.Shell组件的对象

    path = "HKEY_CURRENT_USER\Software\Micro-soft\Internet Explorer\PageSetup"

    '通过注册表修改打印设置,只修改页眉、页脚和各边界的值

    '参数说明:header--页眉,footer--页脚,margin_left--左边界

    'margin_top--上边界,margin_right--右边界,margin_bottom--下边界

    '页边距的设置中 1对应25.4mm,即margin_left=1表示实际值的25.4mm

    function pagesetup(header, footer, margin_left, margin_top, margin_right, margin_bottom)

    On Error Resume Next

    Set reg = CreateObject("WScript.Shell")

    if err.Number>0 then

    MsgBox "不能创建WScript.Shell对象!"

    exit function

    end if

    reg.RegWrite path+"\header", header'设置页眉

    reg.RegWrite path+"\footer", footer '设置页脚

    reg.RegWrite path+"\margin_left", margin_left'设置左边界

    reg.RegWrite path+"\margin_top", margin_top'设置上边界

    reg.RegWrite path+"\margin_right", margin_right'设置右边界

    reg.RegWrite path+"\margin_bottom", margin_bottom'设置下边界

    end function

    < /script>

    还有一点需要注意的是,利用window.print()这样的方法来打印,是直接弹出打印对话框,而不是打印预览的窗口。一般来说用户希望先打印 预览一下,然后再打印。或者有的格式固定的,每次都是一样的格式,就希望不弹出打印对话框,直接就打印出来。
    还有的用户希望每个打印都是直接和一种纸张绑定好,打印时候直接就调用那种类型的纸张来打印,这样window.print()显然远远不够。


    3、利用第三方的控件或者报表软件来实现web打印
       实现过程:第三方控件将打印的参数和方法封装成对象,在页面中可以方便的直接调用,例如ScriptX.cab,eprint.cab 都是这种类型的控件。可以直接用代码实现web打印页眉页脚的设置,web打印纸张的绑定,web打印边距的设置,web打印预览,直接web打印。
       web打印格式设置,web打印分页,web打印换页重新打印某些信息,某些信息只能第一页打印,某些信息只能最后一页打印等等这些,也都解决方案。 Scriptx没有处理这些的方案,webprint有webgrid和eprint两种解决方案,行列规则的表格式的可以简单webgrid来处理,复 杂格式的可以用eprint来设计格式。
      
       一般这种类型的打印控件都是需要收费的,用户可以从经济的角度来考虑。
    ==========================================================================================================

    一、 浏览器的打印功能菜单
    这种方案的优势是不需要对浏览器作任何扩充,是最简单的办法,但问题也最多,如:
    1. 不能精确分页。
      浏览器一般是根据用户设置的页面大小,web页面的内容多少,来自行决定分页位置,程序员很难控制。会有页脚页眉干扰。
    2. 不能准确对齐边边距及打印文字。
    3. 不能解决连续打印。
      比如,不是仅打印一张票据,而是连续一次打印若干个票据。
    二、 使用webbrowser控件+ javascript
    这实际上,是浏览器打印功能菜单的一种程序调用,与打印功能菜单没什么两样。分页的问题仍然存在,只不过,可以让用户不用去点菜单,直接在网页中的一个按 钮,或一个链接里面调用罢了。

    三、 使用print css
    这是一种最理想的实现web套打的方法。这种方法通过在html文档中,嵌入打印相关的css样式,来实现对html文档输出打印的控制,比如设置纸张大 小,纸张纵横方向,打印边距,分页等。显而易见,这种方式成本小,不需要下载任何插件,而且跨平台性非常好。print css推出已经有些时日,但遗憾的是,至今没有一个厂商的浏览器很好地实现了这些标准,这使得程序员目前还不能利用print css进行实际的开发。关于打印css,参见:
    http://css-discuss.incutio.com/?page=PrintStylesheets

    四、 使用pdf文件
    用这种方式,就是从服务器端下载一个pdf文件流,在IE中用adobe插件打开,然后用adobe的打印 菜单进行打印,虽然这种方案,也能实现精确套打,但需要下载adobe插件。这是国外报表工具经常推荐的一种打印方法,但在pdf不那么普及的中国,这种 方案不是最好选择。

    五、 采用纯ActiveX
    这种方案就是下载一个控件,票据的数据不再以html方式呈现,而是呈现在ActiveX中。这种方案的优点是打印的精确度高,分页的可控性好,但缺点也 是很明显的,嵌入ActiveX控件破坏了web应用的整体html风格,且这样的控件比较大(一般超过1M,下载颇费时间)。市场上的非java类报表 产品,一般都采用这种方案。

    六、 采用Applet方式
    采用Applet方式,分页或精确打印,都可以做到完美,但缺点也很明显,表现在:

    1. 安装Applet成本巨大。需要下载十几M的文件。
      Applet本身可能并不大,但运行Applet所需的jre一般至少10几M(jre1.4.2 , 15.45M)。用户需要极大的耐心,来进行打印。
    2. 打印报表时,需要重新向服务器检索数据,效率低。
      因为Applet方案,一般采用html方式呈现数据,打印时Applet必须向服务器检索同一张票据的数据,看上去,是打印了当前页的票据,实际 上,Applet根本不会用当前html页的数据来打印,而是向服务器下载数据到Applet中来打印。也就是说,打印的话,必须两次请求,一次html 呈现,一次用来打印。
      市场上java类的报表工具,一般推荐Applet方式来实现打印。
  • 相关阅读:
    ZOJ 1002 Fire Net (火力网)
    UVa OJ 117 The Postal Worker Rings Once (让邮差只走一圈)
    UVa OJ 118 Mutant Flatworld Explorers (变体扁平世界探索器)
    UVa OJ 103 Stacking Boxes (嵌套盒子)
    UVa OJ 110 MetaLoopless Sorts (无循环元排序)
    第一次遇到使用NSNull的场景
    NSURL使用浅析
    从CNTV下载《小小智慧树》
    NSDictionary and NSMutableDictionary
    Category in static library
  • 原文地址:https://www.cnblogs.com/jmax/p/1764149.html
Copyright © 2011-2022 走看看