利用WebBrowser类实现超长网页的截图

在实际的工作中,有时我们需要对一些网页进行截图,一般的网页截图的代码如下(VB2010)

 



 

这段代码用到了辅助类clsCaptureSettings。这个类有3个字段:Url:要访问的网页的地址;Width:要截图的宽度,默认是1024;TimeOut:超时设置,默认是180秒;

以上代码实现截图的关键就是两句话

_Web.Height = _Web.Document.Body.ScrollRectangle.Height

把WebBrowser的高度设置和网页高度一致

_Web.DrawToBitmap(_Bmp, R)

将WebBrowser类中的内容画到位图对象

 

上面的代码经测试,会有如下的两个问题

1、当WebBrowser的高度设置超过20000(是个约数,没有仔细测量过)时,DrawToBitmap方法会有一定几率失效,没法完成截图。而且,WebBrowser的高度越大,失效的几率越大。

2、WebBrowser的高度也不是能无限设置的,其上限是65536,超过这个上限的时候,Webbrowser类会自动设置高度为65536,而当高度设置为65536时,DrawToBitmap方法失效的几率几乎是100%

 

这样,上面的代码在截取超长网页的时候就会出现问题,几乎不能完成网页的截图。

 

于是,需要改动代码。利用滚屏实现网页截图。

实现滚屏的技术难点在于,一是如何通过代码滚动网页?通过查阅资料,用如下的代码即可。

_Web.Document.Window.Parent.ScrollTo(X, Y)

该代码将网页滚动到水平X,垂直Y的位置。

 

二是,如何获得当前网页滚动的垂直位置?代码如下:

_Web.Document.Body.Parent.ScrollTop

 

因此,改进后的代码如下:

 

    Private Shared Function CaptureWeb(Settings As Object)As Object

        Dim _Settings As clsCaptureSettings = CType(Settings, clsCaptureSettings)

        Dim _Bmp As Bitmap =Nothing

        Dim iAs Integer

        Const WEB_HEIGHT As Integer = 10000

        Using _Web As NewWebBrowser

            _Web.ScrollBarsEnabled =False

            _Web.Width = _Settings.Width

            _Web.Height = WEB_HEIGHT

            Dim _Time As Date = Now.AddSeconds(_Settings.TimeOut)

            _Web.Navigate(_Settings.Url)

            Do Until (_Web.ReadyState = WebBrowserReadyState.Complete) OrElse (Now > _Time)

                Application.DoEvents()

           Loop

            _Web.Stop()

            Dim _WebHeightAs Integer

            If _Web.Document.BodyIs Nothing Then

                _WebHeight = 500

           Else

                _WebHeight = _Web.Document.Body.ScrollRectangle.Height

           End If

            _Bmp = New Bitmap(_Web.Width, _WebHeight)

            Dim R As Rectangle = New Rectangle(0, 0, _Web.Width, WEB_HEIGHT)

            For i = 0 To _WebHeight - 1 Step WEB_HEIGHT

                _Web.Document.Window.Parent.ScrollTo(0, i)

                If _Web.Document.Body.Parent.ScrollTop = i Then

                    _Web.DrawToBitmap(_Bmp, R)

                    R.Offset(0, WEB_HEIGHT)

               Else

                    R.Y = _Web.Document.Body.Parent.ScrollTop

                    _Web.DrawToBitmap(_Bmp, R)

               End If

            Next

        End Using

        Return _Bmp

   End Function

 

此改进后的代码相较之前的代码增加了滚动网页的代码,因此在截相同的网页的时候,效率会差点,但是可能截一些超长网页。

什么地方会出线超长网页?很多大家不注意的地方,那就是论坛,一般论坛都是主题一个,每页的回复数是30个。这样,很容易整个网页的长度就超过65536了。用之前的代码是无法实现截图的,而用改进后的代码就可以实现这点。

时间: 2025-01-03 07:53:35

利用WebBrowser类实现超长网页的截图的相关文章

C/S模式开发中如何利用WebBrowser控件制作导航窗体

原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见进销存系统的同学肯定知道,在进入系统之后一般在mdi窗体中系统自动打开一个导航子窗体.将一些常见的功能以非常直观的图形展示给用户.观察市面上的此类产品,该功能基本是所有mdi窗体开发的管理系统中必备的功能窗体.下面我们就来分析一下如何在.net中实现这个功能.幸好我上次做了一个类似的系统,里面也用到

