Vue实现将页面转成PDF并下载或直接打印

164 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情

Vue实现将页面转成PDF并下载或直接打印

❤ 需要的库

安装Vue页面转为pdf时候所需要的两个库和环境

npm install html2canvas;
npm install jspdf --save

安装之后导入,然后在页面上进行使用

❤ 组件或者页面逻辑

// 导出页面为PDF格式// 导出页面为PDF格式

主要思维:

  • 导入页面的组件
  • 安装需要使用的函数,调用方法
  • 利用canvas将获取到的dom元素的宽高以及分辨率进行修正,按照一定的比列放大缩小以后将其转化为照片(当然,这里是图片的画质和大小越大,所下载下来的文件肯定也越清晰,所下载的文件也越大)。
  • 在这个过程之中最重要的尺寸其实就是a4纸,因为我们下载下来的很多pdf格式的东西其实就是打印的。

🌂缺点和不足:

  • 首先是页面的裁剪和截断上处理起来特别的麻烦,而且部分地方或者图片没办法完好的智能分割
  • 大文件下载时,其实占用的是浏览器的缓存,会导致浏览器直接崩溃
// htmlToPdf.js

import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
export default {
  install(Vue, options) {
    Vue.prototype.getPdf = function () {
      var title = this.htmlTitle  //DPF标题
        html2Canvas(document.querySelector('#pdfDom'), {
          allowTaint: true,
          taintTest: false,
          useCORS: true,
          y:72, // 对Y轴进行裁切
          // width:1200,
          // height:5000,
          dpi: window.devicePixelRatio * 4, //将分辨率提高到特定的DPI 提高四倍
          scale: 4 //按比例增加分辨率 
        }).then(function (canvas) {
          let contentWidth = canvas.width
          let contentHeight = canvas.height
          let pageHeight = contentWidth / 592.28 * 841.89
          let leftHeight = contentHeight
          let position = 0
          let imgWidth = 595.28
          let imgHeight = 592.28 / contentWidth * contentHeight
          let pageData = canvas.toDataURL('image/jpeg', 1.0)
          let PDF = new JsPDF('', 'pt', 'a4')
          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(title + '.pdf')
      })
    }
  }
}

❤ 组件或者页面逻辑

// main.js
import htmlToPdf from '@/util/htmlToPdf'
Vue.use(htmlToPdf)