石家庄做网站:网站快照

介绍

我有兴趣知道如果提供了该页面的URL,如何创建一个可以拍摄另一个网页快照的网页。我为此搜索了很多内容,但我想出的只是一系列第三方组件。在这些页面上,我发现您实际上有一个内置于操作系统的组件来处理Web浏览。事实上,这个组件作为WebBrowser控件被运送到VS IDE(2005)中; 我的意思是这个控件包装了这个组件提供的功能。

背景

这个项目可能与您之前完成的任何其他Web项目不同。确切地说,它不仅仅是一个网络项目; 它也是一个Windows应用程序项目。是的,您可能想知道我们需要的方式和原因?等着瞧。

Windows应用程序(prjSnapShot)

以下是实际让我认为捕获网页图像的过程成为可能的链接。但是,您需要执行此项目并根据您的需要进行调整。这很容易理解。您只需要一个停靠在Windows窗体上的WebBrowser控件,然后使用下面的代码来帮助您入门。它几乎与我提到的项目类似,但是我已经做了一些改变以满足我的需求。

隐藏   收缩    复制代码

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace Snapshot
{    //This is my windows form class
    public partial class browserForm : Form
    {        public browserForm()
        {
            InitializeComponent();
        }        //private variables for properties
        private string _URL;        private Bitmap docImg;        private bool DownloadingComplete;        

        //this property accepts a URL.
        public string URL
        {            get
            {                return _URL;
            }            set
            {
                _URL = value;
            }
        }        //function that fetches the image and return a System.Drawing.Image
        //representation of it.
        public Image GetSnapshot()
        {            if (_URL == null)                throw new Exception("No input url given");            if (_URL.Contains("http://") == false)                throw new Exception("Invalid url input. No http prefix was found");
            docImg = new Bitmap(this.Width, this.Height);
            Control ctrl = wbCtrl;

            wbCtrl.Navigate(_URL);            //blocking until downloading complete
            while (!DownloadingComplete)
                Application.DoEvents();          

            return System.Drawing.Image.FromHbitmap(docImg.GetHbitmap());
        }        
        private void wbCtrl_DocumentCompleted
		(object sender, WebBrowserDocumentCompletedEventArgs e)
        {            //Actual downloading done here.
            //Conversion to image is also done here.

            DownloadingComplete = true;
            Debug.Print("Download Completed @ " + DateTime.Now.ToString());
            docImg = new Bitmap(this.Width, this.Height);
            Control ctrl = wbCtrl;
            ctrl.DrawToBitmap(docImg, new Rectangle(wbCtrl.Location.X, wbCtrl.Location.Y,
                    wbCtrl.Width, wbCtrl.Height));
        }
    }
}

您可能需要运行此项目几次; 将它添加到另一个Windows项目,就像我链接到的文章中的建议一样。整个事物的美妙之处在于,您实际上不会看到这个形式!完成测试后,将项目转换为DLL。我们将把它添加到下一个项目中。

ASP.NET项目

将上面的DLL添加到此项目中。让我警告你,如果你现在尝试使用它,你可能会遇到很多问题。哦,顺便说一句,这个项目并没有那么多“做”。但是你要理解一些概念。即ASP.NET引擎如何处理您的网页。这本身就是一个很大的话题,但我只会提到一些事情:

在这里,您必须意识到我们已将一个Windows项目添加到ASP.NET项目中。大多数控件,可能整个表单本身都在单线程单元(STA)模型上运行。因此,你会得到一个错误,说像线程而不是STA。

要克服这个障碍,您所要做的就是将网页的AspCompat 页面属性设置为trueASP.NET引擎将立即意识到必须在STA上处理此网页。事实上,我相信这是普通ASP页面用于处理的方式。

下一个障碍是真正让你烦恼的事情。一切似乎都没问题,但你会得到一个奇怪的COM异常,以及一个奇怪的错误代码。有时,第一次运行应用程序时它会顺利进行,但每个后续请求都会抛出错误。谷歌搜索此错误代码是没有用的。你需要一些COM知识。但是,我不是这方面的专家,但我可以安全地告诉你,你要告诉你的操作系统你已经完成了使用你的COM对象; 否则使用相同对象的其他应用程序可能会表现不正常。所以最终你在这里看到的可能是COM没有被正确引用。如果遇到此类问题,请停止本地Web服务器(由IDE为您托管),然后重新启动它; 在IDE中再次运行该项目。

使用代码

我希望你已经理解了以上所有内容。现在使用代码就像下面这样简单:

隐藏   复制代码

protected void btnGenerate_Click(object sender, EventArgs e)
{
    browserForm frm = new browserForm();
    frm.URL = txtURL.Text;
    System.Drawing.Image snapshot;
    snapshot = frm.GetSnapshot();
    snapshot.Save(Server.MapPath("snap.jpg"), System.Drawing.Imaging.ImageFormat.Jpeg);
    frm.Dispose();
    Image1.ImageUrl = "snap.jpg";    
}

哦,我所有的网页形式都是文本框,按钮和图像控件。

石家庄做网站:网站快照

合作伙伴

网站备案:豫ICP备15023476号-1 唯特科技