`
cd0281
  • 浏览: 119708 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Web 打印(部分打印)

    博客分类:
  • web
阅读更多
利用WebBrowser彻底解决Web打印问题(包括后台打印) 收藏 
BS架构下的打印大家是怎么解决的呢,我最近作了一个项目正好负责这一块,不仅要求打印页面的特定部分,还要求有后台的批量打印,在网上查了一些资料,最后终于解决了。抱着“取之于众 服务于众”的思想,我总结了一下,把它拿到网上来与大家分享,希望能帮助遇到类似问题的朋友。

我主要使用了IE内置的WebBrowser控件,无需用户下载和安装。WebBrowser有很多功能,除打印外的其他功能就不再赘述了,你所能用到的打印功能也几乎全部可以靠它完成,下面的问题就是如何使用它了。先说显示后打印,后面说后台打印。

1.首先引入一个WebBrowser在需要打印的页面,可以直接添加: 
 
<object id="WebBrowser" classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height="0" width="0"> 
</object> 

到页面,或者使用JavaScript在需要的时候临时添加也可以:


document.body.insertAdjacentHTML("beforeEnd",
    "<object id=\"WebBrowser\" width=0 height=0 \
classid=\"clsid:8856F961-340A-11D0-A96B-00C04FD705A2\">");

2 .页面设置和打印预览

如下所示,直接调用即可


document.all.WebBrowser.ExecWB(6,6)   直接打印
document.all.WebBrowser.ExecWB(8,1)   页面设置
document.all.WebBrowser.ExecWB(7,1)   打印预览

或者:

execScript("document.all.WebBrowser.ExecWB 7, 1","VBScript"); 

3 隐藏不打印的页面元素和分页

 CSS 有个Media 属性,可以分开设置打印和显示的格式。
如 <style media="print" type="text/css"> …</style> 中间的格式将只在打印时起作用,不会影响显示界面。
所以可以设定
<style media="print" type="text/css"> 
.Noprint{display:none;} 
.PageNext{page-break-after: always;} 
</style> 
然后给不想打印的页面元素添加: class="Noprint" ,那就不会出现在打印和打印预览中了。
想分页的地方添加:  <div class="PageNext"></div> 就可以了。

4.打印页面的特定部分

我是通过将需要打印的特定部分另建一个页面,然后装入主页面的一个IFrame中,再调用IFrame的打印方法,只打印IFrame中的内容实现的。
如:
<iframe style="visibility: visible" name="FrameId" width="100%" height="30%" src="NeedPrintedPage.asp"></iframe>
下面的pringFrame  js函数将只打印Iframe中的内容,可以直接引用使用,如printFrame(FrameId);


window.print = printFrame;

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

  function execOnFinish() {
    switch ( typeof(onfinish) ) {
      case "string": execScript(onfinish); break;
      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);
}


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

Iframe中所装载页面的打印效果在所装载页面设置就可以了,如分页等。

5.后台打印

我是通过建一个隐藏Iframe实现的,当然仍然会有页面装载的过程。
下面的函数创建Iframe装载页面并打印。如 printHidden(url)  //url为页面地址

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();
  }
  printFrame(printHiddenFrame.printMe, onfinish);
}

它用到了printFrame,所以别忘了引用前面的函数。


总之,WebBroswer已经为我们提供了解决方案,我们只要结合需求把它应用好就行了。
分享到:
评论

相关推荐

    免费web打印控件评测

    根据个人的实际使用体会,写了一些自己在使用网上大部分的免费网页打印控件的体会。

    Web Html 分页、表格跨页断裂处理、自定义页眉页脚页码打印控件

    Web打印控件,完美解决以下HTML打印难题 1.Web Html 分页打印 2.内容、图片、表格跨页断裂,封边 3.table并行、并列双边、重边 4.自动计算页码(总数及每一页),样式、位置、形式完全个性化 5.页眉页脚,去除浏览...

    利用WebBrowser彻底解决Web打印问题(包括后台打印)

    【利用WebBrowser彻底解决Web打印问题(包括后台打印) 】利用WebBrowser彻底解决Web打印问题(包括后台打印)BS架构下的打印大家是怎么解决的呢,我最近作了一个项目正好负责这一块,不仅要求打印页面的特定部分,...

    jsp页面如何实现web打印

    通过将需要打印的特定部分另建一个页面,然后装入主页面的一个IFrame中,再调用IFrame的打印方法,只打印IFrame中的内容实现的。 如: &lt;iframe visible" name="FrameId" width="100%" height="30%" src=...

    在UniApp中集成Lodop实现APP打印标签功能-库文件源代码

    在示例代码部分,我们将提供一些简单的示例代码,用于演示如何使用Lodop打印标签。最后,我们还将提供一些相关的技术资料,包括Lodop的文档和示例代码等,帮助读者更好地理解和掌握该技术的实现原理和应用场景。 ...

    WinForm的2种活动页截屏打印方法

    这个是我自己做的关于截屏打印程序,其实也亏了各位CSDN的大虾的帮助,集成起来的一种成果。里面还有最新的IP获得方法,旧的已经在CSDN里面过时了!

    web打印 window.print()介绍

    我只给出比较有效的,方便的打印方法,有些WEB打印是调用ActiveX控件的,这样就需要用户去修改自己IE浏览器的Internet选项里的安全里的ActiveX,将它们全部启用,有些麻烦,翻了下网络,下面的方法是可以直接打印,...

    Wince 打印 Pcl3 5语言大全

    但相对来说,由于对打印机核心部分——打印控制器性能的要求较高,一定程度会增加机器成本,尤其是PostScript对打印控制器的性能更高。 3.经过对多款使用PCL语言和PostScript语言的黑白和彩色激光打印机进行测试。...

    Web打印解决方案之证件套打的实现思路

    在前面介绍过《Web打印解决方案之普通报表打印功能》的一片文章中提到过那个打印控件Lodop,做起套打来感觉还是挺方便的,至少位置调整界面不需要自己弄,位置嘛,也提供了自动保存的功能,不需要理会。 一般的套打...

    Web开发框架

    整个Web开发框架,界面部分采用较新的技术,包括MVC4,最新版本的EasyUI,以及以及Uploadify文件上传组件、LODOP打印组件、CKEditor富文本编辑控件、Tags-Input标签录入控件、HighCharts图表展示控件、Word/Excel...

    ZedGraph winform打印 统计报表 打印组建 统计组件.NET2.0

    ZedGraph winform打印 统计报表 打印组建 统计组件 源代码.NET2.0 ZedGraphV515是C#编写的.NET类库,提供了用户控件和web控件。它可以创建2D的线性图、条形图和饼图。 它功能完整且有详细的功能自定义。 基于LGPL...

    React如何实现浏览器打印部分内容详析

    浏览器打印的本质还是将web页面中的元素打印出来而已。 1. 构建待打印元素 在页面中构建一个display为none的元素,里面的内容为你需要打印的内容。我们还需要设置包裹打印内容的元素的ref属性,以便于后面获取到...

    有字填空证书纸张内容打印调整工具

    适用于证书部分字体已经印在了专门的纸上,打印机仅负责打印所空的内容这种情况,由于打印机的不同不能使用统一的距离设置,所以要求每个字段都可以调整位置,该插件可以实现对打印内容位置进行调整。

    awp2cerner:用于解析AHLTA Web打印中的数据并将其输入到Cerner的工具

    awp2cerner 用于解析AHLTA Web打印中的数据并将其输入到Cerner的工具步骤1:产生扩充功能清单使用动态工作清单来生成有经验的患者的清单。 生成列表后,将其导出为逗号分隔的值文件(.csv)步骤2:取得病历对于此...

    基于 Java+MySQL 实现(Web)高校竞赛报名管理系统【100011045】

    开发一个高校竞赛报名管理系统,采用 Web 方式,由前台和后台管理两个部分组成。前台作为与用户 直接交互的可视化界面,后台管理的维护工作主要由系统管理员进行,包括完成对数据的保护和修改。使之能提供以下基本...

    ASP.NET程序开发范例宝典 第4章 常用Web服务器控件

    内容包括搭建ASP.NET开发环境、HTML开发与实践、CSS样式与JavaScript脚本应用、常用Web服务器控件、验证控件、高级...打印、XML技术、Web Service、ASP.NET高级应用、ASP.NET安全机制、综合实例、网站设计与网页配色等...

    基于ssm+Vue的某理工学院网上打印服务平台(源码+部署说明+系统介绍+数据库).zip

    系统介绍部分对项目的整体架构和功能进行了简要概述,包括用户管理、权限控制、打印任务管理等功能模块。这有助于您快速了解项目的运行原理和主要功能。数据库部分提供了项目所使用的数据库结构设计和SQL语句,方便...

Global site tag (gtag.js) - Google Analytics