最近遇到項(xiàng)目中需要在瀏覽器中一鍵打印 遠(yuǎn)程PDF文件,經(jīng)過(guò)網(wǎng)上搜集資料最終選擇了在客戶(hù)端安裝adobe reader后,實(shí)現(xiàn)上從服務(wù)器端下載一個(gè)pdf文件流,在IE中用adobe插件打開(kāi)(在前臺(tái)頁(yè)面中隱藏Object標(biāo)簽),然后用adobe的打印菜單通過(guò)PRintWithDialog()打印。 源碼如下:
function bulkpdfPrint(srcFile){ var pdf = document.getElementById("createPDF"); if (pdf != undefined && pdf != null) {//判斷pdf對(duì)象是否存在,如果存在就刪除該對(duì)象 var parentNode = pdf.parentNode; parentNode.removeChild(pdf); } var p = document.createElement("object"); p.id = "createPDF"; p.classid = "CLSID:CA8A9780-280D-11CF-A24D-444553540000"; p.width = 1; p.height = 1;//若為0,在IE8中出錯(cuò) p.src = encodeURI(encodeURI(srcFile));//解決中文pdf無(wú)法打開(kāi) document.body.appendChild(p); p.printAll();}打開(kāi)瀏覽器窗口,頁(yè)面中進(jìn)行打印,開(kāi)始點(diǎn)擊打印時(shí),彈出一個(gè)新的窗口window.open(url,”_blank”);//url為生成PDF的url,在這個(gè)新的頁(yè)面中有PDF文件的內(nèi)容,而且網(wǎng)頁(yè)上也剛剛有打印的功能,這種看起來(lái)是最簡(jiǎn)單的,但是對(duì)用戶(hù)而言,需要點(diǎn)擊二次按鈕才能真正打印。所以,用戶(hù)體驗(yàn)不會(huì)太好。adobe reader插件的方法,獲取遠(yuǎn)程PDF文件URL,如果用戶(hù)安裝了PDF的瀏覽器支持,打開(kāi)后用戶(hù)的瀏覽器可以直接在瀏覽器中運(yùn)行adobe reader加載項(xiàng)。然后由用戶(hù)選擇是否打印(一鍵打印PrintAll()或者PrintwithDialog())。實(shí)現(xiàn)簡(jiǎn)單,但需安裝Adobe,在安裝中一定程度上相當(dāng)影響用戶(hù)體驗(yàn)。本文最終選擇這種方法。百度文庫(kù)的方法,使用Flash制作一個(gè)PDF閱讀器,在flash上面加上打印按鈕,不用用戶(hù)安裝了adobe reader閱讀器,實(shí)現(xiàn)的技術(shù)卻很高,而且用戶(hù)要求不進(jìn)行預(yù)覽。瀏覽器window.print()的方法,利用iframe,將PDF文件的內(nèi)容包含其中,這個(gè)時(shí)候調(diào)用window.print()來(lái)彈出打印窗口。瀏覽器打印功能菜單的一種程序調(diào)用。與點(diǎn)擊打印功能菜單一樣,不能精確分頁(yè),不能設(shè)置紙型,可以讓用戶(hù)不用去點(diǎn)菜單,直接點(diǎn)擊網(wǎng)頁(yè)中的一個(gè)按鈕,或一個(gè)鏈接里面調(diào)用。 代碼如下://創(chuàng)建一個(gè)空的iframe,因?yàn)槿绻看握?qǐng)求都生成PDF,那么是不必要的。<iframe style="display:none" id="printIframe"></iframe>$(document).ready(function(){ .... $("#printIframe").load(function(){//等待iframe加載完成后再執(zhí)行doPrint.每次iframe設(shè)置src之后都會(huì)重新執(zhí)行這部分代碼。 doPrint(); }); ....});//點(diǎn)擊打印按鈕,觸發(fā)事件function printPDF(){ var src = $("#printIframe").attr("src"); if(!src){//當(dāng)src為空,即第一次加載時(shí)才賦值,如果是需要?jiǎng)討B(tài)生成的話,那么條件要稍稍變化一下 $("#printIframe").attr("src","./attachment/Images.pdf");//暫時(shí)靜態(tài)PDF文件 }else $("#printIframe")[0].contentWindow.print();//不知為什么在IE中一直無(wú)法打印文件}不知為什么我在IE中一直無(wú)法打印PDF文件,此外要使用瀏覽器自帶的打印功能,還需要去掉那些頁(yè)眉頁(yè)腳信息。 一、通過(guò)javaScript 程序來(lái)設(shè)置,其實(shí)主要是用ActiveX控件來(lái)實(shí)現(xiàn),出于安全方面的考慮,現(xiàn)在大多數(shù)瀏覽器已經(jīng)禁用了“對(duì)未標(biāo)記為可安全執(zhí)行腳本的ActiveX控件初始化并執(zhí)行腳本”這一功能。如下圖所示, 這個(gè)是以IE 8為例說(shuō)明的,具體位置在:工具->Internet 選項(xiàng)->安全(最上面一排標(biāo)簽的第二個(gè))->選中“Internet”圖標(biāo)時(shí),單擊“自定義級(jí)別”
因?yàn)檫@一功能是禁用的,所以通常Javascript或者其他腳本都無(wú)法生效,即無(wú)法通過(guò)程序直接實(shí)現(xiàn),需要先解除這一禁止項(xiàng),程序才能起作用,但解除禁止項(xiàng)后會(huì)帶來(lái)安全方面的隱患。
相關(guān)JavaScript代碼:
<script language="javascript"><!--var HKEY_Path = "HKEY_CURRENT_USER//Software//Microsoft//Internet Explorer//PageSetup//"; // 定義注冊(cè)表位置// name的值可為header(頁(yè)眉),footer(頁(yè)腳),margin_bottom(下邊距margin_left(左邊距),margin_right(右邊距),margin_top(上邊距)。function PageSetup(name,value) {try { var Wsh = new ActiveXObject("WScript.Shell"); Wsh.RegWrite(HKEY_Path+name,value); // 修改注冊(cè)表值}catch(e) { //alert(e.name+" "+e.message); //alert('需要運(yùn)行ActiveX對(duì)象后,才能進(jìn)行打印設(shè)置。');}}function setit() {PageSetup("footer","");PageSetup("header","");window.print();}//--></script>二、直接修改瀏覽器的設(shè)置,還是以IE8為例來(lái)進(jìn)行說(shuō)明
打開(kāi)要打印的網(wǎng)頁(yè)后,單擊“文件”->“打印預(yù)覽”->頁(yè)面設(shè)置(圖標(biāo),如下圖所示)->頁(yè)眉和頁(yè)腳都設(shè)置為空,這樣設(shè)置后,打印的時(shí)候就不會(huì)出現(xiàn)頁(yè)眉頁(yè)腳信息了。
三、直接修改注冊(cè)表
打開(kāi)記事本,復(fù)制下面的程序
Windows Registry Editor Version 5.00[HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/PageSetup]"footer"="""header"=""另存為“去掉頁(yè)眉頁(yè)腳.reg”,然后雙擊運(yùn)行,確認(rèn)即可。 收藏一個(gè)JS 實(shí)現(xiàn)簡(jiǎn)單的頁(yè)面局部打印的方法 :
function preview(oper) ...{ if (oper < 10)...{ bDHTML=window.document.body.innerHTML;//獲取當(dāng)前頁(yè)的html代碼 sprnstr="<!--startprint"+oper+"-->";//設(shè)置打印開(kāi)始區(qū)域 eprnstr="<!--endprint"+oper+"-->";//設(shè)置打印結(jié)束區(qū)域 prnhtml=bdhtml.substring(bdhtml.indexOf(sprnstr)+18); //從開(kāi)始代碼向后取html prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr));//從結(jié)束代碼向前取html window.document.body.innerHTML=prnhtml; window.print(); window.document.body.innerHTML=bdhtml; } else ...{ window.print(); } }使用很簡(jiǎn)單 將頁(yè)面內(nèi)要打印的內(nèi)容加入中間XXXXX 再加個(gè)打印按紐 onclick=preview(1)
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Webapplication2.Test" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title> <script type="text/javascript" language="javascript"> function printdiv() { var newstr = document.getElementById("PrintContentDiv").innerHTML; //獲得需要打印的內(nèi)容 // alert(newstr); var oldstr = document.body.innerHTML; //保存原先網(wǎng)頁(yè)的代碼 document.body.innerHTML = newstr; //將網(wǎng)頁(yè)內(nèi)容更改成需要打印 window.print(); document.body.innerHTML = oldstr; //將網(wǎng)頁(yè)還原 return false; } //打印頁(yè)面預(yù)覽 function printpreview() { var WebBrowser = '<OBJECT ID="WebBrowser1" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>'; document.getElementById("divButton").style.display = "none";//隱藏打印及其打印預(yù)覽頁(yè)面 document.body.insertAdjacentHTML('beforeEnd', WebBrowser); //在body標(biāo)簽內(nèi)加入html(WebBrowser activeX控件) WebBrowser1.ExecWB(7, 1); //打印預(yù)覽 }新聞熱點(diǎn)
疑難解答
圖片精選