最近遇到項目中需要在瀏覽器中一鍵打印 遠程PDF文件,經過網上搜集資料最終選擇了在客戶端安裝adobe reader后,實現上從服務器端下載一個pdf文件流,在IE中用adobe插件打開(在前臺頁面中隱藏Object標簽),然后用adobe的打印菜單通過PRintWithDialog()打印。 源碼如下:
function bulkpdfPrint(srcFile){ var pdf = document.getElementById("createPDF"); if (pdf != undefined && pdf != null) {//判斷pdf對象是否存在,如果存在就刪除該對象 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中出錯 p.src = encodeURI(encodeURI(srcFile));//解決中文pdf無法打開 document.body.appendChild(p); p.printAll();}打開瀏覽器窗口,頁面中進行打印,開始點擊打印時,彈出一個新的窗口window.open(url,”_blank”);//url為生成PDF的url,在這個新的頁面中有PDF文件的內容,而且網頁上也剛剛有打印的功能,這種看起來是最簡單的,但是對用戶而言,需要點擊二次按鈕才能真正打印。所以,用戶體驗不會太好。adobe reader插件的方法,獲取遠程PDF文件URL,如果用戶安裝了PDF的瀏覽器支持,打開后用戶的瀏覽器可以直接在瀏覽器中運行adobe reader加載項。然后由用戶選擇是否打印(一鍵打印PrintAll()或者PrintwithDialog())。實現簡單,但需安裝Adobe,在安裝中一定程度上相當影響用戶體驗。本文最終選擇這種方法。百度文庫的方法,使用Flash制作一個PDF閱讀器,在flash上面加上打印按鈕,不用用戶安裝了adobe reader閱讀器,實現的技術卻很高,而且用戶要求不進行預覽。瀏覽器window.print()的方法,利用iframe,將PDF文件的內容包含其中,這個時候調用window.print()來彈出打印窗口。瀏覽器打印功能菜單的一種程序調用。與點擊打印功能菜單一樣,不能精確分頁,不能設置紙型,可以讓用戶不用去點菜單,直接點擊網頁中的一個按鈕,或一個鏈接里面調用。 代碼如下://創建一個空的iframe,因為如果每次請求都生成PDF,那么是不必要的。<iframe style="display:none" id="printIframe"></iframe>$(document).ready(function(){ .... $("#printIframe").load(function(){//等待iframe加載完成后再執行doPrint.每次iframe設置src之后都會重新執行這部分代碼。 doPrint(); }); ....});//點擊打印按鈕,觸發事件function printPDF(){ var src = $("#printIframe").attr("src"); if(!src){//當src為空,即第一次加載時才賦值,如果是需要動態生成的話,那么條件要稍稍變化一下 $("#printIframe").attr("src","./attachment/Images.pdf");//暫時靜態PDF文件 }else $("#printIframe")[0].contentWindow.print();//不知為什么在IE中一直無法打印文件}不知為什么我在IE中一直無法打印PDF文件,此外要使用瀏覽器自帶的打印功能,還需要去掉那些頁眉頁腳信息。 一、通過javaScript 程序來設置,其實主要是用ActiveX控件來實現,出于安全方面的考慮,現在大多數瀏覽器已經禁用了“對未標記為可安全執行腳本的ActiveX控件初始化并執行腳本”這一功能。如下圖所示, 這個是以IE 8為例說明的,具體位置在:工具->Internet 選項->安全(最上面一排標簽的第二個)->選中“Internet”圖標時,單擊“自定義級別”
因為這一功能是禁用的,所以通常Javascript或者其他腳本都無法生效,即無法通過程序直接實現,需要先解除這一禁止項,程序才能起作用,但解除禁止項后會帶來安全方面的隱患。
相關JavaScript代碼:
<script language="javascript"><!--var HKEY_Path = "HKEY_CURRENT_USER//Software//Microsoft//Internet Explorer//PageSetup//"; // 定義注冊表位置// name的值可為header(頁眉),footer(頁腳),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); // 修改注冊表值}catch(e) { //alert(e.name+" "+e.message); //alert('需要運行ActiveX對象后,才能進行打印設置。');}}function setit() {PageSetup("footer","");PageSetup("header","");window.print();}//--></script>二、直接修改瀏覽器的設置,還是以IE8為例來進行說明
打開要打印的網頁后,單擊“文件”->“打印預覽”->頁面設置(圖標,如下圖所示)->頁眉和頁腳都設置為空,這樣設置后,打印的時候就不會出現頁眉頁腳信息了。
三、直接修改注冊表
打開記事本,復制下面的程序
Windows Registry Editor Version 5.00[HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/PageSetup]"footer"="""header"=""另存為“去掉頁眉頁腳.reg”,然后雙擊運行,確認即可。 收藏一個JS 實現簡單的頁面局部打印的方法 :
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(); } }使用很簡單 將頁面內要打印的內容加入中間XXXXX 再加個打印按紐 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; //獲得需要打印的內容 // alert(newstr); var oldstr = document.body.innerHTML; //保存原先網頁的代碼 document.body.innerHTML = newstr; //將網頁內容更改成需要打印 window.print(); document.body.innerHTML = oldstr; //將網頁還原 return false; } //打印頁面預覽 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";//隱藏打印及其打印預覽頁面 document.body.insertAdjacentHTML('beforeEnd', WebBrowser); //在body標簽內加入html(WebBrowser activeX控件) WebBrowser1.ExecWB(7, 1); //打印預覽 }新聞熱點
疑難解答