1、html2canvas 生成图片简单又好用,但涉及到跨域就会出现问题,官方给出的解决办法是设置代理。基本原理就是在后端将图片的数据生成base64再返回给前端使用。使canvas画布分析元素的时候像分析本地的一样简单。这就是我的理解。官网给出的只有php的方法,我是照扒了一般java的出来。有写的不好的地方,欢迎大家指正。废话不多说了,先上代码。

@RequestMapping(value="/proxy", method = RequestMethod.GET)
public void getJwd(HttpServletRequest request,HttpServletResponse response){
String url = request.getParameter("url");
String callback = request.getParameter("callback");
if(url != "" && callback != ""){
try {
URL urlInfo = new URL(url);
if(urlInfo.getProtocol().equals("http") || urlInfo.getProtocol().equals("https")){
HttpURLConnection conn = (HttpURLConnection) urlInfo.openConnection();
String contentType = conn.getContentType();
if(contentType.equals("image/png") || contentType.equals("image/jpg") || contentType.equals("image/jpeg") || contentType.equals("image/gif") || contentType.equals("text/html") || contentType.equals("application/xhtml")){
if(request.getParameter("xhr2") != null){
response.setHeader("Access-Control-Allow-Origin", "*");
response.setContentType(contentType);
DataInputStream input = new DataInputStream(conn.getInputStream());
BufferedOutputStream bout = new BufferedOutputStream(response.getOutputStream());
try {
byte b[] = new byte[1024];
int len = input.read(b);
while (len > 0) {
bout.write(b, 0, len);
len = input.read(b);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
bout.close();
input.close();
}
}else{
response.setContentType("application/javascript");
if(contentType.equals("text/html") || contentType.equals("application/xhtml")){
}else{
// 获取数据流生成byte字节
DataInputStream input = new DataInputStream(conn.getInputStream());
input.toString();
byte[] buffer = new byte[1024 * 8]; ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
byte[] b = new byte[1024 * 8];
int n;
while ((n = input.read(b)) != -1) {
bos.write(b, 0, n);
}
input.close();
bos.close();
buffer = bos.toByteArray();
// 将byte转成base64
BASE64Encoder encode = new BASE64Encoder();
String base64data = encode.encode(buffer);
base64data = base64data.replaceAll("\r\n","");
response.getWriter().write(callback+"('"+ "data:" + contentType + ";base64," + base64data +"')");
}
} }
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

  2、前端调用的代码如下:

html2canvas(document.getElementById("aaaaaaa"), {
"logging": true, //Enable log (use Web Console for get Errors and Warnings)
"proxy": basePath + "canvas/proxy.do",
"onrendered": function(canvas) {
var img = new Image();
img.crossOrigin = "*";
img.onload = function() {
img.onload = null;
//document.body.appendChild(img);
$("#Screenshot_show").append(img);
};
img.onerror = function() {
img.onerror = null;
if(window.console.log) {
window.console.log("Not loaded image from canvas.toDataURL");
} else {
alert("Not loaded image from canvas.toDataURL");
}
};
img.src = canvas.toDataURL("image/png");
}
});

  总之就是这样子了,算是蛮简单的例子吧。

最后,附上我上传到scdn的例子

  http://download.csdn.net/download/shuangwj/9561348

java使用代理 html2canvas 截屏 将页面内容生成图片的更多相关文章

  1. html2canvas将页面内容生成图片

    html2canvas官网链接地址:https://html2canvas.hertzen.com/ <!doctype html> <html lang="en" ...

  2. html2canvas截屏在H5微信移动端踩坑,ios和安卓均可显示

    1.最近在做移动端开发,框架是vue,一产品需求是,后台返回数据,通过qrcode.js(代码比较简单,百度上已经很多了)生成二维码,然后通过html2canvas,将html元素转化为canvas, ...

  3. vue中使用html2canvas及解决html2canvas截屏图片模糊问题

    最近在项目中用到了html2canvas插件,遇到的一些坑写下来,与大家共勉. html2canvas  官方网站http://html2canvas.hertzen.com/index.html 这 ...

  4. html2canvas截屏用法

    <!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...

  5. html2canvas 截屏 兼容手机端

    <template> <div> <!--<input type="button" id="btnsavaImg" valu ...

  6. Java实现网页截屏功能(基于phantomJs)

    公司最近有个需求:把用户第一次的测量身体信息和最近一次测量信息进行对比,并且需要把对比的数据截成图片可以发给用户(需要在不打开网页的情况下实时对网页进行截图然后保存到服务器上,返回图片地址),通过网上 ...

  7. Javascript网页截屏的方法

    最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...

  8. iOS应用截屏

    iPhone自从推出后就自带了截屏功能,简单而易用,所以应用就没什么截屏的需求了,不过有些时候我们还是会遇到这个需求.比如,我们开发了一个播放器,用openGL进行video render,此时直接截 ...

  9. Android 获取浏览器当前分享页面的截屏

    Android 获取浏览器当前分享页面的截屏 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/BrowserScreenShotActivity 文中 ...

随机推荐

  1. python导入opencv解决no module named cv2问题

    最近ubuntu用的比较多,在写神经网络代码时也会经常接触到python,但是python的环境配置确实是个头疼的问题. 尤其是接触到opencv时,需要导入opencv的库文件,网上也有很多方法,本 ...

  2. MessageClient

    using Manager.Common; using System; using System.Collections.Generic; using System.Diagnostics; usin ...

  3. 【单点登录】【两种单点登录类型:SSO/CAS、相同一级域名的SSO】

    单点登录:SSO(Single Sign On) 什么是单点登录:大白话就是多个网站共享一个用户名和密码的技术,对于普通用户来说,只需要登录其中任意一个网站,登录其他网站的时候就能够自动登陆,不需要再 ...

  4. Oracle学习笔记(1)----忘记用户名的密码该如何找回

    (1)在连接数据库之前需要打开如下服务: (2)如果忘记用户的密码 I:打开cmd窗口 II:键入命令:connect / as sysdba; III:alter user 用户名 identifi ...

  5. asp之缓存 cachestate

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  6. Linux手绑IP

    修改配置文件vim /etc/sysconfig/network-scripts/ifcfg-eth0 注释dhcp#BOOTPROTO="dhcp" 注释ipv6#IPV6INI ...

  7. Mac Mail PGP Setup 如何在苹果电脑上设置安全邮件 良好隐私密码法(英语:Pretty Good Privacy,缩写为PGP)

    背景知识 良好隐私密码法(英语:Pretty Good Privacy,缩写为PGP),一套用于讯息加密.验证的应用程序,采用IDEA的散列算法作为加密与验证之用. 关联文献:https://en.w ...

  8. Java8的伪共享和缓存行填充--@Contended注释

    在我的前一篇文章<伪共享和缓存行填充,从Java 6, Java 7 到Java 8>中, 我们演示了在Java 8中,可以采用@Contended在类级别上的注释,来进行缓存行填充.这样 ...

  9. LINQ的基本认识

    前些日子,我的一个兄弟问我一个关于LINQ的问题,他问我AsEnumerable()在他写的一大段代码中的作用. 我不太清楚他是知道想考考我,还是不太清楚,想问题一下,反正我不太知道. 以前接触过一些 ...

  10. 3.UIViewController详解

     一. UIViewController,视图控制器,它是UIKit中非常重要的组成部分.它由控制器+View两部分组成. 控制器功能: ->实现代码逻辑,决定它自带的View的界面显示. -& ...