当前位置:编程学习 > C#/ASP.NET >>

web 套打的一些经验,希望能给需要的兄弟们一些帮助

    最近做了一个项目,并不大。但用到WEB打印这方面内容,没想中间遇到很多问题,曾在网上找过许多解决方案,有些控件但是国内的基本都是需要注册收费的,只有国外的一个ScriptX是免费的,看到许多人用,但这个控件被IE等众多的安全工具所困扰,常常需要设置一堆东西,对于电脑水平不是很高客户来说确实很麻烦,不过我也只用它去掉了IE打印的页眉页脚,打印还是用的IE的WEBBROWSER,不说费话了,下面先介绍一下我思路。
    由于是要套打,所以套打的页面不可能给用户看,需要单独制作一个套打的页面,只有要打印的内容,位置用<DIV  style="LEFT: 35mm; FONT: 9pt 宋体; POSITION: absolute; TOP: 75mm">打印内容</DIV>其中,left 是你打印纸从最左边到内容的距离,top 是从纸最上边到打印内容的距离,这个距离要用尺量好,并且减去19.05,这个数是IE页面设置中页距的上下左右的默认值,不减就对不准了。
    下面是在网上找到一个脚本,专门是用来调用套打页面的,并根据我的需要做了点改动。
window.print = printFrame;

// main stuff
function printFrame(frame, onfinish) {
 
  if ( !frame ) frame = window;

  function execOnFinish() {
        switch ( typeof(onfinish) ) {
        case "string": alert('print... '); break;//execScript(onfinish)
        case "function": onfinish();
        }
    if ( focused && !focused.disabled ) focused.focus();
  }
 

  if (( frame.document.readyState !== "complete") &&( !frame.document.confirm("The document to print is not downloaded yet! Continue with printing?") ))
  {
    execOnFinish();
    return;
  }

 
    var eventScope = printGetEventScope(frame);
    var focused = document.activeElement;
     
    window.printHelper = function() {
        execScript("on error resume next: printWB.ExecWB 6, 1", "VBScript");
        printFireEvent(frame, eventScope, "onafterprint");
        printWB.outerHTML = "";
        execOnFinish();
        window.printHelper = null;
    }
 
    document.body.insertAdjacentHTML("beforeEnd",
        "<object id=\"printWB\" width=0 height=0 \
        classid=\"clsid:8856F961-340A-11D0-A96B-00C04FD705A2\">");
     
    printFireEvent(frame, eventScope, "onbeforeprint");
    frame.focus();
    window.printHelper = printHelper;
    setTimeout("window.printHelper()", 0);
}
function hideButton()
{
      document.getElementById("btn_Back").style.display = "none";
}
 
function printFixedApp()
{
   if(confirm('确定要打印吗?'))//这些是我自己加的,业务需要隐藏点过的按钮
    {           
        document.getElementById("btn_Back").style.display = "none";
        document.getElementById("btn_print").style.display = "none";      
        document.getElementById("btn_modify").style.display = "none";
       
        printHidden("printPage_fixed.aspx");//里面是套打的页面
      
    }
}
function printHidden(url) {
  document.body.insertAdjacentHTML("beforeEnd",
    "<iframe name=printHiddenFrame width=0 height=0></iframe>");
  var doc = printHiddenFrame.document;
  doc.open();
  doc.write("<body onload=\"parent.onprintHiddenFrame()\">");
  doc.write("<iframe name=printMe width=0 height=0 src=\"" +
      url + "\"></iframe>");
  doc.write("</body>");
  doc.close();
}

function onprintHiddenFrame() {
  function onfinish() {
    printHiddenFrame.outerHTML = "";
    if ( window.onprintcomplete )
    {
        window.onprintcomplete();
        alert("print completed!");
    }
     window.location.href = "ApplicationBillView_fixed.aspx";//打印完成后转到其它页   
  }
  printFrame(printHiddenFrame.printMe, onfinish);
}

// helpers
function printIsNativeSupport() {
  var agent = window.navigator.userAgent;
  var i = agent.indexOf("MSIE ")+5;
  return parseInt(agent.substr(i)) >= 5 && agent.indexOf("5.0b1") < 0;
}

function printFireEvent(frame, obj, name) {
  var handler = obj[name];
  switch ( typeof(handler) ) {
    case "string": frame.execScript(handler); break;
    case "function": handler();
  }
}

function printGetEventScope(frame) {
  var frameset = frame.document.all.tags("FRAMESET");
  if ( frameset.length ) return frameset[0];
  return frame.document.body;
}
剩下的就等着打印机干活吧。
--------------------编程问答--------------------
收藏了,谢谢
--------------------编程问答-------------------- 最烦的就是打印了,谢谢LZ先 --------------------编程问答-------------------- 试了下`~不过好象有问题,没办法调试成功,提示缺少")"!!我是将代码写在JS文件中然后引用打印函数,不知道这样对不对?另外我研究了下代码,好象也没发现什么语法错误啊,请指教!!!! --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 收藏了,谢谢  --------------------编程问答-------------------- mark --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 也留个名 --------------------编程问答-------------------- 看不是很明白 能不能把HTML也贴出来啊 --------------------编程问答-------------------- 使用时为铵钮加入onclick事件就行:<INPUT id="btn_print" onclick="printFixedApp();" type="button" value=" 打  印  "> --------------------编程问答-------------------- 不能执行呀. --------------------编程问答-------------------- 收藏 --------------------编程问答-------------------- 我学习... --------------------编程问答-------------------- mark! --------------------编程问答-------------------- 最烦的就是打印了,谢谢LZ先 --------------------编程问答-------------------- 这样的办法太麻烦,效果也不好,还是要用报表插件比较合适。介绍是一个C/S与B/S集成报表工具,功能全面易学易用

Grid++Report C/S报表适用于VB.NET、C#.NET、VB、VC、Delphi、C++Builder、VFP、易语言等开发工具。Grid++Report  WEB报表适用于ASP、ASP.NET、JSP、PHP等,在网页客户端具有灵活的脚本(JavaScript/VBScript)控制能力。开发桌面报表与WEB报表共享相同的开发知识与设计资源,大大提高报表开发的效率。

产品功能除了提供报表的打印、打印预览、数据导出等,还提供独有的报表查询显示功能。实现表格报表、动态报表、多层表头、分栏报表、票据套打、交叉表及各种格式报表非常简便。提供了每种编程开发工具下的丰富例程与详尽的帮助文档,安装程序中包含丰富的可运行例子,安装后即刻体验此报表组件。

用Grid++Report比水晶报表容易多了,功能也很强大,运行速度更快。花几分钟时间看看演示吧。
产品网站: http://www.rubylong.cn/
演示地址: http://www.rubylong.cn/webreport
下载地址: http://www.rubylong.cn/download/Grid++Report4.5cn_plusweb.zip --------------------编程问答-------------------- 收藏 --------------------编程问答-------------------- 收藏
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,