perl Gtk2 :: WebKit:如何进行整页截图

时间:2014-05-23 19:39:10

标签: perl webkit

我正在使用perl模块Gtk2::WebKit来创建浏览器并截取网页的屏幕截图。截取页面可见部分的屏幕截图(窗口大小)没有问题。但是,如何拍摄整页的屏幕截图,甚至是窗口中不可见的部分?

2 个答案:

答案 0 :(得分:3)

我认为this正是您所寻找的。我在Github上找到了它。

screenshot.pl - 截图

将页面另存为SVG:

screenshot.pl --type svg http://www.google.com/

将页面另存为PDF:

screenshot.pl --output cpan.pdf http://search.cpan.org/

将从XPath查询中获取的页面元素另存为PNG:

screenshot.pl --output ba.png --xpath 'id("content")' http://bratislava.pm.org/

答案 1 :(得分:1)

以下是此问题的 GTK2 解决方案:

#!/usr/bin/perl
use Gtk2 -init;
use Gtk2::WebKit;
use Data::Dumper; 

my $window = Gtk2::Window->new;
my $sw     = Gtk2::ScrolledWindow->new;
my $view   = Gtk2::WebKit::WebView->new;
my $factor = 0;

$window->set_default_size(Gtk2::Gdk->screen_width, Gtk2::Gdk->screen_height);
$window->set_border_width(1);
$sw->add($view);
$window->add($sw);

$window ->signal_connect( 'destroy' => \&delete_event );
$view->signal_connect( 'load-finished' => \&prepare_zoom);

$view->set_full_content_zoom(TRUE);
$view->signal_connect( 'size-allocate' => \&screenshot);
$view->open('http://stackoverflow.com/questions');

$window->show_all;
Gtk2->main;


#####################################
sub delete_event {
    Gtk2->main_quit;
    return FALSE;
}  
#####################################

sub prepare_zoom {
    $adj = $sw->get_vadjustment();
    $factor = $adj->page_size/$adj->upper;
    $view->set_zoom_level($factor);
}

sub screenshot {
    return unless defined($window->window) && $factor>0;
    my ($width, $height) = $window->window->get_size;
    my $sWidth=$width*$factor;

    my $gdkpixbuf = Gtk2::Gdk::Pixbuf->new ('rgb', 0, 8, $width, $height);
    $gdkpixbuf->get_from_drawable($window->window, 
            undef, 0, 0, 0, 0, $width, $height);

    $gdkpixbuf->save ("screenshot.jpg", 'jpeg', quality => 100);
        #Gtk2->main_quit;
    return FALSE;
}

此代码有效,但我不是 GTK2 / Webkit 专家,所以我确信它可以用更好的方式编写。

背后的想法很简单:

  1. 加载页面
  2. 获取整页大小和可见页面大小,然后计算查看整页内容所需的比例因子
  3. 使用该比例因子缩放页面
  4. 抓住屏幕截图
  5. 备注

    • 取决于您要应用它的位置,比例因子计算可能需要一些更正
    • 您可以裁剪屏幕截图(删除空白区域),调整传递给get_from_drawable的值。