using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.Drawing; using System.Runtime.InteropServices.ComTypes; using System.Windows.Forms; using System.IO; namespace NetLibrary { public class HtmlCapture { #region html转图片 public static void ConverUrl(string url, string imgSavePath, int Width, int Height) { string ImagePath = string.Empty; WebBrowser web = new WebBrowser(); web.Navigate(url); while (web.ReadyState != WebBrowserReadyState.Complete) { System.Windows.Forms.Application.DoEvents(); } Rectangle screen = Screen.PrimaryScreen.Bounds; Size? imgsize = null; //set the webbrowser width and hight if (Width == 0) { web.Width = screen.Width; web.Height = screen.Height; } else { web.Width = Width; web.Height = Height; } //suppress script errors and hide scroll bars web.ScriptErrorsSuppressed = true; web.ScrollBarsEnabled = false; Rectangle body = web.Document.Body.ScrollRectangle; //check if the document width/height is greater than screen width/height Rectangle docRectangle = new Rectangle() { Location = new Point(0, 0), Size = new Size(body.Width > web.Width ? body.Width : web.Width, body.Height > web.Height ? body.Height : web.Height) }; //set the width and height of the WebBrowser object web.Width = docRectangle.Width; web.Height = docRectangle.Height; //if the imgsize is null, the size of the image will //be the same as the size of webbrowser object //otherwise set the image size to imgsize Rectangle imgRectangle; if (imgsize == null) imgRectangle = docRectangle; else imgRectangle = new Rectangle() { Location = new Point(0, 0), Size = imgsize.Value }; //create a bitmap object Bitmap bitmap = new Bitmap(imgRectangle.Width - 24, imgRectangle.Height); //get the viewobject of the WebBrowser IViewObject ivo = web.Document.DomDocument as IViewObject; using (Graphics g = Graphics.FromImage(bitmap)) { //get the handle to the device context and draw IntPtr hdc = g.GetHdc(); ivo.Draw(1, -1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, hdc, ref imgRectangle, ref docRectangle, IntPtr.Zero, 0); g.ReleaseHdc(hdc); } bitmap.Save(imgSavePath, System.Drawing.Imaging.ImageFormat.Jpeg); bitmap.Dispose(); web.Dispose(); } #endregion #region html文档转图片 public static void ConverHTML(string html, string imgSavePath, int Width, int Height) { string dir = AppDomain.CurrentDomain.BaseDirectory + "ServerCookies"; if (Directory.Exists(dir) == false) Directory.CreateDirectory(dir); string tempPath = dir + "/" + Guid.NewGuid().ToString() + ".html"; if (File.Exists(tempPath) == false) File.Create(tempPath).Close(); File.AppendAllText(tempPath, html); ConverUrl(tempPath, imgSavePath, Width, Height); File.Delete(tempPath); } #endregion } #region==========IViewObje【实现接口类】================ [ComVisible(true), ComImport()] [GuidAttribute("0000010d-0000-0000-C000-000000000046")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IViewObject { [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int Draw( [MarshalAs(UnmanagedType.U4)] UInt32 dwDrawAspect, int lindex, IntPtr pvAspect, [In] IntPtr ptd, IntPtr hdcTargetDev, IntPtr hdcDraw, [MarshalAs(UnmanagedType.Struct)] ref Rectangle lprcBounds, [MarshalAs(UnmanagedType.Struct)] ref Rectangle lprcWBounds, IntPtr pfnContinue, [MarshalAs(UnmanagedType.U4)] UInt32 dwContinue); [PreserveSig] int GetColorSet([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [In] IntPtr ptd, IntPtr hicTargetDev, [Out] IntPtr ppColorSet); [PreserveSig] int Freeze([In, MarshalAs(UnmanagedType.U4)] int dwDrawAspect, int lindex, IntPtr pvAspect, [Out] IntPtr pdwFreeze); [PreserveSig] int Unfreeze([In, MarshalAs(UnmanagedType.U4)] int dwFreeze); void SetAdvise([In, MarshalAs(UnmanagedType.U4)] int aspects, [In, MarshalAs(UnmanagedType.U4)] int advf, [In, MarshalAs(UnmanagedType.Interface)] IAdviseSink pAdvSink); void GetAdvise([In, Out, MarshalAs(UnmanagedType.LPArray)] int[] paspects, [In, Out, MarshalAs(UnmanagedType.LPArray)] int[] advf, [In, Out, MarshalAs(UnmanagedType.LPArray)] IAdviseSink[] pAdvSink); } #endregion }