使用C#實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容保存為圖片并生成壓縮包
應(yīng)用場(chǎng)景
我們?cè)谝粋€(gè)求職簡(jiǎn)歷打印的項(xiàng)目功能里,需要根據(jù)一定的查詢條件,得到結(jié)果并批量導(dǎo)出指定格式的文件。導(dǎo)出的格式可能有多種,比如WORD格式、EXCEL格式、PDF格式等,實(shí)現(xiàn)方式是通過(guò)設(shè)置對(duì)應(yīng)的模板進(jìn)行輸出,實(shí)際情況是,簡(jiǎn)歷的內(nèi)容是靈活設(shè)置的,沒(méi)有固定的格式,模板數(shù)量是不固定的。
通過(guò)動(dòng)態(tài)頁(yè)面技術(shù),可以實(shí)現(xiàn)簡(jiǎn)歷配置后的網(wǎng)頁(yè)內(nèi)容輸出,但制作對(duì)應(yīng)的各種模板會(huì)遇到開(kāi)發(fā)效率和服務(wù)跟進(jìn)的問(wèn)題。為了保障原樣輸出,折中而簡(jiǎn)單的方案就是將動(dòng)態(tài)輸出的頁(yè)面轉(zhuǎn)化為圖片格式。
實(shí)現(xiàn)代碼
創(chuàng)建一個(gè) UrlToImage 類,創(chuàng)建實(shí)例的時(shí)候傳遞指定的 URL, 并調(diào)用 SaveToImageFile(string outputFilename)方法,該方法傳遞要輸出的文件名參數(shù)即可即可。
調(diào)用示例代碼如下:
string url = "https://" + Request.Url.Host + "/printResume.aspx"; UrlToImage uti = new UrlToImage(url); bool irv = uti.SaveToImageFile(Request.PhysicalApplicationPath + "\\test.jpg"); if(bool==false){ Response.Write("save failed."); Response.End(); }
類及實(shí)現(xiàn)代碼如下:
public class UrlToImage { private Bitmap m_Bitmap; private string m_Url; private string m_FileName = string.Empty; int initheight = 0; public UrlToImage(string url) { // Without file m_Url = url; } public UrlToImage(string url, string fileName) { // With file m_Url = url; m_FileName = fileName; } public Bitmap Generate() { // Thread var m_thread = new Thread(_Generate); m_thread.SetApartmentState(ApartmentState.STA); m_thread.Start(); m_thread.Join(); return m_Bitmap; } public bool SaveToImageFile(string filename) { Bitmap bt=Generate(); if (bt == null) { return false; } bt.Save(filename); return File.Exists(filename); } private void _Generate() { var browser = new WebBrowser { ScrollBarsEnabled = false }; browser.ScriptErrorsSuppressed = true; initheight = 0; browser.Navigate(m_Url); browser.DocumentCompleted += WebBrowser_DocumentCompleted; while (browser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } browser.Dispose(); } private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { // Capture var browser = (WebBrowser)sender; browser.ClientSize = new Size(browser.Document.Body.ScrollRectangle.Width, browser.Document.Body.ScrollRectangle.Bottom); browser.ScrollBarsEnabled = false; m_Bitmap = new Bitmap(browser.Document.Body.ScrollRectangle.Width, browser.Document.Body.ScrollRectangle.Bottom); browser.BringToFront(); browser.DrawToBitmap(m_Bitmap, browser.Bounds); // Save as file? if (m_FileName.Length > 0) { // Save m_Bitmap.SaveJPG100(m_FileName); } if (initheight == browser.Document.Body.ScrollRectangle.Bottom) { browser.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted); } initheight = browser.Document.Body.ScrollRectangle.Bottom; } }
生成壓縮包
對(duì)于批量生成的圖片文件,我們可以生成壓縮包為客戶提供下載功能,壓縮功能引用的是ICSharpCode.SharpZipLib.dll,創(chuàng)建 ZipCompress 類的實(shí)例,ZipDirectory(zippath, zipfile, password) 方法,需要提供的參數(shù)包括,壓縮的目錄、生成的壓縮文件名,壓縮包的打開(kāi)密碼。
示例代碼如下:
string zippath = Request.PhysicalApplicationPath + "\\des\\" ; if (!Directory.Exists(zippath)) { Directory.CreateDirectory(zippath); } string zipfile = Request.PhysicalApplicationPath + "\\des\\test.zip"; ZipCompress allgzip = new ZipCompress(); System.IO.DirectoryInfo alldi = new System.IO.DirectoryInfo(zippath); string password = "123456"; allgzip.ZipDirectory(zippath, zipfile, password); //以下是生成完壓縮包后,清除目錄及文件 string[] allfs = Directory.GetFiles(zippath); for (int i = 0; i < allfs.Length; i++) { File.Delete(allfs[i]); } Directory.Delete(zippath);
類及實(shí)現(xiàn)代碼如下:
public class ZipCompress { public byte[] Compress(byte[] inputBytes) { using (MemoryStream outStream = new MemoryStream()) { using (GZipStream zipStream = new GZipStream(outStream, CompressionMode.Compress, true)) { zipStream.Write(inputBytes, 0, inputBytes.Length); zipStream.Close(); //很重要,必須關(guān)閉,否則無(wú)法正確解壓 return outStream.ToArray(); } } } public byte[] Decompress(byte[] inputBytes) { using (MemoryStream inputStream = new MemoryStream(inputBytes)) { using (MemoryStream outStream = new MemoryStream()) { using (GZipStream zipStream = new GZipStream(inputStream, CompressionMode.Decompress)) { zipStream.CopyTo(outStream); zipStream.Close(); return outStream.ToArray(); } } } } public string Compress(string input) { byte[] inputBytes = Encoding.Default.GetBytes(input); byte[] result = Compress(inputBytes); return Convert.ToBase64String(result); } public string Decompress(string input) { byte[] inputBytes = Convert.FromBase64String(input); byte[] depressBytes = Decompress(inputBytes); return Encoding.Default.GetString(depressBytes); } public void Compress(DirectoryInfo dir) { foreach (FileInfo fileToCompress in dir.GetFiles()) { Compress(fileToCompress); } } public void Decompress(DirectoryInfo dir) { foreach (FileInfo fileToCompress in dir.GetFiles()) { Decompress(fileToCompress); } } public void Compress(FileInfo fileToCompress) { using (FileStream originalFileStream = fileToCompress.OpenRead()) { if ((File.GetAttributes(fileToCompress.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fileToCompress.Extension != ".gz") { using (FileStream compressedFileStream = File.Create(fileToCompress.FullName + ".gz")) { using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress)) { originalFileStream.CopyTo(compressionStream); } } } } } public void Decompress(FileInfo fileToDecompress,string desfilename="") { using (FileStream originalFileStream = fileToDecompress.OpenRead()) { string currentFileName = fileToDecompress.FullName; string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length); if (desfilename != "") { newFileName = desfilename; } using (FileStream decompressedFileStream = File.Create(newFileName)) { using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress)) { decompressionStream.CopyTo(decompressedFileStream); } } } } public void ZipDirectory(string folderToZip, string zipedFileName,string password) { ZipDirectory(folderToZip, zipedFileName,(password==""?string.Empty:password), true, string.Empty, string.Empty, true); } public void ZipDirectory(string folderToZip, string zipedFileName, string password, bool isRecurse, string fileRegexFilter, string directoryRegexFilter, bool isCreateEmptyDirectories) { FastZip fastZip = new FastZip(); fastZip.CreateEmptyDirectories = isCreateEmptyDirectories; fastZip.Password = password; fastZip.CreateZip(zipedFileName, folderToZip, isRecurse, fileRegexFilter, directoryRegexFilter); } public void UnZipDirectory(string zipedFileName, string targetDirectory, string password,string fileFilter=null) { FastZip fastZip = new FastZip(); fastZip.Password = password; fastZip.ExtractZip(zipedFileName, targetDirectory,fileFilter); } public void UnZip(string zipFilePath, string unZipDir) { if (zipFilePath == string.Empty) { throw new Exception("壓縮文件不能為空!"); } if (!File.Exists(zipFilePath)) { throw new FileNotFoundException("壓縮文件不存在!"); } //解壓文件夾為空時(shí)默認(rèn)與壓縮文件同一級(jí)目錄下,跟壓縮文件同名的文件夾 if (unZipDir == string.Empty) unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath)); if (!unZipDir.EndsWith("/")) unZipDir += "/"; if (!Directory.Exists(unZipDir)) Directory.CreateDirectory(unZipDir); using (var s = new ZipInputStream(File.OpenRead(zipFilePath))) { ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { string directoryName = Path.GetDirectoryName(theEntry.Name); string fileName = Path.GetFileName(theEntry.Name); if (!string.IsNullOrEmpty(directoryName)) { Directory.CreateDirectory(unZipDir + directoryName); } if (directoryName != null && !directoryName.EndsWith("/")) { } if (fileName != String.Empty) { using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name)) { int size; byte[] data = new byte[2048]; while (true) { size = s.Read(data, 0, data.Length); if (size > 0) { streamWriter.Write(data, 0, size); } else { break; } } } } } } } }
小結(jié)
對(duì)于生成的圖片文件,我們還可以結(jié)合其它的API應(yīng)用,來(lái)判斷圖片是否有被PS的情況,來(lái)提升和擴(kuò)展應(yīng)用程序的功能。另外,對(duì)于被訪問(wèn)的動(dòng)態(tài)頁(yè)面,建議使用訪問(wèn)控制,只有正常登錄或提供訪問(wèn)令牌的用戶才可以生成結(jié)果圖片,以保證數(shù)據(jù)的安全性。
到此這篇關(guān)于使用C#實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容保存為圖片并生成壓縮包的文章就介紹到這了,更多相關(guān)C#網(wǎng)頁(yè)內(nèi)容保存為圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用DeflateStream解壓縮數(shù)據(jù)文件的方法
這篇文章主要介紹了C#使用DeflateStream解壓縮數(shù)據(jù)文件的方法,較為詳細(xì)的分析了DeflateStream方法對(duì)文件進(jìn)行壓縮及解壓縮的步驟與技巧,需要的朋友可以參考下2015-04-04.NET企業(yè)級(jí)項(xiàng)目中遇到的國(guó)際化問(wèn)題和解決方法
這篇文章主要介紹了.NET企業(yè)級(jí)項(xiàng)目中遇到的國(guó)際化問(wèn)題和解決方法,說(shuō)明了理國(guó)際化問(wèn)題的一些典型例子和經(jīng)驗(yàn)之談,需要的朋友可以參考下2014-07-07C#在DataTable中根據(jù)條件刪除某一行的實(shí)現(xiàn)方法
我們通常的方法是把數(shù)據(jù)源放在DataTable里面,但是偶爾也會(huì)需要把不要的行移除,怎么實(shí)現(xiàn)呢,下面通過(guò)代碼給大家介紹c# atatable 刪除行的方法,需要的朋友一起看下吧2016-05-05C#實(shí)現(xiàn)將TextBox綁定為KindEditor富文本
KindEditor?依靠出色的用戶體驗(yàn)和領(lǐng)先的技術(shù)提供富文本編輯功能,是一款非常受歡迎的HTML在線編輯器,下面我們就來(lái)看看C#如何將TextBox綁定為KindEditor富文本吧2024-04-04直接在線預(yù)覽Word、Excel、TXT文件之ASP.NET
這篇文章主要用asp.net技術(shù)實(shí)現(xiàn)直接在線預(yù)覽word、excel、txt文件,有需要的朋友可以參考下2015-08-08C#中Dictionary泛型集合7種常見(jiàn)的用法
本文主要介紹了Dictionary集合的7種最基礎(chǔ)的用法,包括創(chuàng)建、添加、查找、遍歷、刪除等方法,程序都是由簡(jiǎn)入繁,希望能通過(guò)閱讀簡(jiǎn)單的示例,給大家一些啟發(fā)。2016-03-03