html2canvas 踩坑总结

需求:将html表格导出为图片,表格可以自己编辑数据,并适配各种屏幕大小。上网搜了下,找到了html2canvas,一开始使用的是最新版0.5.0,最终因为需要支持自定义div编辑框自动换行选择了v0.4.1 - 7.9.2013

开始编辑框使用的是textarea,后来发现textarea不能自适应高度,内容一多就会出现滚动条。这对于要把表格转化成图片的需求来说是没法接受的,于是改为了

div{ word-wrap: break-word; }
<div contenteditable="true"></div>

于是第一个坑出现了,html2canvas0.5不识别‘word-wrap: break-word;‘ ,内容一多就直接超出了编辑框。。。

google后发现0.4版本支持‘word-wrap: break-word;‘ ,我也是醉了。当然新版本还是有进步的,比如就不会出现这个问题:IE下border为1px时不显示。

解决方案:

参考链接

改动0.4版本源代码:

function getCSSInt(element, attribute) {
    //var val = parseInt(getCSS(element, attribute), 10);
    /**
    * my-change liyimin
    */
    var val = parseFloat(getCSS(element, attribute), 10);
    /**
    * my-change end
    */
    return (isNaN(val)) ? 0 : val; // borders in old IE are throwing ‘medium‘ for demo.html
  }

其实上面都是小坑,真正的大坑是html2canvas默认以屏幕的宽为canvas的宽,当需要转化的html超出屏幕范围时就只能转化当前可视部分,

一开始使用0.5版本的时候也找到了一个解决方案,焰尾迭的 使用html2canvas实现浏览器截图

// return renderDocument(node.ownerDocument, options, node.ownerDocument.defaultView.innerWidth, node.ownerDocument.defaultView.innerHeight, index).then(function(canvas) {
//     if (typeof(options.onrendered) === "function") {
//         log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");
//         options.onrendered(canvas);
//     }
//     return canvas;
// });
/**
*my-change liyimin
*/
var width = options.width != null ? options.width : window.innerWidth;
var height = options.height != null ? options.height : window.innerHeight;
return renderDocument(node.ownerDocument, options, width, height, index).then(function(canvas) {
    if (typeof(options.onrendered) === "function") {
      log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");
      options.onrendered(canvas);
    }
    return canvas;
});
/**
*my-change end
*/

但是实际使用的时候也是各种问题。比如width和height设大了,渲染出来的canvas总是各种空白部分,设得和需要转化的html一样大又有可能渲染不全,无奈放弃。

查找了两三天终于找到了一个解决方案,就快要放弃了啊。

解决当内容超出屏幕范围无法全部截取问题:

参考链接

<div>
  <iframe id="previewIframe" src="/static/html/preview.html" frameborder="0"></iframe>
</div>

将需要转化的html放在preview.html里面,超出多少都无所谓了有木有啊。

最终就是这样:

