web 實現大量打印
問題描述:
在B/S項目中需要打印大量的圖片,我們使用window.print,但是當數據量大至上萬的時候,將圖片加載出來需要一些時間,加載出來之后打印,如果用戶關閉了打印界面會導致打印頁的缺失。
解決思路:
1.IE,使用ActiveX控件,非IE,使用Flash插件。這種思路不同的瀏覽器開發方式不一樣,IE/FF/GROME
2.開發一個exe,客戶端安裝到本地服務,使用HTTP通訊方式。通過JS發送HTTP請求給本地的服務,本地服務起一個小型的HTTP rver接收請求,然后返回數據,JS解析,顯示在UI上。比如將打印的參數傳值到本地服務,本地服務去調用打印機,使瀏覽器資源得到釋放。
我們使用第二種思路。
嘗試了以下方法:
1.HttpPrinter
采用原因 免費 ,OME費用很便宜的,而且不限制時間和數量.還可以購買源碼的。
HttpPrinter.com
2.葡萄城的ActiveReports
中有B / s端的打印使用window.print實現
https://demo.grapecity.com.cn/ActiveReports/ASPNET/ControlExplorer/Viewers/Default.aspx?category=1001&action=14
另外有C / S端的打印,無法與瀏覽器交互,但是可以去改進
https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=48785&extra=page%3D1
3. Lodop分為收費版與免費版
(1)使用Lodop插件,需要客戶端安裝一個服務,服務的端口默認是8000或18000
(2)如何購買和使用打印控件的Lodop的注冊號
http://blog.sina.com.cn/s/blog_721e77e50100nfzs.html
(3)Lodop樣例演示
http://www.lodop.net/LodopDemo.html
考量問題:
(1)免費版有水印
4. JCP分為收費版與免費版
安裝程序需要替換
網官 http://printfree.jatools.com/
考量問題:
免費版只適合于IE瀏覽器
圖片需要渲染到頁面,打印時釋放瀏覽器資源可以做其他操作
收費版jatoolsPrint支持大部分瀏覽器
5.jquery打印
底層是window.print方法
最后考量,我們決定將的ActiveReports中的C / S端程序打包成EXE,利用自定義協議實現打開本地exe服務,使用HTTP方式實現瀏覽器與本地服務的通訊。
web打印組件原理
由于瀏覽器的安全沙箱機制,Web應用不能直接訪問打印機。而能直接控制打印機,實施精準打印,是很多SAAS軟件,B/S架構軟件,網站等應用的剛需。
我們調研了大量Web/網頁類應用,發現針對Web打印解決方案,主要有如下幾種技術實現方式:
1. 直接調用Javascript打印
通過調用瀏覽器window對象內置的print方法,彈出打印窗口,用戶點擊確認打印。
這是實現網頁打印的最簡單方法,但它的問題是不夠靈活,不能精準控制要打印的頁面內容,無法方便地對打印機進行設置,無法適應一些有復雜打印要求的業務場景。
2. 瀏覽器控件打印
通過開發瀏覽器插件的方式實現打印,例如IE瀏覽器的ActiveX控件。
由于此種方法通用性不強,不能適配市面上的主流瀏覽器,如chrome,edge等,已被淘汰。
3. 本地代理
還有一種方式是在本地安裝代理程序,代理程序會啟動一個服務(通常是http服務),來接受打印請求,實施打印。
網頁通過跨域技術,提交打印任務并接收反饋。此種方式是一種優秀的解決方案,廣泛應用于類似場景的Web應用中。
它的優勢是適配性強,理論上適用于所有瀏覽器。此種方式需要用戶下載安裝代理程序。
設計思路
能加加網頁打印插件的核心理念,就是為開發人員提供簡單可靠的打印解決方案。
經過多方技術調研與分析,我們采用的是第三種方案:本地代理方式。
我們使用C++作為開發語言,軟件運行速度快,穩定性好,精心設計的軟件接口簡單易用。
web打印有那幾種方法
一、瀏覽器的打印功能菜單
這種方案的優勢是不需要對瀏覽器作任何擴充,是最簡單的辦法,但問題也最多,如:
不能精確分頁。瀏覽器一般是根據用戶設置的頁面大小,web頁面的內容多少,來自行決定分頁位置,程序員很難控制。會有頁腳頁眉干擾。
不能準確對齊邊邊距及打印文字。
不能解決連續打印。比如,不是僅打印一張票據,而是連續一次打印若干個票據。
二、使用webbrowr控件+ javascript
這實際上,是瀏覽器打印功能菜單的一種程序調用,與打印功能菜單沒什么兩樣。分頁的問題仍然存在,只不過,可以讓用戶不用去點菜單,直接在網頁中的一個按鈕,或一個鏈接里面調用罷了。
三 、使用print css
這是一種最理想的實現web套打的方法。這種方法通過在html文檔中,嵌入打印相關的css樣式,來實現對html文檔輸出打印的控制,比 如設置紙張大小,紙張縱橫方向,打印邊距,分頁等。顯而易見,這種方式成本小,不需要下載任何插件,而且跨平臺性非常好。print css推出已經有些時日,但遺憾的是,至今沒有一個廠商的瀏覽器很好地實現了這些標準,這使得程序員目前還不能利用print css進行實際的開發。關于打印css,參見http://css-discuss.incutio.com /?page=PrintStylesheets
四 、使用PDF文件
用這種方式,就是從服務器端下載一個pdf文件流,在IE中用adobe插件打開,然后用adobe的打印菜單進行打印,雖然這種方案,也能 實現精確套打,但需要下載adobe插件。這是國外報表工具經常推薦的一種打印方法,但在pdf不那么普及的中國,這種方案不是最好選擇。
java(web)打印 通常是怎么實現的
Web系統中,打印功能一直是個老大難問題,因此產生了很多第三方的控件,多數要收費,而且跟自己的系統結合有一定的麻煩。系統采用J2EE技術,jsp打印問題同樣存在于OA中。
打印方式有三種:一是不經過任何修改,直接調用javascript中的window.print()打印。二根據客戶要求的報表格式,編寫相應格式的html,裝載數據打印,同樣調用window.print()打印,只是對html的格式要求比較高。三是通過客戶提供的word格式,通過xml配置文件與數據庫的數據進行關聯,自動裝載數據到word中打印,這里是利用客戶端的word進行打印。
第一種幾乎不用編寫程序,最簡單快捷,這里會遇到幾個問題,只能打印表單內容,按鈕不希望打印出來;頁眉頁腳不想打印出來;IE的titile不想打印出來。
解決辦法:把button放在一個table或者div里,打印的時候隱藏,完成后顯示就可以。系統中的javascript打印代碼如下:
function Print() {
var tit = document.title;
document.title = "";
table1.style.display = "none";
window.print();
document.title = tit;
table1.style.display = "";
}
不過只能起到打印的目的,打印的效果一般比較土。不管怎么說,可以最快的讓系統的大部分模塊都有打印的功能。
第二種方式必須根據每個報表的格式進行定制html和java程序開發,會花比較多的時間。要注意的是對html中table的樣式控制,在IE中瀏覽看起來很細的邊框,打印出來有些線條會比較粗,有些線條又會比較細,陰陽怪氣的很難看。
在table中直接用bordercolor會讓線條顯得很粗,用bordercolorlight,bordercolordark配合使用可以顯示出秀氣的線條。
<html>
<head></head>
<body>
<table border="1" bordercolorlight="red" bordercolordark="#FFFFFF" cellpadding="3" cellspacing="0">
<tbody>
<tr>
<td>姓名</td>
<td>所屬部門</td>
</tr>
<tr>
<td>陳</td>
<td>技術部</td>
</tr>
</tbody>
</table>
</body>
</html>
比如以上代碼,在IE中看起來線條一樣大小,還是比較秀氣。不要高興的太早,打印出來的效果不象在IE中看到的那樣,邊框雖細,內線卻很粗!原因是每個td都有邊框,td與td的交接處就會有線條重疊,雖然IE看起來沒有,可是打印的時候就會顯示出來。
這個問題的解決辦法是控制每一個td的樣式,對重疊的地方進行border-bottom:1px之類的控制。
這個方案比較消耗精力,而且打印的時候很難控制分頁,更不能隨時按照客戶的需要調整字體邊框顏色等。
第三種方案:從服務器端生成word、excel等文檔,發送到瀏覽器進行打印
實現過程:先將需要打印的數據導入到word或者excel中,再利用word或者excel的打印功能來實現web打印。
下面以excel為例實現如何打印的過程
將網頁中數據導入excel中的方法有很多,這里先介紹一種,利用ActiveX控件的方式,即 Excel.Application, 這個控件是MS為excel提供的編程接口,在很多種編程語言種都可以通過該接口來操縱excel表格。
下面用javascript腳本來實現一個簡單的例子。
<script language = "javascript">
function ExcelPrint() {
var excelApp; //存放Excel對象
var excelBook; //存放Excel工件簿文件
var excelSheet; //存放Excel活動工作表
try {
excelApp = new ActiveXObject("Excel. Application"); //創建Excel對象}
catch(e) {
alert("請啟用ActiveX控件設置!");
return;
}
excelBook = excelApp.Workbooks.Add(); //創建Excel工作簿文件
excelSheet = excelBook.ActiveSheet; //激活Excel工作表
var rowLen = printTable.rows.length; //table對象的行數
for (var i = 0; i < rowLen; i++) {
var colLen = printTable.rows(i).cells.length; //table對象的列數
for (var j = 0; j < colLen; j++) //為Excel表的單元格賦值
excelSheet.Cells(i + 1, j + 1).value = printTable.rows(i).cells(j).innerText;
} //將表格中的每個單元格的innerText導入到excel的單元格中
excelApp.Visible = true; //設置Excel對象可見
excelSheet.PrintOut(); //打印工作表
excelBook.Clo(true); //關閉文檔
excelApp.Quit(); //結束excel對象
excelApp = null; //釋放excel對象
}
}
</script>
注意:
運行該程序的前提是 IE要允許對沒有標記為安全的Activex控件進行初始化和腳本運行。設置方法如下:
打開控制面板→Internet選項→安全性→自定義級別→對沒有標記為安全的ActiveX控件進行初始化和腳本運行→選中啟用,這樣我們的程序就可以運行了。如果沒有啟用該ActiveX控件設置,那么程序在執行創建Excel對象時會拋出一個異常,這時可以通過catch()語句來捕獲這個異常,并且做出相應的處理。
運行該程序必須客戶端安裝了MS EXCEL,否則Activex驅動不了。
用web打印時 只顯示網址不顯示時間 頁面設置中怎么設置
1、在需要打印的網頁空白位置點擊右鍵,在彈出菜單中選擇“打印”菜單項。
2、這時會彈出打印設置頁面,點擊下面的“更多設置”快捷鏈接。
3、在彈出的頁面設置中找到“選項”設置一項,取消“頁眉和頁腳”前面的勾選即可。這樣打印的紙上就不會出現網址與頁碼了。
4、IE瀏覽器可以先在標題欄的空白位置點擊右鍵,在彈出菜單中選中“菜單欄”菜單項。
5、接著點擊文件菜單,在彈出的下拉菜單中點擊“頁面設置”菜單項。
6、在打開的頁面設置窗口,把頁眉與頁腳兩項都設置為“空”,最后點擊確定按鈕。這樣在打印的紙上就不會出現網址與頁碼了。
web網站怎樣實現打印功能
WEB軟件打印功能實現方式:
1、瀏覽器本身的打印功能,效果最差。
2、在web服務器上產生好PDF或Excel文件,下載到本地打印。很多在服務器端運行的報表軟件采用這樣的方式。因為就是下載文件,所以各種瀏覽器都支持。缺點就用戶操作麻煩,服務器附載大。
3、報表插件方式,可以做到與桌面軟件一樣的打印功能,這種方式實現的效果最好。缺點就是插件是針對特定瀏覽器的,不能做到支持各種瀏覽器,報表插件一般是支持IE瀏覽器。
綜合考慮,看用哪種方式合適。
我們一直用銳浪報表插件,報表與打印都很滿意。