2013-06-27 3 views
2

Я изо всех сил пытаюсь найти способ сделать снимок экрана веб-сайта в MVC4. Я видел два потенциальных решения, которые не подходят для MVC.Как сделать снимок экрана с сайта MVC?

Первый использует WebBrowser, учебник найден here, но это дает мне ошибку ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment.

Другой использует стороннюю сторону, которая называется Grabz.It, но я не нашел способ ее интеграции в MVC.

Любые другие идеи/решения?

Спасибо.

+0

Я не понимаю, что вы имеете в виду в своем комментарии к ответу @ CodeCaster. Что вы подразумеваете под «необходимостью сохранять скриншоты веб-сайтов, которые люди подают мне»? –

+0

Возможно, мне нужно объяснить, что я хочу более подробно. Я размещаю каталог веб-сайтов, которые другие мне подчиняют. Сначала мне нужно иметь код на стороне сервера для проверки, и я хочу сохранить и показать изображение миниатюры вместе с URL-адресом при перечислении URL-адреса. – happygilmore

+0

Итак, пользователь отправит вам URL-адрес, а затем вы хотите, чтобы ваше приложение (работающее где-то на каком-то сервере) каким-то образом загрузило этот URL-адрес в виртуальный браузер и сняло скриншот? –

ответ

1

Почему вы хотите интегрировать это в MVC? Это ваш сайт ответственности за скриншоты других сайтов? Я бы предпочел создать скриншот-логику в отдельной библиотеке, например, в качестве службы Windows.

Элемент управления WebBrowser должен работать в потоке пользовательского интерфейса, которого нет у службы (например, IIS). Однако вы можете попробовать другие библиотеки.

Вы можете, например, написать код около wkhtmltopdf, который отображает (как может показаться название) HTML в PDF с помощью механизма WebKit.

+0

да это код, размещенный только на моем сайте – happygilmore

+0

Другая библиотека, которую вы можете использовать, - [Selenium WebDriver] (http://stackoverflow.com)/д/16795458/247702). – Stijn

+0

PhantomJS предлагает безголовые скриншоты. http://phantomjs.org/ –

3

С учетом ваших дополнительных данных вы сможете сделать это с помощью любого количества инструментов. Идея CodeCaster прекрасна, и PhantomJS также предлагает аналогичную генерацию изображений на основе webkit произвольного URL-адреса (https://github.com/ariya/phantomjs/wiki/Screen-Capture). Он предлагает несколько параметров выходного формата, таких как PNG, JPG, GIF и PDF.

Поскольку PhantomJS использует WebKit, настоящий механизм компоновки и рендеринга, он может захватывать веб-страницу как скриншот. Поскольку PhantomJS может отображать что-либо на веб-странице, его можно использовать для преобразования содержимого не только в HTML и CSS, но и в SVG и Canvas.

Вам нужно будет выполнить приложение phantomjs.exe из своего приложения MVC или, возможно, даже лучше, если какая-то служба, работающая за кулисами, обрабатывает очередь отправленных URL-адресов.

+0

Поскольку я нахожусь на общем хостинге, я не могу запустить PhantomJS, поэтому я рассматриваю другие варианты. Я сообщу этот пост, когда найду лучшее решение. Спасибо хоть. – happygilmore

1

Необходимо указать, что поток находится в STA (однопоточный режим квартиры, чтобы создать веб-браузер).

public ActionResult Save() 
{ 
    var url = "http://www.google.co.uk"; 

    FileContentResult result = null; 
    Bitmap bitmap = null; 

    var thread = new Thread(
    () => 
    { 
     bitmap = ExportUrlToImage(url, 1280, 1024); 
    }); 

    thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA 
    thread.Start(); 
    thread.Join(); 

    if (bitmap != null) 
    { 
     using (var memstream = new MemoryStream()) 
     { 
      bitmap.Save(memstream, ImageFormat.Jpeg); 
      result = this.File(memstream.GetBuffer(), "image/jpeg"); 
     } 
    } 

    return result; 
} 

private Bitmap ExportUrlToImage(string url, int width, int height) 
{ 
    // Load the webpage into a WebBrowser control 
    WebBrowser wb = new WebBrowser(); 
    wb.ScrollBarsEnabled = false; 
    wb.ScriptErrorsSuppressed = true; 

    wb.Navigate(url); 
    while (wb.ReadyState != WebBrowserReadyState.Complete) 
    { 
      Application.DoEvents(); 
    } 

    // Set the size of the WebBrowser control 
    wb.Width = width; 
    wb.Height = height; 

    Bitmap bitmap = new Bitmap(wb.Width, wb.Height); 
    wb.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, wb.Width, wb.Height)); 
    wb.Dispose(); 

    return bitmap; 
}