由于业务需要,要将html
的表格转成图片下载下来,一开始使用的是html2canvas.js
。功能是可以实现,但是有缺陷(表格存在合并的单元格时,生成的图片表格线框不完整),后来很不容易知道了dom-to-image.js
,尝试之后觉得非常不错。
废话不多说,开搞。
第一步:下载必要的js库
① jquery库(不使用jquery的就算了,要的自己能找到的):
②dom-to-image.js:这里写链接内容
③FileSaver.js:这里写链接内容
第二步:新建html,引用第一步的几个库
第三步:实现生成图片
①生成png的图片插入的到当前页面
var node = document.getElementById('my-node');
domtoimage.toPng(node)
.then(function (dataUrl) {
var img = new Image();
img.src = dataUrl;
document.body.appendChild(img);
})
.catch(function (error) {
console.error('oops, something went wrong!', error);
});
②生成图片并下载png格式
domtoimage.toBlob(document.getElementById('my-node'))
.then(function (blob) {
window.saveAs(blob, 'my-node.png');
});
③生成图片并下载jpeg格式
domtoimage.toJpeg(document.getElementById('my-node'), { quality: 0.95 })
.then(function (dataUrl) {
var link = document.createElement('a');
link.download = 'my-image-name.jpeg';
link.href = dataUrl;
link.click();
});
④还两种生成SVG
和pixel data
的
domtoimage.toSvg(document.getElementById('my-node'), {filter: filter})
.then(function (dataUrl) {
/* do something */
});
var node = document.getElementById('my-node');
domtoimage.toPixelData(node)
.then(function (pixels) {
for (var y = 0; y < node.scrollHeight; ++y) {
for (var x = 0; x < node.scrollWidth; ++x) {
pixelAtXYOffset = (4 * y * node.scrollHeight) + (4 * x);
/* pixelAtXY is a Uint8Array[4] containing RGBA values of the pixel at (x, y) in the range 0..255 */
pixelAtXY = pixels.slice(pixelAtXYOffset, pixelAtXYOffset + 4);
}
}
});
完整的Demo:
<html>
<head>
<script type="text/javascript" src="jquery-1.11.2.min.js"></script>
<script type="text/javascript" src="dom-to-image.js"></script>
<script type="text/javascript" src="FileSaver.js"></script>
<script type="text/javascript">
$(function(){
//
$("#btn").click(function(){
// 插入图片到html
// var node = document.getElementById('table');
// domtoimage.toPng(node)
// .then(function (dataUrl) {
// var img = new Image();
// img.src = dataUrl;
// document.body.appendChild(img);
// });
// 下载png图片
domtoimage.toBlob(document.getElementById('table'))
.then(function (blob) {
window.saveAs(blob, 'my-node.png');
});
// 下载jpeg图片
// domtoimage.toJpeg(document.getElementById('my-node'), { quality: 0.95 })
// .then(function (dataUrl) {
// var link = document.createElement('a');
// link.download = 'my-image-name.jpeg';
// link.href = dataUrl;
// link.click();
// });
// var node = document.getElementById('table');
// domtoimage.toPixelData(node)
// .then(function (pixels) {
// for (var y = 0; y < node.scrollHeight; ++y) {
// for (var x = 0; x < node.scrollWidth; ++x) {
// pixelAtXYOffset = (4 * y * node.scrollHeight) + (4 * x);
// /* pixelAtXY is a Uint8Array[4] containing RGBA values of the pixel at (x, y) in the range 0..255 */
// pixelAtXY = pixels.slice(pixelAtXYOffset, pixelAtXYOffset + 4);
// }
// }
// });
})
</script>
</head>
<body>
<input type="button" id="btn" value="do it" />
<h4>两行三列:</h4>
<table id="table" border="1" style="width:200px;border-collapse: collapse;border:1px solid black;">
<tr style="background:green;">
<td rowspan="3">200</td>
<td>200</td>
<td>300</td>
</tr>
<tr style="background:green;">
<td rowspan="2">500</td>
<td>600</td>
</tr>
<tr style="background:green;">
<td>600</td>
</tr>
<tr style="background:skyblue;">
<td rowspan="3">100</td>
<td>200</td>
<td>300</td>
</tr>
<tr style="background:skyblue;">
<td>500</td>
<td>600</td>
</tr>
<tr style="background:skyblue;">
<td>600</td>
<td>600</td>
</tr>
</table>
</body>
</html>
dom-to-image
实现的网页截图
dom-to-image
如何使用请参考https://blog.youkuaiyun.com/u012260672/article/details/79302465
下面我们就不废话了直接上演示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>echarts 测试</title>
<script type="text/javascript" src="dom-to-image.js"></script>
</head>
<body style="position:relative;">
<div style="width:100px;height:100px;background-color:#000;color:white;">
尾气请问气味哦平均气温哦啤酒去i
</div>
<div style="width:100px;height:100px;background-color:#ccc;"></div>
<div style="width:100px;height:100px;background-color:#666;color:#ccc;">
请我陪考去请问哦
</div>
<div style="width:100px;height:100px;background-color:#000;color:white;">
尾气请问气味哦平均气温哦啤酒去i
</div>
<div style="width:100px;height:100px;background-color:#ccc;"></div>
<div style="width:100px;height:100px;background-color:#000;color:white;">
尾气请问气味哦平均气温哦啤酒去i
</div>
<div style="width:100px;height:100px;background-color:#ccc;"></div>
<div style="width:100px;height:100px;background-color:#ddd;"></div>
<div style="width:900px;height:100px;background-color:#666;">
桥文件额期望寄哦IQ叫我我就群殴我为奇偶去叫哦我IQ寄哦
</div>
<div οnclick="jt()">点击截图</div>
<script>
var pointInfo= {};
document.οnmοusedοwn=function(e){
if(!pointInfo.bool)return;
pointInfo.startInfo={
x:e.clientX+window.scrollX,
y:e.clientY+window.scrollY
};
pointInfo.eleArr[1].style.left=e.clientX+window.scrollX+"px";
pointInfo.eleArr[1].style.top=e.clientY+window.scrollY+"px";
}
document.οnmοusemοve=function(e){
if(!pointInfo.bool)return;
if(!pointInfo.startInfo)return;
pointInfo.eleArr[1].style.width=e.clientX-pointInfo.startInfo.x+window.scrollX+"px";
pointInfo.eleArr[1].style.height=e.clientY-pointInfo.startInfo.y+window.scrollY+"px";
}
document.οnmοuseup=function(e){
if(!pointInfo.bool)return;
if(!pointInfo.startInfo)return;
pointInfo.bool=false;
var c = document.createElement("canvas");
node=document.body;
document.body.removeChild( pointInfo.eleArr[0]);
var promise = domtoimage.toPng(node);
promise.then(function(v){
var img =new Image();
img.src=v;
c.width=parseInt(pointInfo.eleArr[1].style.width);
c.height=parseInt(pointInfo.eleArr[1].style.height);
var ctx = c.getContext("2d");
img.οnlοad=function(){
ctx.drawImage(img,pointInfo.startInfo.x,pointInfo.startInfo.y,c.width,c.height,0,0,c.width,c.height);
var imgS=document.createElement("img");
imgS.src=c.toDataURL();
document.body.appendChild(imgS);
pointInfo.startInfo=null;
}
});
}
function jt(){
var d= document.createElement("div");
var d2=document.createElement("div");
d.style.cssText="width:100%;height:100%;background-color:rgba(0,0,0,0.2);position:absolute;top:0;left:0;";
d2.style.cssText="position:absolute;background:rgba(255,255,255,0.2);";
pointInfo.eleArr= [d,d2];
pointInfo.bool=true;
d.appendChild(d2);
document.body.appendChild(d);
}
</script>
</body>
</html>
查看效果的话请将domtoimage
下载下来自己查看
注意因为使用了toDataURL
方法所以需要在服务器下面才能看到效果请使用webstorm打开查看效果