导出PDF文件,表格或页面去掉滚动条,显示完整内容

注:本方法使用的是jspdf和html2canvas这两个插件,原理就是需要导出的部分,通过html2canvas的方法生成一个图片,然后使用jspdf导出成为一个真正的pdf文件。其中package.json文件中html2canvas的版本使用的是

"html2canvas": "^1.0.0-rc.7",

或者是这个版本

"html2canvas": "1.0.0-alpha.12",

下面的版本的好处是,textarea不用替换成为div元素,直接截图就可以了。

jspdf的本版是:

"jspdf": "^1.5.3",

        导出PDF是一个很简单的功能了,但是近期遇到了的问题是当页面的内容比较多的时候,就导致了, 截图之后,滚动条下面的内容就看不到了。

首先看下导出pdf的封装的js:


// 导出页面为PDF格式
import html2canvas from "html2canvas"
import JSPDF from "jspdf"
export default {
  install (Vue, options) {
    Vue.prototype.ExportSavePdf = function (htmlTitle, currentTime) {
      var element = document.getElementById("Etable")
      html2canvas(element, {
        logging: false
      }).then(function (canvas) {
        var pdf = new JSPDF("p", "mm", "a4") // A4纸,纵向
        var ctx = canvas.getContext("2d")
        var a4w = 170; var a4h = 257 // A4大小,210mm x 297mm,四边各保留20mm的边距,显示区域170x257
        var imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度
        var renderedHeight = 0
 
        while (renderedHeight < canvas.height) {
          var page = document.createElement("canvas")
          page.width = canvas.width
          page.height = Math.min(imgHeight, canvas.height - renderedHeight)// 可能内容不足一页
 
          // 用getImageData剪裁指定区域,并画到前面创建的canvas对象中
          page.getContext("2d").putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0)
          pdf.addImage(page.toDataURL("image/jpeg", 1.0), "JPEG", 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width)) // 添加图像到页面,保留10mm边距
 
          renderedHeight += imgHeight
          if (renderedHeight < canvas.height) { pdf.addPage() }// 如果后面还有内容,添加一个空页
          // delete page;
        }
        pdf.save(htmlTitle + currentTime)
      })
    }
  }
}

其中var element = document.getElementById("Etable")是获取导出pdf的元素。这个例子是导出element的el-table的外面的div的id名。大体的结构是这样的

    <div id="Etable">
      <el-table
        :data="tableData"
        style="width: 100%"
        height="100%"
        :cell-class-name="borderLeft"
        v-loading="loading"
        id="EtableBody"
      >
        <template slot="empty">
          <p>{{ dataText }}</p>
        </template>
        <el-table-column prop="name" width="30" label=""></el-table-column>
        <el-table-column prop="deviceName" label="设备名称"></el-table-column>
        <el-table-column prop="description" label="故障描述"></el-table-column>
        <el-table-column prop="deviceClass" label="设备类别"></el-table-column>
        <el-table-column prop="triggerTimes" width="78" label="触发次数">
          <template slot-scope="scope">
            <p>{{ addZero(scope) }}</p>
          </template>
        </el-table-column>
        <el-table-column label="累计时间">
          <template slot-scope="scope">
            <!-- <p>{{scope.row.totalTime}}</p> -->
            <p>{{ scope.row.totalTime | msToTimeOther }}</p>
          </template>
        </el-table-column>
        <el-table-column prop="DetailCurveItem" width="700" label="24h分布图">
          <template slot-scope="scope">
            <my-echart :timeData="scope.row.distribution"></my-echart>
          </template>
        </el-table-column>
      </el-table>
    </div>

在外侧有一个按钮,用来导出PDF,调用的方法是exportPDFBtn。        

        大体就是,通过计算得到表格全体的内容的高度,然后截图,截图完成之后,重新恢复原来的高度,尽量让用户察觉不到。

        具体的方法是这样的:

    // 点击导出PDF按钮
    exportPDFBtn(){
      var dom = document.getElementById("EtableBody");
      var headDom = dom.getElementsByClassName("el-table__header-wrapper")[0];
      var headerHeight = headDom.offsetHeight;
      var bodyDom = dom.getElementsByClassName("el-table__body")[0];
      var bodyHeight = bodyDom.offsetHeight;
      var noScrollHeight = headerHeight + bodyHeight + 30;
      var Etable = document.getElementById("Etable");
      Etable.style.height = noScrollHeight + "px";
      this.$message({
        message: "导出成功,请稍后",
        type: "success",
      });
      setTimeout(()=>{
        this.ExportSavePdf('故障分布', this.dataValueSimple);
      }, 200)
      setTimeout(()=>{
        Etable.style.height = "100%";
      }, 1000)
    }

        如果是页面的话,其实是同理的。计算出滚动的距离,然后在截图的时候,把需要截图的元素的父元素高度设置为截图元素的高度,截图完成之后,重新把截图元素的父元素设置为原来的高度。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue页面中,要设置导出PDF文件只能显示页面的部分,我们可以使用一些第三方库和技术来实现。 首先,我们可以使用html2canvas库,将页面的部分内容转换为Canvas元素。html2canvas可以将DOM元素渲染为Canvas元素的图像。我们可以选择要导出页面部分,将其包裹在一个div中,并指定其id。 然后,我们可以使用jsPDF库来导出PDF文件。jsPDF是一个用于生成PDF文件JavaScript库。我们可以使用jsPDF的addImage方法将Canvas元素添加到PDF文件中。可以指定图像的位置和尺寸,以便将其适当地放置在PDF文件中。 接下来,我们需要在页面上添加一个按钮或其他触发事件的元素,例如,一个“导出PDF”按钮。当用户点击该按钮,触发一个导出PDF的函数。在该函数中,我们需要使用上述提到的html2canvas和jsPDF库的功能来执行导出PDF文件的操作。 具体实现步骤如下: 1. 在Vue组件中,引入html2canvas和jsPDF库。 2. 在页面上选择要导出的部分,添加一个div,并指定该div的id。 3. 创建一个导出PDF的函数,并在触发事件中调用该函数。 4. 在导出PDF函数中,使用html2canvas将指定div转换为Canvas元素。 5. 使用jsPDF的addImage方法将Canvas元素添加到PDF文件中,并设置图像的位置和尺寸。 6. 最后,使用jsPDF的save方法保存PDF文件。 通过以上步骤,我们可以实现在Vue页面中设置导出PDF文件只能显示页面部分的功能,用户可以选择需要导出的部分,并点击按钮即可得到相应的PDF文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值