var $previewIframe=$(‘#previewIframe‘);
html2canvas($previewIframe.contents().find(‘#previewTabelDetail‘)[0], {
    onrendered: function(canvas) {
     var url = canvas.toDataURL();
     $previewIframe.contents().find(‘body‘).append($(<img>").attr("src", url));
   }
});

本来是打算直接下载图片的,这样:

var $previewIframe=$(‘#previewIframe‘);
html2canvas($previewIframe.contents().find(‘#previewTabelDetail‘)[0], {
  onrendered: function(canvas) {
     var triggerDownload = $("<a>").attr("href", url).attr("download", "表格.png").appendTo("body");
     triggerDownload[0].click();
     triggerDownload.remove();
   }
});

可惜安卓上不支持直接下载base64的图片链接,就改为生成图片让用户自己手动保存。

时间: 2024-10-17 08:04:04

html2canvas 踩坑总结的相关文章

html2canvas踩坑日记

近日要开发一个能将生成的二维码另存为图片的功能(该图片呢,肯定不止一个二维码,还包括背景.文字等其他元素),首先呢,就想到了html2canvas,随便一百度就是各种踩坑日志,我也随一下大流,记录本人在开发过程中遇到的坑. 1.基本用法: 在html2canvas上找到了它的基本用法以及压缩包 <div id="capture" style="padding: 10px; background: #f5da55"> <h4 style="

html2canvas的踩坑之路

html2canvas的踩坑之路 前言 早有耳闻这个html2canvas比较坑,但无奈于产品需求的压迫,必须实现html转图片的功能,自此走上了填坑之路,好在最后的效果还算令人满意,这才没有误了产品上线周期. html2canvas介绍 html2canvas的详细介绍可以点击这里查看,其实简单来说就是通过canvas将HTML生成的DOM节点绘制到画布上,再可以通过自己的需求转换成图片.所以官方文档也说了,最后生成的效果不是100%相同的,这一点大家要有心理准备,无论怎样,一点点小瑕疵是肯定

阿里云磁盘扩容踩坑总结

公司半年前上线一个新的项目,采购了一批阿里云主机,磁盘组成是40G系统盘+100G的数据盘,数据库采用MariaDB Galera Cluster集群部署,由于业务数据量快速增长,导致磁盘存储空间剩余量很少,急需要扩容,先总结整个项目规划中埋下的坑: 1.没有DBA对数据库的容量规划,而前期的运维人员采购时选用100G的SSD云盘: 2.数据库默认使用共享表空间,缺点是删除数据后不释放空间,当数据快速增长后,我们采取了先删除临时表数据的方式来尽量避免暴力扩容,争取在春节期间稳定,删除部分数据后,

Zabbix 踩坑之旅——zabbix触发重启tomcat

一.实验需求 公司tomcat服务经常自动崩溃,导致业务中断,暂时用zabbix对其执行监控,在tomcat崩溃时能够先自动启动,保证业务尽快恢复正常. 二.准备环境 系统环境:CentOS 6.5 IP地址: zabbix-server: 192.168.239.128 zabbix-agent: 192.168.239.130 zabbix的服务端和客户端的安装此处都以rpm包安装,配置略过.agent端上安装好tomcat. 三.开启踩坑之旅--agent端 ① 修改zabbix-agen

Android开发在路上:少去踩坑,多走捷径【转】

作者:gzjay,腾讯MIG无线产品部 高级工程师 最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1.目前, Android APP开发完成后,通常需要在哪些机型上进行测试? 2.目前, 开发Android APP时,需要考虑的分辨率有哪些? 这两个问题可以合起来回答的. http://developer.android.com/about/dashboards/index.html 源自Google Play的数据,每月都会进行upd

ELK之ES2.4.1双实例平滑升级至5.2.1踩坑并supervisor管理记

ES老集群用的2.4.1版本,跑的比较好就一直没动,最近看资料ES5.X已经稳定,并且性能有较大提升,心里就发痒了,但由于业务要保持高可以用的属性,就得想一个平滑升级的方案,最后想到了多实例过度的办法,5.X版本网上介绍配置变化较大,也做好了踩坑准备,确定好要升级后,立刻动手. 一.对应升级改造方案 使用端口9220和9330 安装并配置好新的ES5.2.1实例-->关掉logstash并将ES2.4.1实例堆栈调小重启(kafka保留3个小时日志所以不会丢失)-->启动ES5.2.1并将lo

vue+ vue-router + webpack 踩坑之旅

说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案   老司机可以忽略下面的内容了 1)起因  考虑到数据分离的问题  因为server是express搭的   自然少不了res.render("xx",data)    这句话的意思就是去查找相应的模板文件然后在用数据去渲染在将渲染好的页面去返回给浏览器,给浏览器去解析,渲染模板其实就是做的替换字符串+拼接字符串的活  各种的模板引擎也有各个优化的点(比如可以将对应的模板编译的函数保存在内存中,然后在通

AI相关 TensorFlow -卷积神经网络 踩坑日记之一

上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是google开源出来的人工智能库,由python语言写的 官网地址:http://www.tensorflow.org/   请用科学上网访问 中文地址:http://www.tensorfly.cn/ 当然还有其他AI库,不过大多数都是由python 写的 .net 的AI库叫 Accord.net

之后要接触更多代码管理的知识——2015踩坑有感

前言 学习是没有止境的,管理代码的能力也永远需要提高. 前几个月还觉得R语言,业务上要用的都学得七七八八了呢,这几个月在自家部门吭哧吭哧搞报表自动化时,各个坑一踩一个准,才明白写代码,懂得一点语言特性固然重要,弄一套科学地管理代码的方法,却是势在必行. 因此在这里总结一下这几个月来我踩过的种种坑,以及之后在查阅种种大神的经验,以及学软件工程这门课时看到的一些比较妥当的方法,算是这几个月的一个总结.2016年的时候,真的要多学学如何科学地管理代码,科学开发 请注意,因为我属于跨专业半路出家写代码,