html2canvas和jsPDF配合实现网站截图并保存为PDF

html2canvas官网地址
jsPDF官网地址

实现思路:

先讲网页通过html2canvas转换成图片,再将图片通过jsPDF转成pdf下载到本地

关键代码:

let el = document.getElementById('my-sample-info'); // 获得目标元素
html2canvas(el, {
   background: '#fff',  // 背景设置
    //Whether to attempt to load cross-origin images as CORS served, 
    //before reverting back to proxy ,此参数对页面中包含跨域图片时至关重要
   useCORS: true,    
   onrendered (can) { // html到canvas渲染完成时执行
     let doc = new JsPDF('p', 'px', 'a4'); // 设置生成pdf的相关参数,''纵向,单位,纸张类型"
     let data = can.toDataURL('image/jpeg'); // 将canvas转成dataURL,不通的图片类型data的大小差别较大,也可以设置图片的质量,以控制生成文件的大小
     let createPdf = (function (can, doc, data) {  //创建PDF
      /*
        通过canvas生成PDF
        @can    {object}     canvas对象
        @doc    {object}     使用jsPDF创建的对象
        @data   {string}     canvas通过toDataURL生成的数据
      */
      // 获得一页pdf和滚动整个页面生成canvas的高度和宽度,
       let [ph, ch, pw, cw] = [doc.internal.pageSize.height, can.height, doc.internal.pageSize.width, can.width]
       let h = pw * ch / cw; // 按根据pdf的页面宽度计算canvas的高度
       return function getPdf (imgData, k) {
         if (ph * k > h) {  // 如果pdf页面的总长度大于canvas的高度,跳出递归
           doc.deletePage(k + 1);  // 删除最后一页的空白
           doc.save('test.pdf'); // 保存生成的pdf
           return;
         }
         doc.addImage(imgData, 'PNG', 1, -k * ph + 10, pw, h); //将图片转成PDF,后四个参数分别为左边距,上边距,图片宽度,图片高度,这里将上边距设为负值,是为了将片上移,达到分页的效果 
         doc.addPage(); // 增加新页面
         getPdf(imgData, k + 1); // 递归调用
       }
     }(can, doc, data));
     createPdf(data, 0); // 调用该函数
  }
});

遇到的坑--填平它

  1. canvas访问图片跨域:
    需后端配合设置Access-Control-Allow-Origin,允许我们跨域访问图片,配置html2canvasuserCOR
    性为 true
  2. 转成canvas的过程中会莫名奇妙的出现截图不全:
    对截图不全的部分写个简单的测试文件,如果测试文件没有问题,就删除项目页面的代码,直到截图正常为
    止,找到原因,干掉它
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,301评论 25 708
  • 大学是一个特别美好的地方,这种美好在里面的时候体会不到,毕业后缺发现,大学太美好了,有人,有时间。这或许就是我发现...
    小树小事阅读 614评论 0 15
  • 昨天画了个秋冬搭配,画得自己都热了,今天就来个清凉夏装吧 黄色小礼服 黑色高跟鞋 超大蝴蝶结发箍 是不是可爱又不失...
    小小珊_3阅读 287评论 2 7
  • 安装 - pip install django 验证: 开始第一个实例 django官方指南 1. 创建项目 创...
    Air_cc阅读 456评论 1 4
  • 背景介绍:虽然毕业已经快一年了,但是我们五个小逗比小可爱一直在群里随时报告近况。年前离职了,年后换工作,离开家乡到...
    LYQ1024阅读 385评论 4 3