Инструмент html2canvas (http://html2canvas.hertzen.com/) позволяет создавать скриншоты Web страниц или их частей на основе отображаемых DOM объектов.

Однако инструмент html2canvas имеет ограничения – он не может считывать ресурсы других доменов.
 
Поэтому для создания скриншотов сторонних Web сайтов необходимо привлекать прокси-сервис на стороне сервера, который будет передавать HTML-код и изображения от стороннего Web-сайта стороне клиента, использующего инструмент html2canvas.
 
Для создания такого прокси-сервиса можно привлечь Headless-браузер HTMLUnit (http://htmlunit.sourceforge.net/), моделирующий HTML-документы и предоставляющий API для анализа HTML-страниц.
 
Для использования инструмента html2canvas на HTML-страницу приложения, которая будет отображать скриншот стороннего Web-сайта, добавим код:
 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 
 
    <html>
 
 
    <head>
 
 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 
 
    <title>Sitemap Screenshots</title>
 
 
    </head>
 
 
    <script src="js/jquery.js"></script>
 
 
    <script type="text/javascript" src="js/html2canvas.js"></script>
 
 
    <script type="text/javascript">
 
 
    $(document).ready(function() {
 
 
    var url="http://www.cnn.com/";
 
 
    $.ajax({
 
 
    type: "POST",
 
 
    url: "/htmlunit",
 
 
    data:{ wait: "2000", url: url },
 
 
    async: false,
 
 
    success : function(data) {
 
 
    $(".screenframe").remove();
 
 
    var iframe="<iframe class='screenframe' style='display:none;'></iframe>";
 
 
    $('body').append($(iframe));
 
 
    var target = $('iframe').contents()[0];
 
 
    target.open();
 
 
    target.write(data);
 
 
    target.close();
 
 
    $('iframe').load(function(){
 
 
    var target = $(this).contents().find('body');
 
 
    html2canvas(target, {
 
 
    onrendered: function(canvas) {
 
 
    var data = canvas.toDataURL();
 
 
    $('body').append("<img width='500' src="+data+" />");
 
 
    }
 
 
    });
 
 
    });
 
 
    }
 
 
    });
 
 
    });
 
 
    </script>
 
 
    <body>
 
 
    </body>
 
 
    </html>
 
Данный скрипт передает URL-адрес стороннего Web-сайта сервлету на стороне сервера, который использует HTMLUnit для возврата обратно HTML-кода стороннего Web-сайта.
 
После получения HTML-кода стороннего Web-сайта скрипт создает фрейм, добавляет его на страницу и записывает в него HTML-код стороннего Web-сайта.
 
После загрузки фрейма инструмент html2canvas создает его изображение, которое и добавляет на страницу приложения.
 
Код сервлета, служащего прокси-сервисом:
 
 import java.io.IOException;
 
 
    import java.io.PrintWriter;
 
 
    import javax.servlet.ServletException;
 
 
    import javax.servlet.http.HttpServlet;
 
 
    import javax.servlet.http.HttpServletRequest;
 
 
    import javax.servlet.http.HttpServletResponse;
 
 
    import com.gargoylesoftware.htmlunit.BrowserVersion;
 
 
    import com.gargoylesoftware.htmlunit.WebClient;
 
 
    import com.gargoylesoftware.htmlunit.html.HtmlPage;
 
 
    @SuppressWarnings("serial")
 
 
    public final class HTMLUnitServlet extends HttpServlet {
 
 
    @Override
 
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
 
    int wait = 2000;
 
 
    if (request.getParameter("url") != null) {
 
 
    final WebClient webClient = new WebClient(BrowserVersion.CHROME);
 
 
    webClient.getOptions().setThrowExceptionOnScriptError(false);
 
 
    String url = request.getParameter("url");
 
 
    HtmlPage page = webClient.getPage(url);
 
 
    if (request.getParameter("wait") != null) {
 
 
    wait=Integer.parseInt( request.getParameter("wait") );
 
 
    }
 
 
    webClient.waitForBackgroundJavaScript(wait);
 
 
    response.setCharacterEncoding("UTF-8");
 
 
    PrintWriter out = response.getWriter();
 
 
    String xml=page.asXml();
 
 
    System.out.println(xml);
 
 
    xml = xml.replace("<head>","<head><base href='"+url+"' />");
 
 
    out.println(xml);
 
 
    }}}
 
Не забудем объявить сервлет в web.xml:
 
 
    <servlet>
 
 
    <servlet-name>com.tmsoftstudio.HTMLUnitServlet</servlet-name>
 
 
    <servlet-class>com.tmsoftstudio.HTMLUnitServlet</servlet-class>
 
 
    </servlet>
 
 
    <servlet-mapping>
 
 
    <servlet-name>com.tmsoftstudio.HTMLUnitServlet</servlet-name>
 
 
    <url-pattern>/htmlunit</url-pattern>
 
 
    </servlet-mapping>