基于Metronic的Bootstrap開發(fā)框架經(jīng)驗總結(jié)(9)--實現(xiàn)Web頁面內(nèi)容的打印預(yù)覽和保存操作

在前面介紹了很多篇相關(guān)的《Bootstrap開發(fā)框架》的系列文章蜜徽,這些內(nèi)容基本上覆蓋到了我這個Bootstrap框架的各個主要方面的內(nèi)容徘禁,總體來說基本達到了一個穩(wěn)定的狀態(tài),隨著時間的推移可以會引入一些更好更新的內(nèi)容進行完善,本篇繼續(xù)這個系列科汗,主要介紹如何實現(xiàn)Web頁面內(nèi)容的打印預(yù)覽和保存操作般卑。
1武鲁、Web頁面打印的問題
在此之前,我一般使用比較好用的LODOP來執(zhí)行打印的操作蝠检,這個在我之前有很多文章都有涉及沐鼠,這個控件是一個ActiveX的控件,需要下載安裝后就可以在頁面是進行打印的排版設(shè)計叹谁,預(yù)覽饲梭,打印等操作,還是很方便的一個控件焰檩,因此都很適合普通內(nèi)容的打印憔涉,證件的套打等操作。
不過隨著瀏覽器技術(shù)的更新析苫,這個插件在Chrome或者FireFox上好像不受支持了兜叨,基本上摒棄了這種插件的處理方式了。例如如果我在頁面上需要打印對話框里面的內(nèi)容衩侥,如下所示浪腐。
[圖片上傳中。顿乒。议街。(1)]
如果按正常使用LODOP的方式來進行處理的話,那么會得到Chrome瀏覽器的提示璧榄,并且這個不管你重新下載安裝特漩、更新LODOP控件吧雹,都會繼續(xù)這個錯誤提示的。
[圖片上傳中涂身。雄卷。。(2)]
這個在一篇《Lodop頁面總提示"未安裝"或"請升級"的可能原因》蛤售,以及《Lodop用戶應(yīng)對谷歌瀏覽器停用Plugin技術(shù)的處理辦法》都有說明丁鹉,因此我們需要另辟蹊徑來處理這個頁面打印等的處理了。
對于替代方式悴能,這里就是本篇內(nèi)容介紹的主題了揣钦,我一直喜歡尋找一些比較好的方式的方式來實現(xiàn)自己需要的功能,于是找到了PrintThis的這個插件(https://github.com/jasonday/printThis)以及jquery-print-preview-plugin(https://github.com/etimbo/jquery-print-preview-plugin)漠酿,對比兩者我比較喜歡第一個的簡潔方便的使用冯凹。
2、PrintThis打印插件的使用
有了上面的問題炒嘲,我們引入一個新的打印方式宇姚,也就是JQuery插件來實現(xiàn)我們所需要頁面內(nèi)容的打印操作。
這個插件的使用非常簡潔方便夫凸,首先需要在頁面里面引入對應(yīng)的JS文件浑劳,如下所示。
<script src="~/Content/JQueryTools/printThis/printThis.js"></script>

我們再在頁面頂部增加兩個按鈕夭拌,如打印和導(dǎo)出操作魔熏,代碼如下所示
<div class="toolbar"> <a href="#" onclick="javascript:Preview();"><img alt="打印預(yù)覽" src="~/Content/images/print.gif" /><br />打印預(yù)覽</a> <a href="#" onclick="javascript:SaveAs();"><img alt="另存為" src="~/Content/images/saveas.gif" /><br />另存為</a> </div>

[圖片上傳中。啼止。道逗。(3)]
然后我們還需要聲明一個DIV用來放置顯示的Web頁面內(nèi)容兵罢,這樣也方便對它調(diào)用進行打印操作献烦。
[圖片上傳中。卖词。巩那。(4)]
我們打印的處理代碼也很簡單,就是直接對層進行打印處理就可以了此蜈,可以看到下面的使用代碼非常簡單即横。
[圖片上傳中。裆赵。东囚。(5)]
//打印預(yù)覽 function Preview() { $("#printContent").printThis({ debug: false, importCSS: true, importStyle: true, printContainer: true, loadCSS: "/Content/Themes/Default/style.css", pageTitle: "通知公告", removeInline: false, printDelay: 333, header: null, formValues: true }); };
[圖片上傳中。战授。页藻。(6)]

打印執(zhí)行后桨嫁,IE和Chrome都會彈出一個打印預(yù)覽對話框,確認(rèn)是否進行打印的操作份帐。
[圖片上傳中璃吧。。废境。(7)]

3畜挨、頁面內(nèi)容的保存操作
有時候,為了方便業(yè)務(wù)處理噩凹,我們一般也可以提供給用戶一個導(dǎo)出打印內(nèi)容的操作巴元,如下所示代碼就是把打印的內(nèi)容導(dǎo)出到Word里面給用戶加工等用途。
function SaveAs() { var id = $('#ID2').val(); window.open('/Information/ExportWordById?id=' + id ); }

上面的操作栓始,主要就是調(diào)用了MVC的控制器方法進行處理务冕,傳入一個id就可以把內(nèi)容提取出來,然后把它生成所需的Word內(nèi)容即可幻赚。
這里后臺我們主要利用Apose.Word控件來進行模板化的文檔生成禀忆,具體可以參考一下我前面介紹過的使用方法文章《利用Aspose.Word控件實現(xiàn)Word文檔的操作》、《利用Aspose.Word控件和Aspose.Cell控件落恼,實現(xiàn)Word文檔和Excel文檔的模板化導(dǎo)出》箩退。
其中我們可以在書簽里面定義或者查看一些書簽的信息,如下圖所示佳谦。
[圖片上傳中戴涝。。钻蔑。(8)]
這樣我們在代碼里面啥刻,就可以獲取信息并指定這個Word模板了。
[圖片上傳中咪笑。可帽。。(9)]
InformationInfo info = BLLFactory<Information>.Instance.FindByID(id); if (info != null) { string template = "~/Content/Template/政策法規(guī)模板.doc"; string templateFile = Server.MapPath(template); Aspose.Words.Document doc = new Aspose.Words.Document(templateFile);
[圖片上傳中窗怒。映跟。。(10)]

WORD模板的內(nèi)容扬虚,可以使用文本替換方式努隙,如下所示。
SetBookmark(ref doc, "Content", info.Content);

也可以使用書簽BookMark方式查詢替換辜昵,如下代碼所示荸镊。
Aspose.Words.Bookmark bookmark = doc.Range.Bookmarks[title]; if (bookmark != null) { bookmark.Text = value; }

對于主體的HTML內(nèi)容,這需要特殊對待,一般需要使用插入HTML的專用方式進行寫入內(nèi)容躬存,否則就顯示HTML代碼了收厨,使用專用HTML方法寫入的內(nèi)容,和我們在網(wǎng)頁上看到的基本沒有什么差異了优构。如下代碼所示诵叁。
[圖片上傳中。钦椭。拧额。(11)]
DocumentBuilder builder = new DocumentBuilder(doc); Aspose.Words.Bookmark bookmark = doc.Range.Bookmarks["Content"]; if (bookmark != null) { builder.MoveToBookmark(bookmark.Name); builder.InsertHtml(info.Content); }
[圖片上傳中。彪腔。侥锦。(12)]

整個導(dǎo)入WORD文檔的方法就是利用這些內(nèi)容的整合,實現(xiàn)一個標(biāo)準(zhǔn)文檔的生成德挣,這種業(yè)務(wù)文檔是固定模板的恭垦,因此很適合在實際業(yè)務(wù)中使用,比起使用其他方式自動生成的HTML文件或者文檔格嗅,有更好的可塑性和美觀性番挺。
整個代碼如下所示。
[圖片上傳中屯掖。玄柏。。(13)]
public FileStreamResult ExportWordById(string id) { if (string.IsNullOrEmpty(id)) return null; InformationInfo info = BLLFactory<Information>.Instance.FindByID(id); if (info != null) { string template = "~/Content/Template/政策法規(guī)模板.doc"; string templateFile = Server.MapPath(template); Aspose.Words.Document doc = new Aspose.Words.Document(templateFile); #region 使用文本方式替換 //Dictionary<string, string> dictSource = new Dictionary<string, string>(); //dictSource.Add("Title", info.Title); //dictSource.Add("Content", info.Content); //dictSource.Add("Editor", info.Editor); //dictSource.Add("EditTime", info.EditTime.ToString()); //dictSource.Add("SubType", info.SubType); //foreach (string name in dictSource.Keys) //{ // doc.Range.Replace(name, dictSource[name], true, true); //} #endregion //使用書簽方式替換 SetBookmark(ref doc, "Title", info.Title); SetBookmark(ref doc, "Editor", info.Editor); SetBookmark(ref doc, "EditTime", info.EditTime.ToString()); SetBookmark(ref doc, "SubType", info.SubType); //SetBookmark(ref doc, "Content", info.Content); //對于HTML內(nèi)容贴铜,需要通過InsertHtml方式進行寫入 DocumentBuilder builder = new DocumentBuilder(doc); Aspose.Words.Bookmark bookmark = doc.Range.Bookmarks["Content"]; if (bookmark != null) { builder.MoveToBookmark(bookmark.Name); builder.InsertHtml(info.Content); } doc.Save(System.Web.HttpContext.Current.Response, info.Title, Aspose.Words.ContentDisposition.Attachment, Aspose.Words.Saving.SaveOptions.CreateSaveOptions(Aspose.Words.SaveFormat.Doc)); HttpResponseBase response = ControllerContext.HttpContext.Response; response.Flush(); response.End(); return new FileStreamResult(Response.OutputStream, "application/ms-word"); } return null; } private void SetBookmark(ref Aspose.Words.Document doc, string title, string value) { Aspose.Words.Bookmark bookmark = doc.Range.Bookmarks[title]; if (bookmark != null) { bookmark.Text = value; } }
[圖片上傳中粪摘。。绍坝。(14)]

最后導(dǎo)出的WORD文檔就是模板化的具體文檔內(nèi)容了徘意,WORD預(yù)覽界面如下所示。
[圖片上傳中轩褐。椎咧。。(15)]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灾挨,一起剝皮案震驚了整個濱河市邑退,隨后出現(xiàn)的幾起案子竹宋,更是在濱河造成了極大的恐慌劳澄,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜈七,死亡現(xiàn)場離奇詭異秒拔,居然都是意外死亡,警方通過查閱死者的電腦和手機飒硅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門砂缩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來作谚,“玉大人,你說我怎么就攤上這事庵芭∶美粒” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵双吆,是天一觀的道長眨唬。 經(jīng)常有香客問我,道長好乐,這世上最難降的妖魔是什么匾竿? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮蔚万,結(jié)果婚禮上岭妖,老公的妹妹穿的比我還像新娘。我一直安慰自己反璃,他們只是感情好昵慌,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淮蜈,像睡著了一般废离。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上礁芦,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天蜻韭,我揣著相機與錄音,去河邊找鬼柿扣。 笑死肖方,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的未状。 我是一名探鬼主播俯画,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼司草!你這毒婦竟也來了艰垂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤埋虹,失蹤者是張志新(化名)和其女友劉穎驹马,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潜腻,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡遂铡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柬讨。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡崩瓤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出踩官,到底是詐尸還是另有隱情却桶,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布蔗牡,位于F島的核電站肾扰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛋逾。R本人自食惡果不足惜集晚,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望区匣。 院中可真熱鬧偷拔,春花似錦、人聲如沸亏钩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姑丑。三九已至蛤签,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栅哀,已是汗流浹背震肮。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留留拾,地道東北人戳晌。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像痴柔,于是被迫代替她去往敵國和親沦偎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容