asp.net进行网页截图

昨天做那个网站首页时,需要对一个子网页进行网页截图。这个东西看似困难,用google一查貌似有很简单的方法。。而且相当神奇,好象是用了ActiveX。所截出来的图片和真实的几乎一模一样,而且可以缩放大小。

首先在需要进行截图的aspx页面上修改第一行,加上AspCompat="true",为了使网页在STAThread模式下运行。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" AspCompat="true" %>

然后在页面里加入以下代码:

C#语言:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;//注意加上这句,并添加System.Windows.Forms引用。

public partial class _Default : System.Web.UI.Page
{
    private WebBrowser _webBrowser;
   
   
    protected void Page_Load(object sender, EventArgs e)
    {
        string url = Request.QueryString["url"];
        if (string.IsNullOrEmpty(url))
        {
            url = "http://www.wanganran.com/";
        }
       
        _webBrowser = new WebBrowser();
        _webBrowser.ScrollBarsEnabled = false; //不显示滚动条
        _webBrowser.Navigate(url);
        _webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(Completed);
       
        while (_webBrowser.ReadyState != WebBrowserReadyState.Complete)
        {
            System.Windows.Forms.Application.DoEvents(); //避免假死,若去掉则可能无法触发 DocumentCompleted 事件。
        }
    }
   
   
     public void Completed(object sender, WebBrowserDocumentCompletedEventArgs e)
     {
            //设置浏览器宽度、高度为文档宽度、高度,以便截取整个网页。
            _webBrowser.Width = _webBrowser.Document.Body.ScrollRectangle.Width;
            _webBrowser.Height = _webBrowser.Document.Body.ScrollRectangle.Height;
            using (Bitmap bmp = new Bitmap(_webBrowser.Width, _webBrowser.Height))
            {
                _webBrowser.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
                bmp.Save(Response.OutputStream, ImageFormat.Jpeg);
                Response.ContentType = "image/jpeg";
            }
     }
}

然后在地址改成xxx.aspx?url=想截的网页地址,理论上就能看到图像了。

不过使用时发现有时候怎么也截不了,说引发InteropServices.COMExceptions异常,此时重启一次asp.net development server就可以了,不知道为嘛。。

而且可以在Completed方法里加上用Graphics类进行缩放的代码,这样就支持缩放了。

不过由于每次截图都要访问一次网页(属于纯模拟截图),建议把截过的图片进行缓存。

发表评论