js实现html转pdf+html2canvas.js截图不全的问题
最近做项目中遇到要把整个页面保存为PDF文件,网上找了一下实现的方法都是 html2canvas.js+jsPdf.js 来实现。实现的过程是 先用html2canvas.js把html页面转成图片,再用jsPdf.js把图片导出为pdf。
于是做了个小案例来测试这个功能。
<body>
<!-- PDF -->
<div class="bb" id="ctn">
<div class="anliu" id="anliu">生成PDF</div> </div>
</body>
<script src="../../Scripts/aps/html2canvas.js"></script>
<script src="../../Scripts/aps/jsPdf.debug.js"></script>
js写法
window.onload =function(){
var downPdf = document.getElementById("anliu");
downPdf.onclick = function() {
html2canvas(document.body, {
onrendered: function(canvas) {
//返回图片URL,参数:图片格式和清晰度(0-1)
var pageData = canvas.toDataURL('image/jpeg', 1.0);
//方向默认竖直,尺寸ponits,格式a4【595.28,841.89]
var pdf = new jsPDF('', 'pt', 'a4');
//需要dataUrl格式
pdf.addImage(pageData, 'JPEG', 0, 0, 595.28, 592.28/canvas.width * canvas.height );
pdf.save('tup.pdf');
}
});
}
}
1,写完一测试看,报了个错误Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported。 于是我换一种方法,把所有图片删掉测试,再点击生成pdf,结果是没问题,这样看来报错的原因是图片引起的。
一查资料是因为图片和页面所在域不同,出现跨域传输的问题,说白了就是要在服务器环境下访问。于是在服务器环境下测试没问题,成功生成pdf文件。
2,html2canvas.js截图不全的问题
把这个测试实现的功能放到项目里面去,遇到了一个新问题,生成的pdf只有页面窗口可见的区域,有滚动条的下面没有生成出来。
于是又找了一下,html2canvas 截取图片不支持高度,会造成只可以截到浏览器可见的,如果出现滚动条则不会截全,所以造成jsPdf.js根据截图生成的pdf出现不全的问题。既然是html2canvas截图的原因引起的那就从这里来解决。
网上看了下别人写的案例,结合自己测试+分析发现,如果截取是body的这个层级,而刚好body设置了overflow: hidden;那超出的部分是永远截取不到的,因为这个节点的dom高就是窗口可见的高度,并不包含滚动条多出来的部分。
于是我把滚动条这一节点的样式,height: auto;让高度给子元素去撑开。 再往上把父节点都去掉overflow: hidden;去掉元素不可见。
看一下引入jquery后,在项目中重新写的js
var pdfcc = $('.pdf-cc');
pdfcc.on('click', function (event) {
html2canvas($("#bb-pdf-ctn"), {
allowTaint: true,
height: $("#bb-pdf-ctn").outerHeight(),
onrendered: function (canvas) {
//返回图片URL,参数:图片格式和清晰度(0-1)
var pageData = canvas.toDataURL('image/jpeg', 1.0);
//方向默认竖直,尺寸ponits,格式a4【595.28,841.89]
var pdf = new jsPDF('', 'pt', 'a4');
//需要dataUrl格式
pdf.addImage(pageData, 'JPEG', 0, 0, 595.28, 592.28 / canvas.width * canvas.height);
pdf.save('pdf.pdf');
}
});
});
3,html2canvas设置了2个新的参数
允许跨域:allowTaint: true,
设置高度:height: $("#bb-pdf-ctn").outerHeight(),
高度就是滚动条这个节点的高度。
OK,就这样搞定滚动条区域截图不全的问题了。
js实现html转pdf+html2canvas.js截图不全的问题的更多相关文章
- html2canvas.js网页截图功能
需求:将网页生成图片,用户自行长按图片进行保存图片,再分享朋友圈.其中,都可识别图中的二维码.(二维码过小会识别不出) 首先,先来科普一下微信网页识别二维码原理:截屏识别,当客户端发现用户在网页的im ...
- 使用html2canvas.js将HTML生成图片
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- html2canvas 网页截图 下载 上传
利用html2canvas插件 对网页截图 并下载和上传图片. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//E ...
- IText&Html2canvas js截图 绘制 导出PDF
Html2canvas JS截图 HTML <div id="divPDF"> 需要截图的区域 </div> JS <script src=" ...
- 使用html2canvas.js实现页面截图并显示或上传
最近写项目有用到html2canvas.js,可以实现页面的截图功能,但遭遇了许多的坑,特此写一篇随笔记录一下. 在使用html2canvas时可能会遇到诸如只能截取可视化界面.截图没有背景色.svg ...
- html2canvas JS截图插件
github/download:https://github.com/niklasvh/html2canvas/releases 参考文章:基于html2canvas实现网页保存为图片及图片清晰度优化 ...
- html2canvas.js插件截图空白问题
发现使用 html2canvas.js插件截图保存在前端很方便.学习过程中预计问题. 截图出现空白和截图不全. 问题原因: html2canvas.js插件截图是基于body标签的,如果body存在滚 ...
- 纯js实现html转pdf
项目开发中遇到了一个变态需求,需要把一整个页面导出为pdf格式,而且要保留页面上的所有的表格.svg图片和样式.简而言之,就是希望像截图一样,把整个页面截下来,然后保存成pdf.咋不上天呢--查了一下 ...
- 一个在浏览器端将html 转为pdf 的js 插件 jsPDF
<!DOCTYPE html> <html> <head> <title>test</title> <meta http-equiv= ...
随机推荐
- 在ASP.Net Core下,Autofac实现自动注入
之前使用以来注入的时候,都是在xml配置对应的接口和实现类,经常会出现忘了写配置,导致注入不生效,会报错,而且项目中使用的是SPA的模式,ajax报错也不容易看出问题,经常会去排查日志找问题. 于是在 ...
- 《清华梦的粉碎》by王垠
清华梦的诞生 小时候,妈妈给我一个梦.她指着一个大哥哥的照片对我说,这是爸爸的学生,他考上了清华大学,他是我们中学的骄傲.长大后,你也要进入清华大学读书,为我们家争光.我不知道清华是什么样子,但是我 ...
- 遍历对象属性(for in、Object.keys、Object.getOwnProperty)
js中几种遍历对象的方法,包括for in.Object.keys.Object.getOwnProperty,它们在使用场景方面各有不同. for in 主要用于遍历对象的可枚举属性,包括自有属性. ...
- 2.4 PCI总线的配置
PCI总线定义了两类配置请求,一个是Type 00h配置请求,另一个是Type 01h配置请求.PCI总线使用这些配置请求访问PCI总线树上的设备配置空间,包括PCI桥和PCI Agent设备的配置空 ...
- VxWorks各部分初始化流程
一)configAll.h中定义所有定置系统配置的宏 INCLUDED SOFTWARE FACILITIES:定义了基本组件: EXCLUDED FACILITIES:定义了扩充组件,缺省不包括: ...
- Java之Iterator
Java之Iterator 1.实例源码 /** * @Title:IteratorJava.java * @Package:com.you.model * @Description:Iterator ...
- Java中对整数格式化
Java中对整数格式化 1.说明 对整数进行格式化:%[index$][标识][最小宽度]转换方式 2.实例分析 (1)源码 /** * 1. 对整数进行格式化:%[index$][标识][最小 ...
- Exception in thread "main" java.lang.IllegalArgumentException
1.错误描述 Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given ...
- Python与Mongodb交互
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案 MongoDB 将数据存储为一个文档,数据结构由键值 ...
- ssh_Connection reset by peer报错
连接SSH时,产生了一下错误----->Read from socket failed: Connection reset by peer 首先查看日志 tail -f /var/log/aut ...