详解使用canvas保存网页为pdf文件支持跨域

  发布时间:2018-11-23 15:23:31   作者:前端爱好者   我要评论
这篇文章主要介绍了详解使用canvas保存网页为pdf文件支持跨域的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

前言

之前上一篇随笔说了Canvas截图网页为图片,下来个新需求,把网页截图后保存为PDF文件供用户下载。

使用canvas保存网页为pdf文件支持跨域

正文

需求:用户点击下载,将页面保存为PDF文件并下载。

思路:继续使用Canvas截图后将画布内容转换为pdf文件。

首先我们需要引入js文件jspdf.debug.js 下载路径 https://github.com/MrRio/jsPDF

引入canvas的js文件,js文件获取地址官网主页:http://html2canvas.hertzen.com/

<script type="text/javascript" src="js/html2canvas.js"></script>
<script type="text/javascript" src="js/html2canvas.min.js"></script>
<script type="text/javascript" src="js/jspdf.debug.js"></script>

div按钮代码

 <div id="down_pdf">导出为PDF按钮</div>
 <div class="sta-main">需要获取为PDF的div</div>

jsp代码

<script type="text/javascript">
/* var downPdf = document.getElementById("down_pdf"); */
var downPdf = document.getElementById("down_pdf");
$("#down_pdf").on("click", function() {
 var canvas2 = document.createElement("canvas");
 let _canvas = document.querySelector('.sta-main');
 //获取宽高
 var w = parseInt(window.getComputedStyle(_canvas).width);
 var h = parseInt(window.getComputedStyle(_canvas) .height);
 //将canvas画布放大2倍,然后盛放在小的容器内,处理模糊
 canvas2.width = w * 2;
 canvas2.height = h * 2;
 canvas2.style.width = w + "px";
 canvas2.style.height = h + "px";
 var context = canvas2.getContext("2d");
 //处理偏移
 context.scale(1.5, 1.5);
 //修改背景颜色,默认是黑色
 $('.sta-main').css("background", "#fff")
 html2canvas( _canvas, {
 //处理pdf跨域获取不到跨域信息问题
 taintTest : false,
 useCORS : true,
 allowTaint : false, 
 canvas : canvas2,
 dpi: 172,//导出pdf清晰度
 onrendered: function (canvas) {
 var contentWidth = canvas.width;
 var contentHeight = canvas.height;
 //一页pdf显示html页面生成的canvas高度;
 var pageHeight = contentWidth / 592.28 * 841.89;
 //未生成pdf的html页面高度
 var leftHeight = contentHeight;
 //pdf页面偏移
 var position = 0;
 //html页面生成的canvas在pdf中图片的宽高(a4纸的尺寸[595.28,841.89])
 var imgWidth = 595.28;
 var imgHeight = 592.28 / contentWidth * contentHeight;
 var pageData = canvas.toDataURL('image/jpeg', 1.0);
 var pdf = new jsPDF('', 'pt', 'a4');
 //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
 //当内容未超过pdf一页显示的范围,无需分页
 if (leftHeight < pageHeight) {
 pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight);
 } else {
 while (leftHeight > 0) {
 pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
 leftHeight -= pageHeight;
 position -= 841.89;
 //避免添加空白页
 if (leftHeight > 0) {
 pdf.addPage();
 }
 }
 }
 pdf.save('PDF的名字.pdf');
 }
 })
 $('.sta-main').css("background", "")
})
</script> 

此次网页改为PDF,与上次截图网页为PNG,使用同一种技术,都是先使用Canvas截图画布后转格式。

同样也有偏移、模糊、跨域等问题,使用之前的代码来处理。

转换pdf会让背景色变为黑色使用css样式改一下背景色就可以了。

完美转换为pdf。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。

相关文章

  • HTML5中的DOCUMENT.VISIBILITYSTATE属性详解

    在 HTML5 中,文档对象(即 document 对象)具有一个 visibilityState 属性,该属性表示当前文档对象的可见性状态,这篇文章主要介绍了HTML5中的DOCUMENT.VISIBILITYSTATE
    2023-05-05
  • html原生table实现合并单元格以及合并表头的示例代码

    表格是常见的数据统计的一种形式,合并单元格及合并表头经常在复杂表格中遇到,本文主要介绍了html原生table实现合并单元格以及合并表头的示例代码,感兴趣的可以了解一下
    2023-04-28
  • HTML5 Canvas 绘制股市走势图

    分时大盘回顾功能是一种用于分析股票行情的工具,本文就介绍一下HTML5 Canvas 绘制股市走势图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
    2023-04-25
  • H5项目怎么打包成APP

    开发uni-app的编辑器HBuilderX可以将H5项目打包成APP,相信很多小伙伴还不知道这个功能,下面将介绍下如何将H5打包成APP,感兴趣的朋友一起看看吧
    2023-04-03
  • 移动端H5实现拍照功能的两种方法

    本文将介绍移动端H5实现拍照功能的两种方法:使用HTML5的input标签和使用第三方插件,帮助读者更好地理解和掌握移动端H5拍照功能的实现,感兴趣的可以了解一下
    2023-03-30
  • html中ul和li标签的用法详解

    普通的显示数据的时候,ul就是项目列表,li就是列表项,可以用来显示数据,如果用于DIV+CSS布局的话,ul+li可以替换表格的作用,具体的设置,如果宽度高度、行间距、背景
    2023-02-20
  • Html5播放器实现倍速播放的方法示例

    本文主要介绍了Html5播放器实现倍速播放的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习
    2023-01-12
  • HTML5 Web Worker(多线程处理)

    在HTML5中,可以使用Web Worker创建一个后台线程执行一个耗时任务,本文主要介绍了HTML5 Web Worker(多线程处理),感兴趣的可以了解一下
    2023-01-12
  • 短视频滑动播放在 H5 下的实现方式

    短视频已经无数不在了,但是主体还是使用 app 来承载的,本文讲述 H5 如何实现 app 的视频滑动体验,本文对实现过程中踩到的坑做一个总结,结合示例代码给大家介绍的非常详
    2023-01-05
  • HTML5页面打开微信小程序功能实现

    这篇文章主要介绍了HTML5页面打开微信小程序功能,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-20

最新评论

?


http://www.vxiaotou.com