Как получить весь скриншот страницы быть awesomium? - PullRequest
2 голосов
/ 07 августа 2011

Проблема в том, что ширина и высота задаются при создании WebView, и я не вижу никакой возможности изменить его после загрузки страницы (и стал известен реальный размер). Чтобы обойти это, я использую два WebView: первый, чтобы получить размер, и второй, чтобы сделать скриншот:

static bool finishedLoading;
static bool finishedScroll;
static ScrollData scrollData;

static void Main(string[] args)
{
   WebCore.Initialize(new WebCoreConfig() { CustomCSS = "::-webkit-scrollbar { visibility: hidden; }" });

   var webView1 = WebCore.CreateWebView(800, 600, false);
   webView1.LoadURL("http://someurl");
   webView1.LoadCompleted += OnFinishLoading;

   while (!finishedLoading)
   {
      Thread.Sleep(100);
      WebCore.Update();
   }

   webView1.RequestScrollData();
   webView1.ScrollDataReceived += new ScrollDataReceivedEventHandler(ScrollDataReceived);

   while (!finishedScroll)
   {
      Thread.Sleep(100);
      WebCore.Update();
   }

   var webView2 = WebCore.CreateWebView(scrollData.ContentWidth, scrollData.ContentHeight, false);

   finishedLoading = false;
   webView2.LoadURL("http://someUrl");
   webView2.LoadCompleted += OnFinishLoading;

   while (!finishedLoading)
   {
      Thread.Sleep(100);
      WebCore.Update();
   }

   webView2.Render().SaveToPNG("filePath");

   WebCore.Shutdown();
}

static void ScrollDataReceived(object sender, ScrollDataEventArgs e)
{
   finishedScroll = true;
   scrollData = e.ScrollData;
}

static void OnFinishLoading(object sender, EventArgs e)
{
   finishedLoading = true;
}

Я надеюсь, что есть лучший способ ...

1 Ответ

2 голосов
/ 08 августа 2011

Вместо создания нового WebView после получения измерений прокрутки вам просто нужно изменить его размер с помощью WebView.Resize, а затем дождаться завершения операции изменения размера (см. WebView.IsResizing).

Недавно я написал учебник о том, как захватывать целые веб-страницы с помощью Awesomium: http://labs.awesomium.com/capturing-web-pages-with-c/

Код использует C API, но он должен быть очень похож на .NET API. Есть также полный пример кода (ссылка находится внизу), который демонстрирует, как захватывать очень длинные веб-страницы в несколько изображений без потери оперативной памяти.

Надеюсь, это поможет!

...