網(wǎng)站建設頁面打印實現(xiàn)方式
發(fā)表日期:2018-04-16 10:50:34 文章編輯: 瀏覽次數(shù):
WEB打印實例教程
做Web開發(fā)的人員一定都會面臨一個共同的難題,那就是打印。的確,相對于Windows桌面應用程序來講,Web應用程序的打印有種種限制,技術人員在項目開發(fā)過程中經(jīng)常會遇到用戶這樣或那樣的需求. 做過桌面應用開發(fā)的人都會非常熟悉水晶報表、Active Report之類的報表控件,它們不僅有簡單靈活的設計界面,更具有非常強大的報表功能,能滿足各種報表的打印需求。而Web應用則因為其特殊的呈現(xiàn)方式,只能尋求其他的解決方案?,F(xiàn)在我們來分析一下目前已經(jīng)成形的Web打印方案:
現(xiàn)有的Web打印控制技術分成幾種方案:
一.自定義控件完成打印
利用IE 自帶的WebBrowser 控件實現(xiàn)打印
利用第三方控件實現(xiàn)打印
1、自定義控件方式
自定義控件方式就是利用VB 或VC 等工具生成COM 組件,用定義好的打印格式來分析打印源文件從而實現(xiàn)打印。只有將生成的組件下載并注冊到客戶機上,才能實現(xiàn)在客戶端的
打印。
難點主要是定義打印格式、如何來分析打印源文件?,F(xiàn)有的比較好的方法是利用XML 技術來全面的解決問題,利用XML 可以非常容易地定義打印目標的文本、表格等內容的格式。
但對程序員的開發(fā)要求高,難度比較大。
2、利用WebBrowser 實現(xiàn)Web打印
WebBrowser是IE 內置的瀏覽器控件,無需用戶下載。本文檔所討論的是有關IE6.0 版本 的WebBrowser 控件技術內容。與其相關的技術要求有:打印文檔的生成、頁面設置、打印操作的實現(xiàn)等幾個環(huán)節(jié)。
(一)、打印文檔的生成
1、客戶端腳本方式
客戶端腳本分為VBScript、JavaScript、JScript 幾種腳本語言。在IE 下開發(fā)應用使用的語法為JScript 的語法,由于它和JavaScript 幾乎沒有什么區(qū)別,所以也可以稱其為JavaScript(下面簡寫為JS)。一般情況下,主要使用JS 來實現(xiàn)DOM 文檔的分析,DOM 為微軟提出的一種Web文檔模型,主要用來實現(xiàn)Web腳本編程。
利用JS 可以分析源頁面的內容,將欲打印的頁面元素提取出來,實現(xiàn)打印。通過分析源文檔的內容,可以生成打印目標文檔。
優(yōu)點:客戶端獨立完成打印目標文檔的生成,減輕服務器負荷;
缺點:源文檔的分析操作復雜,并且源文檔中的打印內容要有約定;
2、服務器端程序方式
服務器端程序方式,主要是利用后臺代碼從數(shù)據(jù)庫中讀取打印源,生成打印目標文檔。當?shù)捻撁嫔蓵r,還應適當考慮使用CSS 來實現(xiàn)強制分頁控制。
優(yōu)點:可以生成內容非常的豐富的打印目標文檔,目標文檔的內容的可控性強。由于打印內容是從數(shù)據(jù)庫中獲取的,所以生成操作相對簡單;
缺點:服務器端負載比較大;
(二)、頁面設置
頁面設置主要是指設置打印文檔的頁邊距、頁眉、頁腳、紙張等內容。頁面設置將直接影響到打印文檔版面的生成效果,所以它和打印文檔的生成有著密切的關系。比如:表格的
行數(shù)、大小、位置、字體的大小等。
現(xiàn)有的技術是利用IE6.0 內置的打印模板方式來控制頁面設置,其可以對打印目標文檔產生非常大的影響。打印模板可以控制頁邊距、頁眉、頁腳、奇偶頁等內容,并可以將用戶的設置取得,還可以將設置發(fā)送到服務器端。
打印模板技術可以自定預覽窗口和打印格式,最大限度地影響目標文檔和打印效果。
(三)、打印操作的實現(xiàn)
此功能的實現(xiàn)主要是利用WebBrowser控件的函數(shù)接口來實現(xiàn)打印、打印預覽(默認的)、
頁面設置(默認的)。
<object ID='WebBrowser1' WIDTH=0 HEIGHT=0
CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'>
//打印
WebBrowser1.ExecWB(6,1);
//打印設置
WebBrowser1.ExecWB(8,1);
//打印預覽
WebBrowser1.ExecWB(7,1);
3、一個實例項目采用的打印方案
服務器端程序方式、打印預覽接口調用,下面為例, 主要參考項目中的:
pageErrorPrint.aspx.vb 文件
主調用頁
function PrintPage(iPageIndex,strQuery)
{
var strURL;
strURL = "PageErrorPrint.aspx?PageIndex=" + iPageIndex + "&QueryString=" +
strQuery;
winPrint=window.open(strURL,"","left=2000,top=2000,fullscreen=3");
}
打印頁HTML 源中的預覽控制
<SCRIPT language="javascript">
document.write("<object ID='WebBrowser' WIDTH=0 HEIGHT=0
CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object>");
WebBrowser.ExecWB(7,1);
window.opener=null;
window.close();
</SCRIPT>
程序頭
'首先聲明表格容器
Protected WithEvents phContainer As System.Web.UI.WebControls.PlaceHolder
'每個表格中的記錄數(shù)量
Private Const ItemPerTable As Integer = 20
關鍵的實現(xiàn)部分
'創(chuàng)建一個符合打印要求的表格
tabPagePrint = NewPrintTable()
'將表頭添加到此表格中
Call AddTableTitle(tabPagePrint)
'初始化記錄器
i = 0
iItemIndex = iStartPoint
For Each clsItem In clsAllData.ErrorCollection
If i > 0 And i Mod ItemPerTable = 0 Then
'添加表格控件到頁面中
phContainer.Controls.Add(tabPagePrint)
'在頁面中添加一個換行符
Call AddPageBreak()
'創(chuàng)建新一輪的表格
tabPagePrint = NewPrintTable()
Call AddTableTitle(tabPagePrint)
End If
'將記錄添加到表格中
Call AddItemToTable(iItemIndex, tabPagePrint, clsItem)
iItemIndex = iItemIndex + 1
i = i + 1
Next
'添加表格控件到頁面中
phContainer.Controls.Add(tabPagePrint)
支持函數(shù)
'功能:添加頁的換行符
Private Sub AddPageBreak()
Dim ltBreak As LiteralControl
ltBreak = New LiteralControl("<p style='page-break-before:always'>")
phContainer.Controls.Add(ltBreak)
End Sub
二、利用IE自身打印
這種方式比較簡單,也常用的打印方式,只需要將報表頁面設計好,用戶通過IE菜單中的打印功能完成打印。優(yōu)點是簡單,容易實現(xiàn),缺點是不靈活,不能控制分頁,不能控制好頁眉和頁腳。
三、將報表導出成Word,Excel或PDF形式打印
這種方式需要將頁面導出成Office文檔或pdf,最低的要求是客戶端已經(jīng)安裝用以打開Word、Excel或Pdf文檔的軟件。這種方式可以通過水晶報表組件或其他一些第三方控件非常容易地實現(xiàn)。導出成Pdf形式后打印質量和效果都很好,導出成Word或Excel后用戶可以自定義打印的內容和格式。
總之,現(xiàn)有的打印方案各有所長,在開發(fā)過程中應根據(jù)用戶的需求作選擇,利用IE打印簡單,容易實現(xiàn),在用戶需求簡單或打印內容較少的情況下采用此方案比較適宜。利用自定義控件打印可以實現(xiàn)完全自定義,但需要較高的技術要求和開發(fā)周期。利用導出的方式則可以滿足用戶需要一點自定義或打印內容有多頁的需求。
-------------------------------------------------------------
1、控制"縱打"、橫打”和“頁面的邊距。
(1)<script defer>
function SetPrintSettings() {
// -- advanced features
factory.printing.SetMarginMeasure(2) // measure margins in inches
factory.SetPageRange(false, 1, 3) // need pages from 1 to 3
factory.printing.printer = "HP DeskJet 870C"
factory.printing.copies = 2
factory.printing.collate = true
factory.printing.paperSize = "A4"
factory.printing.paperSource = "Manual feed"
// -- basic features
factory.printing.header = "This is MeadCo"
factory.printing.footer = "Advanced Printing by ScriptX"
factory.printing.portrait = false
factory.printing.leftMargin = 1.0
factory.printing.topMargin = 1.0
factory.printing.rightMargin = 1.0
factory.printing.bottomMargin = 1.0
}
</script>
(2)
<script language="javascript">
function printsetup(){
// 打印頁面設置
wb.execwb(8,1);
}
function printpreview(){
// 打印頁面預覽
wb.execwb(7,1);
}
function printit()
{
if (confirm('確定打印嗎?')) {
wb.execwb(6,6)
}
}
</script>
</head>
<body>
<OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"
height=0 id=wb name=wb width=0></OBJECT>
<input type=button name=button_print value="打印"
onclick="javascript:printit()">
<input type=button name=button_setup value="打印頁面設置"
onclick="javascript:printsetup();">
<input type=button name=button_show value="打印預覽"
onclick="javascript:printpreview();">
<input type=button name=button_fh value="關閉"
onclick="javascript:window.close();">
------------------------------------------------
關于這個組件還有其他的用法,列舉如下:
WebBrowser.ExecWB(1,1) 打開
Web.ExecWB(2,1) 關閉現(xiàn)在所有的IE窗口,并打開一個新窗口
Web.ExecWB(4,1) 保存網(wǎng)頁
Web.ExecWB(6,1) 打印
Web.ExecWB(7,1) 打印預覽
Web.ExecWB(8,1) 打印頁面設置
Web.ExecWB(10,1) 查看頁面屬性
Web.ExecWB(15,1) 好像是撤銷,有待確認
Web.ExecWB(17,1) 全選
Web.ExecWB(22,1) 刷新
Web.ExecWB(45,1) 關閉窗體無提示
2、分頁打印
<HTML>
<HEAD>
<STYLE>
P {page-break-after: always}
</STYLE>
</HEAD>
<BODY>
<%while not rs.eof%>
<P><%=rs(0)%></P>
<%rs.movenext%>
<%wend%>
</BODY>
</HTML>
3、ASP頁面打印時如何去掉頁面底部的路徑和頂端的頁碼編號
(1)ie的文件-〉頁面設置-〉講里面的頁眉和頁腳里面的東西都去掉,打印就不出來了。
(2)<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="YC">
<script language="VBScript">
dim hkey_root,hkey_path,hkey_key
hkey_root="HKEY_CURRENT_USER"
hkey_path="\Software\Microsoft\Internet Explorer\PageSetup"
'//設置網(wǎng)頁打印的頁眉頁腳為空
function pagesetup_null()
on error resume next
Set RegWsh = CreateObject("WScript.Shell")
hkey_key="\header"
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,""
hkey_key="\footer"
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,""
end function
'//設置網(wǎng)頁打印的頁眉頁腳為默認值
function pagesetup_default()
on error resume next
Set RegWsh = CreateObject("WScript.Shell")
hkey_key="\header"
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,"&w&b頁碼,&p/&P"
hkey_key="\footer"
RegWsh.RegWrite hkey_root+hkey_path+hkey_key,"&u&b&d"
end function
</script>
</HEAD>
<BODY>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/><p align=center>
<input type="button" value="清空頁碼" onclick=pagesetup_null()> <input type="button" value="恢復頁嗎" onclick=pagesetup_default()><br/>
</p>
</BODY>
</HTML>
4、浮動幀打印
<SCRIPT LANGUAGE=javascript>
function button1_onclick() {
var odoc=window.iframe1.document;
var r=odoc.body.createTextRange();
var stxt=r.htmlText;
alert(stxt)
var pwin=window.open("","print");
pwin.document.write(stxt);
pwin.print();
}
</SCRIPT>
4、用FileSystem組件實現(xiàn)WEB應用中的本地特定打印
<script Language=VBScript>
function print_onclick //打印函數(shù)
dim label
label=document.printinfo.label.value //獲得HTML頁面的數(shù)據(jù)
set objfs=CreateObject("Scripting.FileSystemObject") //創(chuàng)建FileSystem組件對象的實例
set objprinter=objfs.CreateTextFile ("LPT1:",true) //建立與打印機的連接
objprinter.Writeline("__________________________________") //輸出打印的內容
objprinter.Writeline("| |")
objprinter.Writeline("| 您打印的數(shù)據(jù)是:"&label& " |”)
objprinter.Writeline("| |")
objprinter.Writeline("|_________________________________|")
objprinter.close //斷開與打印機的連接
set objprinter=nothing
set objfs=nothing // 關閉FileSystem組件對象
end function
</script>
服務器端腳本:
<%………
set conn=server.CreateObject ("adodb.connection")
conn.Open "DSN=name;UID=XXXX;PWD=XXXX;"
set rs=server.CreateObject("adodb.recordset")
rs.Open(“select ……”),conn,1,1
……….%> //與數(shù)據(jù)庫進行交互
HTML頁面編碼:
<HTML>
………
<FORM ID=printinfo NAME="printinfo" >
<INPUT type="button" value="打印>>" id=print name=print > //調用打印函數(shù)
<INPUT type=hidden id=text1 name=label value=<%=………%>> //保存服務器端傳來的數(shù)據(jù)
………
</HTML>