美文网首页
JS保存指定盒子为PDF,只生成屏幕显示的部分(神坑)

JS保存指定盒子为PDF,只生成屏幕显示的部分(神坑)

作者: 南台观芸秀 | 来源:发表于2019-12-20 02:07 被阅读0次

问题描述:

网上很多讲述如何用JS保存pdf的demo太多了自己网上搜,我就不PI啰嗦了;我现在要讲的问题是,在生成目标盒子内容很高的情况下(盒子中的内容很长的那种,屏幕都不够装),按demo上的使用方法将代码准备好后,执行下载,就出现了怎么玩弄都去不掉的【黑块】。

引入两个PSD必要文件:

  • html2canvas.js
  • jspdf.debug.js

<button id="renderPdf">DOWNLOAD PDF</button>

var downPdf = document.getElementById("renderPdf");
        downPdf.onclick = function(){
            var dom=document.getElementById("content");
            dom.style.backgroundColor="#fff";
            html2canvas(dom, {
                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;
                      //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
                      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', 20, 0, imgWidth, imgHeight);
                      } else {
                          while(leftHeight > 0) {
                              pdf.addImage(pageData, 'JPEG', 20, position, imgWidth, imgHeight)
                              leftHeight -= pageHeight;
                              position -= 841.89;
                              //避免添加空白页
                              if(leftHeight > 0) {
                                  pdf.addPage();
                              }
                          }
                    }
                    pdf.save('content.pdf');
                }
            })
        }

实例:


上图是我H5中的button位置部分

点击页面按钮 DOWNLOAD PDF 生成如下PDF


生成的PDF文件.png

故障:PDF中只有我当前点击下载时屏幕显示的部分,A4纸余下的部分都成了黑块。惊不惊喜,意不意外!

几天的自虐问题终于解决了

解决办法如下: 你的黑块代码.png

问题解决后的代码.png

就这么简单,惊不惊喜,意不意外!

都是血汗,请给我个赞.png

相关文章

  • JS保存指定盒子为PDF,只生成屏幕显示的部分(神坑)

    问题描述: 网上很多讲述如何用JS保存pdf的demo太多了自己网上搜,我就不PI啰嗦了;我现在要讲的问题是,在生...

  • 哪些不曾了解的CSS——04 diaplay属性

    display属性 display属性指定了元素的显示类型,包含两类基础特征 外部显示类型 指定元素怎样生成盒子模...

  • UIWebView的使用

    实现5个功能1 在屏幕中显示指定的网页2 控制屏幕中的网页3 在网页中加载显示PDF,Word,和JPEG图片4 ...

  • domtoimage----将指定页面生成图片

    在项目中有个需求,点击按钮将指定页面部分生成图片保存到本地,最后选择了dom-to-image这个js方法 1.下...

  • JS下载PDF文件

    由于需求需要将数据下载为PDF文件,由于性能还有工时考量没有使用后端生成PDF,而是采用js下载PDF文件, 使用...

  • 面试指南

    !为必会知识,主要分HTML,CSS,JS,Vue几个部分。重点考察JS部分 HTML ! 解释盒子模型 HTML...

  • 浮动以及overflow

    浮动的初体验 问题:在页面上有两个盒子,一个盒子靠着屏幕左侧显示另一个盒子靠着屏幕的右侧显示?作用:解决一行中显示...

  • 浮动

    浮动 问题: 在页面上有两个盒子,一个盒子靠着屏幕左侧显示另一个盒子靠着屏幕右侧显示?浮动作用:解决一行中显示多个...

  • js保存页面指定元素为图片

    首先安装html2canvas 然后引入html2canvas 打印 引入html2canvas同样可以去网上找找...

  • vue-pdf踩坑,第二次打开空白,报错Cannot read

    坑一:第二次打开空白 原因:引入了CMapReaderFactory.js解决PDF中文不显示的问题。在你第一次加...

网友评论

      本文标题:JS保存指定盒子为PDF,只生成屏幕显示的部分(神坑)

      本文链接:https://www.haomeiwen.com/subject/dxcbnctx.html