批量打印之jquery局部打印和smsx.cab打印联合使用
前面之所以讲Jquery的打印和smsx.cab打印,是因为最近用的项目里边需要把两个都结合起来才能实现效果。
基本业务是这样子的:同时打印多个人的简历,要求每个人的打5份,自动打印,且有进度条显示。
为什么需要用到两种打印方式:既然是自动打印就不能弹出打印机选择框那么只能是smsx.cab,而使用
smsx.cab打印时就需要将进度条信息隐藏起来否则进度条也会被打印进去。所以两个要综合起来用。
最后的思路就是:打印时使用smsx.cab设置好打印机弹出框信息和页眉页脚页边距,然后使用Jquery局部打印的原理将打印内容和样式拷贝到一个新的iframe中,再调用smsx.cab进行打印。
效果就不截图了,直接上代码:
1、打印的基本机构:这里是打印了5个人的,若有多的人直接在后面添加div即可。进度条的样式已上传到附件。
<%--需要打印的内容--%> <div class="box" id="page1">简历基本信信息</div><%--当前正在打印 --%> <div class="box" id="page2" style="display: none;">简历基本信信息</div> <div class="box" id="page3" style="display: none;">简历基本信信息</div> <div class="box" id="page4" style="display: none;">简历基本信信息</div> <div class="box" id="page5" style="display: none;">简历基本信信息</div> <%--进度条 --%> <div id="container"> <div class="content"> <p id="allUserInfo"></p> <p>正在打印:<span id="curUserInfo"></span></p> </div> <div id="progress_bar" class="ui-progress-bar ui-container"> <div class="ui-progress" id="ui-progress" style="width: 0%;"> <span class="ui-label"><b class="value" id="curProgress">0%</b></span> </div> </div> </div> <%-- 遮罩层 --%> <div id="zhegai" style="z-index:100;width:100%;height: 100%;top:0px;left:0px;position:absolute;filter:Alpha(Opacity=50);background:#000000;-moz-opacity: 0.5; opacity:.50; " ></div>
2、js处理:
var count = '${count}';//总共有几个人的简历需要打印 var userInfo = '${userInfo}';//打印简历的人的姓名,字符串,以中文半角的逗号分开 var printContent = "打印简历的人员:"+userInfo; var pages = 5;//打印5份 var array = userInfo.split(","); var current = 1; var iframe = null;//打印用的iframe var timeOut = (pages*3*2)*1000;//30秒之后再执行下一个:假设每个人的简历有3页每页打2秒 $(function() { $("#allUserInfo").text(printContent);//显示需要打印的所有内容 unScroll();//禁止滚动条滚动 printTZS();//页面加载完成后直接打印 }); // 主页面不允许右键(兼容多浏览器) document.oncontextmenu=function(e){ return false; }; //禁止页面点击 $(document).click(function(event){ return false; }); //该方法用来打印简历信息 function printTZS(){ //计算进度条信息 calcProgress(); //移除已经打印完成的简历信息 if(current>1){//说明至少到第二个人了,那么需要移除掉前面的人的简历信息 $("#page"+(current-1)).remove(); } //显示正在打印的简历信息 $("#page"+current).show(); //进行打印 printArea($("#page"+current)); current++; //循环打印 if(current<=count){//说明还没有打完,那么继续打 //printTZS(); window.setTimeout(function(){ printTZS();//timeOut秒后再打 }, timeOut); }else{//说明打印完成,跳转到上一页 history.back(); } } //该方法用来计算进度条信息 function calcProgress(){ //显示进度条信息 $("#curUserInfo").text(array[current-1]);//当前正在打印的简历信息 //计算进度 var progress = ((current/count).toFixed(2))*100; //alert(progress); $("#ui-progress").css("width",progress+"%"); $("#curProgress").text(progress+"%"); } //禁止滚动条滚动 function unScroll() { var top = $(window).scrollTop(); $(window).scroll(function() { $(window).scrollTop(top); }); } /** *该方法用来打印简历信息(根据Jquery的局部打印进行修改而来) *@param obj:需要进行打印的区域 */ function printArea(obj){ var $this = $(obj); if(current==1){//说明是第一次打印,那么需要添加iframe var iframeId = "printArea";//iframe的id var iframeStyle = "position:absolute;width:0px;height:0px;left:-500px;top:-500px;"; iframe = document.createElement("IFRAME");//创建ifreame //添加属性 $(iframe).attr({ style : iframeStyle, id : iframeId }); document.body.appendChild(iframe);//添加到document中 var doc = iframe.contentWindow.document; //添加css样式 $(document).find("link").filter(function() { return $(this).attr("rel").toLowerCase() == "stylesheet"; }).each(function() { doc.write('<link type="text/css" rel="stylesheet" href="' + $(this).attr("href") + '" >'); }); //添加Object控件 doc.write("<OBJECT id=\"factory\" codeBase=\"redist/smsx.cab#Version=6,3,434,26\" height=\"0\" width=\"0\" classid=\"clsid:1663ed61-23eb-11d2-b92f-008048fdd814\" viewastext></OBJECT>"); } var doc = iframe.contentWindow.document; //清空先前打印的数据 var $printNode = $(doc.getElementById("printDiv")); $printNode.remove(); //添加盛放打印内容的div var printNode = doc.createElement("div");//创建ifreame printNode.setAttribute("id","printDiv"); printNode.setAttribute("class",$this.attr("class")); doc.body.appendChild(printNode);//添加到document中 $printNode = $(printNode); //将需要打印的内容添加iframe中 var html = $this.html(); for(var i=0;i<pages;i++){//打印pages份 if(i==0){$printNode.html(html);} else{$printNode.append(html);} //除了最后一份,其他(pages-1)份最后都需要添加分页打印的代码 if(i<pages-1){ $printNode.append("<div style=\"page-break-before: always;width: 500px;\" ></div>"); } } doc.close();//关闭文档 //调用iframe框进行打印 var frameWindow = iframe.contentWindow; frameWindow.close(); frameWindow.focus(); var factory = frameWindow.document.getElementById("factory"); //进行打印设置 factory.printing.header = ""; // 页眉 factory.printing.footer = ""; // 页脚 factory.printing.portrait = true; // true为纵向打印,false为横向打印 factory.printing.leftMargin = 19.05; factory.printing.topMargin = 0; factory.printing.rightMargin = 0; factory.printing.bottomMargin = 0; factory.printing.Print(false);//进行打印,false:不弹出打印框让选择打印机 }
说明:${count}和 ${userInfo}都是从后台传递过来的数据。
相关推荐
EdwardSiCong 2020-11-23
85477104 2020-11-17
hhanbj 2020-11-17
81427005 2020-11-11
seoppt 2020-09-13
honeyth 2020-09-13
WRITEFORSHARE 2020-09-13
84483065 2020-09-11
momode 2020-09-11
85477104 2020-08-15
83510998 2020-08-08
82550495 2020-08-03
tthappyer 2020-08-03
84901334 2020-07-28
tthappyer 2020-07-25
TONIYH 2020-07-22
tztzyzyz 2020-07-20
83510998 2020-07-18
81463166 2020-07-17