C#对指定的网页进行截图

碰到一个项目,需要对指定的网页进行截图保存,晕死! 需求永远都是怪异的..... 解决是关键- 遂写了以下代码,快准狠!(因为赶时间!) 可以实现对指定的页面获取,按指定的大小生成缩略图,当然也可以1:1的产生图,页面上的javascript 运行对截图貌似没任何影响,相当的正常,我个人都觉得很神奇. 首先对项目添加系统引用 System.Drawing; System.Drawing.Design; System.Windows.Forms; 获取指定网页并转换成图片的类: using Sys

对指定的网页进行截图的效果 C#版_C#教程

碰到一个项目,需要对指定的网页进行截图保存,晕死! 需求永远都是怪异的..... 解决是关键- 遂写了以下代码,快准狠!(因为赶时间!) 可以实现对指定的页面获取,按指定的大小生成缩略图,当然也可以1:1的产生图, 页面上的javascript 运行对截图貌似没任何影响,相当的正常,我个人都觉得很神奇.  首先对项目添加系统引用 System.Drawing; System.Drawing.Design; System.Windows.Forms; 获取指定网页并转换成图片的类: using S

利用webBrowser获取框架内Html页面内容

原文:利用webBrowser获取框架内Html页面内容 利用webBrowser获取页面比较简单,MSDN下有示例,在这里不必多说. 可是一些 HTML 文档由"框架"构成,或可以存放它们自己独特 HTML 文档的窗口.使用框架可以轻松地创建 HTML 页面,其中一页或多页在其他框架持续更改它们内容的同时保持静态,例如导航栏. HTML 作者可以采用以下两种方法之一创建框架: 使用 FRAMESET 和 FRAME 标记,创建固定窗口. - 或 - 使用 IFRAME 标记,创建可以

php利用smtp类实现电子邮件发送_php技巧

smtp类发送邮件的方法既简单又稳定,几行简单的配置就能发邮件,是不是很期待的试一试呢! 以下就是核心代码: <?php require_once "email.class.php"; //******************** 配置信息 ******************************** $smtpserver = "smtp.126.com";//SMTP服务器 $smtpserverport =25;//SMTP服务器端口 $smtpus

软文网:企业如何利用新闻类软文营销

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 新闻类型的软文的主要表现形式是新闻,通过新闻报道或新闻评论分析的形式把广告自然的穿插在软文中,以期达到"随风潜入夜 润物细无声"的作用.由于新闻类软文在形式上的隐蔽性和表达上的悬念性.完整性与可看性,抓住了消费者的心理,为企业的宣传起到非常重要的口碑的用,所以说新闻软文营销是一种非常不错的营销形式. 新闻软文营销对企业的推

利用transitions类轻松创建图片过渡效果

创建 利用transitions类轻松创建图片过渡效果点击查看Flash:http://space.flash8.net/bbs/attachment.php?aid=311487 主场景第一帧上:myMovieClip.swapDepths(myMovieClip0); var i:Number = 0; function tween(obj) {         i++;         myMovieClip0.gotoAndStop(i-1);         obj.gotoAndSt

利用vbs类实现css按钮,建议入精华

<%rem 文章标题: 利用vbs类实现css按钮rem 作者:yanekrem 联系:aspboy@263.netClass CssButton    Public Name    Public BackColor    Public BorderColor    Public Font    Public FontColor    Public Width    Public Text    Public Url    Public MouseOverColor        Public

[Qt教程] 第23篇 数据库(三)利用QSqlQuery类执行SQL语句

[Qt教程] 第23篇 数据库(三)利用QSqlQuery类执行SQL语句 楼主  发表于 2013-5-15 22:39:29 | 查看: 813| 回复: 0 利用QSqlQuery类执行SQL语句 版权声明 该文章原创于作者yafeilinux,转载请注明出处! 导语        SQL即结构化查询语言,是关系数据库的标准语言.前面两节中已经在Qt里利用QSqlQuery类执行了SQL语句,这一节我们将详细讲解该类的使用.需要说明,因为我们重在讲解Qt中的数据库使用,而非专业的讲解数据库