精华内容
下载资源
问答
  • Web系统页面打印技术实现与分析

    千次阅读 2011-08-01 23:35:02
    1 Web页面打印概述 应用WEB化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为...在WEB系统中,打印的确是个烦人的问题。 要么自己开发打印控件,如果项目时间紧,肯定来不及。这对程序员来说,因为浏

    1 Web页面打印概述
    应用WEB化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于WEB的应用,客户端的规则很简单,容易学习,容易维护,容易发布。在WEB系统中,打印的确是个烦人的问题。 要么自己开发打印控件,如果项目时间紧,肯定来不及。这对程序员来说,因为浏览器的局限性,却要面对很多挑战。怎么样来进行基于WEB的套打,就是这么一个令多数程序员头痛不已的问题。 基于WEB的套打,难度在于要将浏览器中呈现的HTML,精确地打印到票据中,而且能够实现对分页位置的控制。
    本文将介绍常用的Web打印与套打方案,同时提供一些免费的打印控件,供大家学习参考。
    2 常用Web页面打印方案
    2.1 浏览器的打印功能
    这种方案的优势是不需要对浏览器作任何扩充,是最简单的办法,但问题也最多,如:
    1. 不能精确分页。
    浏览器一般是根据用户设置的页面大小,web页面的内容多少,来自行决定分页位置,程序员很难控制。会有页脚页眉干扰。
    2. 不能准确对齐边边距及打印文字。
    3. 不能解决连续打印。
    比如,不是仅打印一张票据,而是连续一次打印若干个票据。
    2.2 使用PDF文件
    用这种方式,就是从服务器端下载一个pdf文件流,在IE中用adobe插件打开,然后用adobe的打印菜单进行打印,虽然这种方案,也能实现精确套打,但需要下载adobe插件。这是国外报表工具经常推荐的一种打印方法,但在pdf不那么普及的中国,这种方案不是最好选择。
    2.3 采用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方式来实现打印。
    2.4 IEWebBrowser+Javascript
    这实际上,是浏览器打印功能菜单的一种程序调用,与打印功能菜单没什么两样。分页的问题仍然存在,只不过,可以让用户不用去点菜单,直接在网页中的一个按钮,或一个链接里面调用罢了。
    2.5 利用word或excel来实现
    先将需要打印的数据导入到word或者excel中,再利用word或者excel的打印功能来实现web打印。
    2.6 使用第三方控件
    这种方案就是下载一个控件,票据的数据不再以html方式呈现,而是呈现在ActiveX中。这种方案的优点是打印的精确度高,分页的可控性好,但缺点也是很明显的,嵌入ActiveX控件破坏了web应用的整体html风格,且这样的控件比较大(一般超过1M),下载颇费时间)。市场上的非java类报表产品,一般都采用这种方案。
    3 Web打印控件介绍
    3.1 ScriptX
    ScriptX是一个叫MeadCo的国外公司的产品,它分为基础版(免费)和高级版(收费),基础版可以对 页眉,页脚,页边距,纸张方向进行设置。高级版有一些额外的功能,由于是收费的,需要付费以后才能用到你系统中.
    3.2 DLPrinter
    DLPrinter打印控件完全免费,界面大方、使用简单、但无签名,支持打印预览、直接打印,可设置页眉、页脚、页边距、打印份数、纸张大小等信息。遗憾的是作者不知道是什么原因,从2007年至今没的更新。
    作者博客:http://www.cnblogs.com/Yahong111/
    下载地址:http://files.cnblogs.com/panshenglu/DLPrinter.rar
    3.3 墙外打印控件
    墙外打印控件(QWPrint)是一款小巧的打印辅助软件,能够帮助众多制作B/S类程序的程序员更加灵活的控制客户端打印。
    功能特点:
    1) 小巧轻便,客户端在第一次使用时只要下载一个ActiveX控件即可使用。
    2) 控制多种打印设置。程序员可以通过控件进行多项设置,包括设置打纸的页边距,页眉页脚,纸张大小等参数。
    3) 精确控制打印。可以方便实现web下的套打操作。
    作者博客:http://www.xwangye.com/
    下载地址:http://files.cnblogs.com/panshenglu/墙外打印控件.rar
    3.4 Lodop
    对于这个打印控件,用一个词来形容:强大!不仅调用方便,而且功能比你想像中要强大得多。
    更多介绍大家到作者博客详细了解。
    作者博客:http://blog.sina.com.cn/caoyanqingwebsite/
    下载地址:http://files.cnblogs.com/panshenglu/lodop4.0.zip
    3.5 WebPrint(商业)
    webprint使用简单,灵活.能满足绝大多数页面打印的需要.它内含一个在vc7.0上开发的ATL小控件(只有74k),这个小控件主要实现对IE浏览器中文档打印格式的控制,可以定制打印纸型,纸张来源,打印方向,设置表头,表尾,表格,表格列宽,打印预览,分页,缩放等等用户经常关心的属性。 webprint使用户通过脚本可以控制自定义纸张,打印方向,页边距等等属性达到定制打印的目的,这些定制属性的设置不会改变IE浏览器的默认打印机属性。也可以通过服务器端的页面调用WebPrint生成客户端的页面达到设置打印参数的目的。
    技术特点:
    1) 基于表格的页面打印解决方案
    2) 采用了VC7.0开发的设置打印参数的小组件(仅75K),实现打印纸张,方向,页边距等等的自定义。
    3) 采用了DHTML, 不仅实现分页,换页重新打印标题,表头表尾等等,而且还实现了精确的放缩功能。
    4) 因为将数据接口层定在标准的HTML元素这一层,所以适合所有在IE下运行的互联网程序,包括ASP JSP PHP和VS.net等等..
    5) 使用简单方便,需要学习的东西很少.
    6) 无须为webprint重新组织要打印的数据和样式,直接将显示的页面传入webprint即可实现数据和样式的打印.
    7) 支持横向分页,分页时固定列重复打印.
    8) 可以动态改变每页的标题.
    9) 支持批打印,即一次打印多个打印作业.
    10) 在同一个页面上可以打印多个报表.
    11) 支持大数据量的打印.
    12) 可以设置打印到某些行时强行分页.
    13) 支持图片的打印.
    14) 可以导出为Excel文件。
    4 Web页面打印应用实例
    4.1 Javascript自带函数
    <a href="javascript:window.print();">打印</a>
    4.2 IEWebBrowser组件
    详细介绍参考:
    http://support.microsoft.com/default.aspx?scid=kb%3BEN-US%3BQ267240#top
    http://support.microsoft.com/kb/q247671/#appliesto
    <OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT>
    <input name=Button onClick=document.all.WebBrowser.ExecWB(1,1) type=button value=打开>
    <input name=Button onClick=document.all.WebBrowser.ExecWB(2,1) type=button value=关闭所有>
    <input name=Button onClick=document.all.WebBrowser.ExecWB(4,1) type=button value=另存为>
    <input name=Button onClick=document.all.WebBrowser.ExecWB(6,1) type=button value=打印>
    <input name=Button onClick=document.all.WebBrowser.ExecWB(6,6) type=button value=直接打印>
    <input name=Button onClick=document.all.WebBrowser.ExecWB(7,1) type=button value=打印预览>
    <input name=Button onClick=document.all.WebBrowser.ExecWB(8,1) type=button value=页面设置>
    <input name=Button onClick=document.all.WebBrowser.ExecWB(10,1) type=button value=属性>
    <input name=Button onClick=document.all.WebBrowser.ExecWB(17,1) type=button value=全选>
    <input name=Button onClick=document.all.WebBrowser.ExecWB(22,1) type=button value=刷新>
    <input name=Button onClick=document.all.WebBrowser.ExecWB(45,1) type=button value=关闭>
    4.3 通过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驱动不了。
    4.4 使用ScriptX控件
    1. 下载ScriptX.cab控件
    官网地址:http://www.meadroid.com/scriptx/index.asp
    2. 使用object元素,修改codebase,classid的值,调用控件ScriptX.cab
    <OBJECT id="factory" style="DISPLAY: none" codeBase="${rootUrl}js/smsx.cab#VVersion=6,3,435,20" classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" viewastext></OBJECT>
    这段代码用来加载cab文件,clsid和codebase必须要和你下载的cab中的信息对应,否则组件会加载错误,这两项其实不难找,只要你用winrar打开你下载的cab文件,然后找到扩展名是.inf的文件,然后打开之,就能看到了。
    3. 调用控件JS脚本
    function setPrintBase(headerText,footerText,rootUrl) {
    // -- advanced features  ,未曾使用过,有待确认。
    //factory.printing.SetMarginMeasure(2); // measure margins in inches
    //factory.SetPageRange(false, 1, 3);// need pages from 1 to 3
    //factory.printing.printer = "HP DeskJet 870C";
    //factory.printing.copies = 2;
    //factory.printing.collate = true;
    //factory.printing.paperSize = "A4";
    //factory.printing.paperSource = "Manual feed"
    var header = (headerText==null||headerText=="")?'默认页眉':headerText;
    var footer = (footerText==null||footerText=="")?'默认页角':footerText;
    factory.printing.header = "&b"+header+"&b" ;
    factory.printing.footer = "&b"+footer;
    factory.printing.portrait = true;
    factory.printing.leftMargin =10.00;
    factory.printing.topMargin =10.00;
    factory.printing.rightMargin =10.00;
    factory.printing.bottomMargin =10.00;
    }
    4. 应用实例
    <html>
    <head>
    <meta http-equiv="imagetoolbar" content="no">
    <script language="javascript" src="print.js"></script>
    <style media="print">
    .Noprint {DISPLAY: none;}
    </style>
    <title>打印测试</title>
    </head>
    <OBJECT id="factory" style="DISPLAY: none" codeBase="smsx.cab#VVersion=6,3,435,20" classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" viewastext></OBJECT>

    <script defer>
    function window.onload() {
    setPrintBase('页眉','页脚');
    }
    </script>
    <body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" marginwidth="0" marginheight="0">
    <center class="Noprint">
    <input type=button value="打印" οnclick="factory.printing.Print(true)">
    <input type=button value="页面设置" οnclick="factory.printing.PageSetup()">
    <input type=button value="打印预览" οnclick="factory.printing.Preview()">
    <input type="button" value="关闭" οnclick="window.close();">
    </center>
    <center>
    <table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tr><td align="center"><b>内容</b></td></tr>
    </table>
    </center>
    </body>
    </html>

    5 Web页面打印技巧
    5.1 隐藏打印的Web元素
    <html><head><title>web打印去掉页眉页脚,以及不想打印出的页面元素</title>
    <meta http-equiv=content-type content="text/html; charset=gb2312">
    <script language=javascript>
    function printpr() {//预览函数
    document.all("qingkongyema").click();//打印之前去掉页眉,页脚
    document.all("dayindiv").style.display="none"; //打印之前先隐藏不想打印输出的元素(此例中隐藏“打印”和“打印预览”两个按钮)
    var olecmdid = 7;
    var prompt = 1;
    var webbrowser = '<object id="webbrowser1" width=0 height=0 classid="clsid:8856f961-340a-11d0-a96b-00c04fd705a2"></object>';
    document.body.insertadjacenthtml('beforeend', webbrowser);
    webbrowser1.execwb(olecmdid, prompt);
    webbrowser1.outerhtml = "";
    document.all("dayindiv").style.display="";//打印之后将该元素显示出来(显示出“打印”和“打印预览”两个按钮,方便别人下次打印)
    }
    function printture() { //打印函数
    document.all('qingkongyema').click();//同上
    document.all("dayindiv").style.display="none";//同上
    window.print();
    document.all("dayindiv").style.display="";
    }
    function dopage(){
    layloading.style.display = "none";//同上
    }
    </script>
    <script language="vbscript">
    dim hkey_root,hkey_path,hkey_key
    hkey_root="hkey_current_user"
    hkey_path="\software\microsoft\internet explorer\pagesetup"
    '//设置网页打印的页眉页脚为空
    function pagesetup_null()
    on error resume next
    set regwsh = createobject("wscript.shell")
    hkey_key="\header"
    regwsh.regwrite hkey_root+hkey_path+hkey_key,""
    hkey_key="\footer"
    regwsh.regwrite hkey_root+hkey_path+hkey_key,""
    end function
    '//设置网页打印的页眉页脚为默认值
    function pagesetup_default()
    on error resume next
    set regwsh = createobject("wscript.shell")
    hkey_key="\header"
    regwsh.regwrite hkey_root+hkey_path+hkey_key,"&w&b页码,&p/&p"
    hkey_key="\footer"
    regwsh.regwrite hkey_root+hkey_path+hkey_key,"&u&b&d"
    end function
    </script>
    </head>
    <body background="images/background_01.gif" leftmargin=0
    topmargin=0 rightmargin=0 bottommargin=0 style="background-position: center 50%">
    <div align=center>
    你希望打印的内容..........
    </div>
    <div align="center" id="dayindiv" name="dayindiv"><input type="button" class="tab" value="打印" οnclick="printture();">
    <input type="button" class="tab" value="打印预览" οnclick="printpr();">
    <input type="hidden" name="qingkongyema" id="qingkongyema" class="tab" value="清空页码" οnclick="pagesetup_null()">
    <input type="hidden" class="tab" value="恢复页码" οnclick="pagesetup_default()">
    </div>
    </body>
    </html>
    5.2 实现简单的页面局部打印
    5.2.1 Javascript实现
    function preview(oper)
    ......{
    if (oper < 10)......{
    bdhtml=window.document.body.innerHTML;//获取当前页的html代码
    sprnstr="<!--startprint"+oper+"-->";//设置打印开始区域
    eprnstr="<!--endprint"+oper+"-->";//设置打印结束区域
    prnhtml=bdhtml.substring(bdhtml.indexOf(sprnstr)+18); //从开始代码向后取html

    prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr));//从结束代码向前取html
    window.document.body.innerHTML=prnhtml;
    window.print();
    window.document.body.innerHTML=bdhtml;
    } else ......{
    window.print();
    }
    }
    使用很简单 将页面内要打印的内容加入中间<!--startprint1-->XXXXX<!--endprint1-->
    再加个打印按纽 οnclick=preview(1)
    5.2.2 WebBrowser实现

    1. WebBrowser控件
      <object ID='WebBrowser' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object>
    2. WebBrowder控件的方法
    //打印
    WebBrowser1.ExecWB(6,1);
    //打印设置
    WebBrowser1.ExecWB(8,1);
    //打印预览
    WebBrowser1.ExecWB(7,1);
    关于这个组件还有其他的用法,列举如下:
    WebBrowser.ExecWB(1,1) 打开
    Web.ExecWB(2,1) 关闭现在所有的IE窗口,并打开一个新窗口
    Web.ExecWB(4,1) 保存网页
    Web.ExecWB(6,1) 打印
    Web.ExecWB(7,1) 打印预览
    Web.ExecWB(8,1) 打印页面设置
    Web.ExecWB(10,1) 查看页面属性
    Web.ExecWB(15,1) 好像是撤销,有待确认
    Web.ExecWB(17,1) 全选
    Web.ExecWB(22,1) 刷新
    Web.ExecWB(45,1) 关闭窗体无提示
    但是打印是会把整个页面都打印出来的,页面里面有什么东西就打印出来,我们有时候只需要打印数据表格,这时我们就要写一个样式了:把不想打印的部份隐藏起来:
    样式内容:
    <style type="text/css" media=print>
    .noprint......{display : none }
    </style>
    然后使用样式就可以:
    <p class="noprint">不需要打印的地方</p>
    代码如下:
    <script language="javascript">
    function printsetup()......{
    // 打印页面设置
    wb.execwb(8,1);
    }
    function printpreview()......{
    // 打印页面预览
    wb.execwb(7,1);
    }
    function printit()
    ......{
    if (confirm('确定打印吗?')) ......{
    wb.execwb(6,6)
    }
    }
    </script>
    <OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height=0 id=wb name=wb width=0></OBJECT>
    <input type=button name=button_print value="打印" class="noprint" οnclick="javascript:printit()">
    <input type=button name=button_setup value="打印页面设置" class="noprint" οnclick="javascript:printsetup();">
    <input type=button name=button_show value="打印预览" class="noprint" οnclick="javascript:printpreview();">
    5.3 禁止出现页眉页脚
    <HTML><HEAD>
    <script language="JavaScript">
    var hkey_root,hkey_path,hkey_key
    hkey_root="HKEY_CURRENT_USER"
    hkey_path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\"
    //设置网页打印的页眉页脚为空
    function pagesetup_null()
    {
    try{
    var RegWsh = new ActiveXObject("WScript.Shell")
    hkey_key="header"
    RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"")
    hkey_key="footer"
    RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"")
    }catch(e){}
    }
    //设置网页打印的页眉页脚为默认值
    function pagesetup_default()
    {
    try{
    var RegWsh = new ActiveXObject("WScript.Shell")
    hkey_key="header"
    RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"&w&b页码,&p/&P")
    hkey_key="footer"
    RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"&u&b&d")
    }catch(e){}
    }
    </script>
    </HEAD>

    <BODY><br/><br/><br/><br/><br/><br/><p align=center>
    <input type="button" value="清空页码" οnclick=pagesetup_null()>
    <input type="button" value="恢复页码" οnclick=pagesetup_default()><br/>
    </p></BODY></HTML>


    展开全文
  • web打印web打印控件的三种实现方法 zz 做管理系统的时候,打印一直是个棘手的问题,做B/S的系统这个问题就更加突出了!下面举出三种常用的web打印处理方式 1、利用word或者excel来实现web打印(如果不修改ie...
    
    

    做管理系统的时候,打印一直是个棘手的问题,做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方式来实现打印。
    七、 轻量级的ActiveX打印方式 
    这是本公司应客户要求,最新推出的一种最具创意的web套打解决方案。

     
    杰表作为一款纯java的报表工具,以前提供的web套打方案也是基于Applet的,Applet也做到了尽可能的小(只有24kb),但用户还是抱怨,因为jre太大,安装需要耐心。另外,用Applet方式,很难实现客户端的批量打印功能。 
     
    我们采用轻量级的ActiveX打印方案,很好地解决了客户的问题。以下是一个典型的该种方案的示例
    展开全文
  • 基于XML的WEB系统报表精确打印实现

    千次阅读 2008-01-13 21:11:00
    基于XML的WEB系统报表精确打印实现王春红 何志林(运城学院计算机科学与技术系,山西 运城 044000) 摘 要:XML及其相关技术日益渗透到计算机科学的各个层面。针对XML的特点,给出了一个利用XML有效解决B/S结构中...

    基于XMLWEB系统报表精确打印实现

    王春红 何志林

    (运城学院计算机科学与技术系,山西 运城  044000

     

    摘 要:XML及其相关技术日益渗透到计算机科学的各个层面。针对XML的特点,给出了一个利用XML有效解决B/S结构中客户端快速精确打印报表方法,并以所开发的运城市城建局建设工程交易中心招投标管理系统作为实例说明了这一方案在Microsoft ASP.net平台中的实现过程。该方案实现简单,可扩充性好,且易于维护。

    关键字:XML    WEB打印    数据交换    WEB服务    WEB票据打印

    Exact Report Printing of WEB System Based on XML

    chunhong-wang   zhilin-he

    Computer & Science Department of  YunCheng University

     

    Abstract:  XML and its relevant technology have been found at all the levels of the computer science. By exploiting its features, a method of quick and exact report printing of sheet has been offered. This method has also been exemplified in the platform of Microsoft ASP.net by an example of bidding system designed for YunCheng Construction Trade of Center, Bureau of Urban Construction. The result shows that this method is simple, and easy to expand and maintain.

    Keywords: XML  WEB Printing  Data Exchange  WEB Service  WEB Printing of Receipt

     


    0引言

    近年来,随着宽带网络的普及和推广,基于局域网的C/S结构的应该程序越来越不能满足企业信息化的需要,而基于浏览器的B/S结构的应用程序则越来越广泛。B/S结构的应用程序客户端免安装、免配置、免维护、免升级;服务器端则采用多层模式,将表示层、商业逻辑层和数据层分开,极大的提高了开发的效率和数据的安全性。目前基于B/S结构的应用程序已成为软件开发的主流。但是B/S结构也存在一些缺点,比如,灵活的Web报表打印实现,尤其是一些发票的精确套打更不容易实现!

    现有的Web打印控制技术分成几种方案:主要有(1)自定义控件完成打印;(2)利用IE自带的WebBrowser控件实现打印;(3)利用第三方控件实现打印。利用IE打印过于简单,无法实现复杂的票据打印要求,利用第三方控件会往往需要付一定的费用,并且使系统安装部署复杂。自定义控件方式就是利用VBVC等工具生成COM组件,或者用.net生成.net组件,用定义好的打印格式来分析打印源文件从而实现打印。利用XML可以非常容易地定义打印目标的文本、表格等内容的格式,轻松实现各种复杂的打印需要。本文介绍一种在.net平台下基于XML技术构建.net打印组件从而实现WEB系统的精确打印。

    1XML特性

    XML以其良好的数据组织结构和可扩展的特性,成为描述各种复杂数据,特别是结构化数据的良好工具。另外,XML还允许为特定的应用制定特殊的数据。具有以下一些特点:

    a) 严格的规范、清晰的语义

    b) 数据的共享与重用

    c) 良好的扩展性

    d) 平台无关性

    基于以上的特点,利于XML良好的扩展性和平台无关性完全可以自定义出我们所有需要的格式控制标签,根据服务器端定义的打印格式从客户端直接控制打印机打印,从而实现跨平台的通用报表打印。

    2、系统原理

     利用XML强大的自定义功能,我们便能方便的自定义出我们所需要的格式控制标签,在服

    务器端进行动态编码后通过WEB服务器传到客户端,然后在客户端进行格式解析,根据服务器端定义的打印格式从客户端直接控制打印机打印出我们需要的报表。如图1所示:

    1系统原理设计

     

    我们采用.NET frameworkwinform做一个打印控件,该控件可以直接嵌入到网页中实现打印功能,但嵌入到网页中的控件一般无法直接连接到数据库,因此只能采用XML文件进行中间数据交换格式,通过普通WEB服务器的默认80端口进行数据传输。当然,我们也可以采用使用SOAP传输数据的Web Service来直接从数据库提取数据,从原理上看,应该和我们采用的XML属于同种类技术。

    由于现在的大部分数据库都支持XML格式的数据查询和转换,如SQL Server 2000Oracle 9iIBM DB2等大型关系型数据库。只需要通过简单的设置就能直接进行XML数据转换工作。如果数据库不能支持直接XML数据转换,也可以用JSPASPPHP等服务器端脚本程序进行脚本转换工作。

      客户端也不需要任何特殊的设置工作,仅需要安装一个大小为21M.NET framework分发包,然后直接打开网页就可以进行工作。也没有操作系统限制,从windows 98windows xp都能很好的支持。

      由于采用的是XML标准数据格式作为中间数据交换,因此本解决方案具有非常好伸缩性,例如,客户端的.NET控件可以采用JAVA APPLETACTIVX或者是VBVC等编写的客户端应用程序直接替换。服务器也可以任意选择采用IISAPACHEWEB服务器。数据库也可以采用任意一种数据库。包括SQL ServerOracle或者是Access等。

      由于采用的是普通WEB服务器传送数据,因此可以直接采用SSL安全套接字等已经成熟的WEB加密技术。同时还可以对XML进行数据算法加密,在客户端再进行解密,保证了传输的安全性。

    3、系统实现

    首先我们用VB.net设计一个XML打印控件,该控件可以从本地或WEB上的文件,甚至WEB Service加载XML格式的报表文件,然后根据XML报表中的定义,将报表中的线、框、文本提取出来形成一个PrintDocument打印文档进行预览或打印。

    将生成的DLL控件复制到WEB系统所在的目录,并在需要打印的WEB页面上,用<Object>

    标签将控件插入WEB页面,并通过JavaScriptWEB服务器动态生成的XML报表文件以参数方式传给打印控件,从而实现在WEB页面上的灵活精确打印!

    下面以运城市城建局建设工程交易中心网络办公系统为例,介绍基于XML利用.Net打印控件实现招投标档案自定义报表的方法。首先我们利用ASP.NET构建WEB网络办公平台,实现基本的档案管理,招投标流程管理;图2所示为一工程报建界面!因本页面的资料需要打印存档,所以在该页面嵌入.Net报表打印控件,并通过JavaScript脚本将页面生成的工程报建表XML报表文件传给打印控件,单击打印按钮,就会打开工程报建表打印预览界面,如下图3所示。

     

    2

    3

     

    用于打印的XML报表格式如下:

    <?xml version="1.0" encoding="utf-8" ?>

    <root>

    <Reportsetting>        /*报表页面设置*/

    <landscape>true</landscape><papertype>A4</papertype>

    <paperwidth>2100</paperwidth><paperheight>2970</paperheight>

    < leftmargin>100</ leftmargin>< rightmargin>100</ rightmargin>

    < topmargin>100</ topmargin>< bottommargin>100</ bottommargin>

    </ Reportsetting >

    <ReportDetail>         /*报表内容*/

    <text x="380" y="65" fontname="黑体" fontsize="20"

    fontcolor="black" b="true" i="false" u="true">    运城市建设工程报建表</text>

    <text x="100" y="120" fontname="宋体" fontsize="12" fontcolor="black" b="true" i="false" u="true"> :2005-05-01  </text>     /*定义文本*/

    ...

    <rect x = "90" y="160" width="980" height ="540" border ="2" bordercolor="black" />  /*定义矩型*/

    ...

    <line x1="650" y1="460" x2="1070" y2 ="460" border ="1" bordercolor="Black" />  /*定义线*/

    ...

    <data x="510" y="430" fontname="宋体" fontsize="12" fontcolor="Black" b="true" i="false" u="true">办公大楼</text>  /*定义打印数据*/

    ...

    </ReportDetail >

    </root>

     

    读取XML报表并进行解析和打印控制函数

    Private Sub PagePrint(ByVal sender As Object, ByVal ev As PrintPageEventArgs)

      Dim g As Graphics = ev.Graphics

      Dim LastPage As Boolean = False

      Dim pntElement As xmlPrint.PrintElement = Nothing  '声明打印解析类

       Dim node As XmlNode

       For Each node In doc("root")("ReportDetail").ChildNodes   

    '载入XML报表文件,并解析报表内容

    pntElement = xmlPrint.Parser.CreateElement(node)

    '调用解析器生成相应的对象

        Try

          LastPage = pntElement.Draw(g)

    '是否需要分页

          Catch ex As Exception

             Me.lblMsg.Text = ex.Message    

    '是否需要分页

        End Try

     Next node

        ev.LastPage = LastPage

    End Sub

     

    报表中画线的实现函数部分代码如下:

     Public Class Line Inherits PntElement          

    'XML报表解析类中画线函数

    Public Sub New(ByVal Line As XmlNode)

    _node = Line'传入的打印数据,即一个XMLNODE

    End Sub

    Public Overrides Function Draw(ByVal g As Graphics) As Boolean  '画线函数

    Dim S as String

    Dim slgBorder as Single

    S=_node.Attributes("bordercolor").InnerText)

    slgBorder = Single.Parse(

    _node.Attributes("border").InnerText)

    Dim pen As New

    Pen(Color.FromName(S),sglBorder)  '定义画笔

    Dim x1,x2,y1,y2 as Single  'XML中提取坐标


    X1=Single.Parse(_node.Attributes("x1").InnerText)

    X2=Single.Parse(_node.Attributes("x2").InnerText)

    Y1=Single.Parse(_node.Attributes("y1").InnerText)

    Y2=Single.Parse(_node.Attributes("y2").InnerText)

    g.DrawLine(pen,x1,y1,x2,y)    '<SPAN style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New

     
    展开全文
  • java web实现打印功能

    千次阅读 2013-07-16 15:43:27
    直接在网上上进行打印,目前我知道有三种,好吧我承认其实就一种。 1直接右键打印,不好的地方就是如果你有iframe在里面的话其他iframe会一起打印出来。 2用js函数window.print进行打印,好处就是基本上能满足基本...

    直接在网上上进行打印,目前我知道有三种,好吧我承认其实就一种。

    1直接右键打印,不好的地方就是如果你有iframe在里面的话其他iframe会一起打印出来。

    2用js函数window.print进行打印,好处就是基本上能满足基本的打印需求劣势就是无法对具体的打印细节进行控制。附上js方法代码

    function windowprint() {
        debugger;
        var f = document.getElementById("printdiv");
        f.style.display = "";
        window.print();
        //f.style.display = "none";

    3用网上的免费控件进行打印控制。我使用的是ScriptX。

    a.下载相应的Script包,解压将其中的smsx压缩包导入工程,最好和要打印的页面同级目录。


    b.在相应需要打印的页面加入相应的语句如图

    这里的codebase一直有问题,文档上写的是youpath/... ,然后我写了2个都没对就直接说的全路径了。

    c.相应的js方法,并且在代码中添加按钮如图



    最好能重启一下机器,就算不能重启机器也请重启一下IE,然后打印OK。

    展开全文
  • jatoolsPrinter实现web打印功能

    万次阅读 热门讨论 2012-07-31 15:24:39
    实现WEB在线打印功能的方法很多,有些人直接用浏览器自带的打印功能实现在线打印,有些人是用js编码来实现打印功能,更加有些公司把这种功能实现作为一个产品编写给用户使用(像今天要说的jatoolsPrinter控件)··...
  • web 打印web打印控件的三种实现方法 zz 做管理系统的时候,打印一直是个棘手的问题,做B/S的系统这个问题就更加突出了!下面举出三种常用的web打印处理方式 1、利用word或者excel来实现web打印(如果不修改...
  • Web打印实现方法

    千次阅读 2007-05-31 16:35:00
    目前,在做B/S结构程序开发的时候,最棘手和最令人头疼... 我们知道要实现Web方式的打印不外乎三种方法:第一就是利用大家都熟悉的Office工具来实现Web打印,如利用Word或Excel的打印工具来实现Web打印,该方法的难点是
  • 实现WEB打印的几种方法

    千次阅读 2020-08-09 23:37:40
    实现WEB打印的几种方法 当前WEB应用开发非常流行,主要原因是WEB应用客户端的规则很简单,容易学习,容易维护,容易发布,降低了开发难度。但是,WEB应用的打印一直以来却是一个难题,特别是在应用中完成标签打印...
  • web应用票据打印实现(一)

    千次阅读 2015-03-06 10:11:47
    web应用浏览器端票据打印实现 许多web应用的开发中都会涉及到票据打印的功能。常用的Web打印实现的方式有: 1.浏览器打印接口 调用window.print()方法,调用打印机功能打印当前窗口的内容,与单击浏览器的打印...
  • WEB打印实现方法 VBScript

    千次阅读 2009-05-08 12:53:00
    目前,在做B/S结构程序开发的时候,最棘手和最令人头疼的... 我们知道要实现Web方式的打印不外乎三种方法:第一就是利用大家都熟悉的Office工具来实现Web打印,如利用Word或Excel的打印工具来实现Web打印,该方法的难
  • 参数 默认值 接收值 描述 globalStyles true Boolean 是否包含父文档的样式 mediaPrint false Boolean 是否包含... 任何可用的jQuery选择器 不想打印的元素的jQuery选择器 iframe 默认true,如果没有iframe选择器被
  • Web系统报表实现总结

    千次阅读 2009-02-24 20:24:00
    最近由于项目需要,要在web系统中做报表输出及打印,我是基于.net平台实现的,目前了解的方法有1.水晶报表2.微软的报表3.用office 的Excel水晶报表原来在项目中用过,功能很强大,设计能力很强大,网上资料很多,...
  • 使用Web Datawindow ActiveX实现Web页面的打印功能

    千次阅读 热门讨论 2006-12-30 20:25:00
    想起以前说过要把Web Datawindow ActiveX使用经验整理后发出来,由于项目实在是太忙,又想偷懒一直没搞。 转眼间2006快过去了,今年的事情还是把它做了吧。  其实,使用ActiveX本身实在是没有什么难度,Datawindow...
  • Web打印控件Lodop实现证件套打

    千次阅读 2015-01-31 22:19:02
    之所以选用Lodop是因为: 1、兼容性好,主流的浏览器都支持了; 2、插件能实现自动安装提醒,并且不需要其他额外的设置...4、用户设计的打印页面,可以作为个性化的个人设置,系统维护的同一个模板可以适应不同的打印机
  • Web页面分页打印小结-简单实现

    千次阅读 2016-11-30 14:42:37
    最近开发单位内部系统中的档案管理时,档案管理员提出需求,希望在打印档案盒中卷内目录,分页打印,因为目前的打印针对超过一页的档案记录,在第二页中无法显 示表头,还会出现表格断开不连续如图: 档案...
  • Web系统中,打印功能一直是个老大难问题,因此产生了很多第三方的控件,多数要收费,而且跟自己的系统结合有一定的麻烦。系统采用J2EE技术,jsp打印问题同样存在于OA中。 打印方式有三种:一是不经过任何修改,直接...
  • 免费web打印控件ePrint是一个全面强大的web打印的解决方案。... ePrint内含一个在vc7.0上开发的ActiveX控件(180k), 这个控件主要实现打印参数的控制,eprint使用户通过JavaScript脚本可以控制自定义纸张
  • web打印的最佳方案

    千次阅读 2018-11-10 02:03:21
    但现在越来越多的系统是web系统,甚至是移动端。网上也有非常的web打印方案,但各式各样的问题非常多,比如js兼容性,稳定性等一直缠绕着众多的程序员,或者就是web 打印需要浏览器安装 ActiveX 组件,Ac...
  • 纯绿色web打印编辑器,支持自定义数据源、自定义模板、自定义打印的所有内容。可运用于快递单打印、发货单打印、报表打印等。
  • 1、创建Activex对象 var printer = new ActiveXObject("TPrint.mPrinter"); 2、选择打印机 //选择打印机 function selp(){ alert(printer....3、自定义打印 function doprint(){ //开始单据打印 if(printer.
  • 做ERP的时候遇到个报表设计以及打印功能实现,客户的需求大致是:客户端电脑可以直接修改报表模板,点击打印按钮直接调用默认打印机打出报表。免去预览以及打印机设置如设置纸张大小,页眉之类。。。因为客户需要...
  • 问题:java web开发进销存系统,用户需求打印出货单,一开始采取js的window.print方法,测试环境效果不错,挪移到用户那里时打印结果出现字体断断续续不清晰的情况,然而用我的电脑打印时却不会出现如此状况,进而...
  • JS实现打印功能(包括打印预览、打印设置等) 绪 最近在进行项目开发时,需要实现后台管理端打印功能,遂...但我强烈推荐下面的方法,即利用系统本身的打印属性实现打印功能。简单的一条系统调用命令即可实现。 前提条件
  • JS web打印

    千次阅读 2010-01-21 15:48:00
    11.1 Web打印Web打印是一种常用的打印方式,其使用方法简单、方便、快捷,在浏览网页的同时就可以实现打印的功能。实例291 调用IE自身的打印功能实现打印实例说明通过JavaScript调用IE自身的打印功能实现打印,...
  • 但现在越来越多的系统是web系统,甚至是移动端。网上也有非常的web打印方案,但各式各样的问题非常多,比如js兼容性,稳定性等一直缠绕着众多的程序员,或者就是web 打印需要浏览器安装 ActiveX 组件,Acti
  • WEB免费打印控件推荐

    千次阅读 2018-07-22 13:07:05
    WEB系统中,打印的确是个烦人的问题。 要么自己开发打印控件,如果项目时间紧,肯定来不及。 要么购买成熟的打印控件,如果是大项目可以考虑,但如果项目只有几K到1、2W之间,这就麻烦了
  • 一、入门 1、启动HttpPrinter 双击 HttpPrinter_latest/...我们常用的 web打印 在 js 目录下 3、token 干嘛用的 token你可以理解为密码 发送的 token值 要 在 httpprinter的token列表里面 token列表的查看步骤: 系...
  • 关于Web报表FineReport打印的开发应用案例

    千次阅读 多人点赞 2016-08-31 14:26:43
    报表打印是报表使用和开发过程中经常碰到的问题,这里汇总了关于Web报表开发打印功能的一些典型应用案例,以应用最广泛的FineReport为例。
  • BS系统。在服务器存有多个word文件。要求在页面点击打印直接打印。 用户点击打印能够选择打印那些文件,并且能够控制份数。 (PS:文件是用户上传的,无法写死)
  • 系统请求参数和响应参数,进行输出打印。支持表单提交及json提交。 二、过滤器与拦截器  首先,了解一下过滤器和拦截器。两者功能很类似,但具体技术实现,相去甚远。对比两者的区别前,先理解一下AOP,AOP不是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 144,120
精华内容 57,648
关键字:

web系统实现打印