vue将页面导出pdf(前端)

vue导出pdf

1.使用npm下载两个插件

//第一个:将页面html转换成图片
npm install --save html2canvas
//第二个:将图片生成pdf
npm install jspdf --save

2.在utils文件夹中创建一个名字叫个htmlToPdf.js的文件,内容如下:

// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
export default {
  install(Vue, options) {
    Vue.prototype.getPdf = function () {
      var title = this.htmlTitle
      // html2Canvas(document.querySelector('#pdfDom'), { //这是在界面上设置一个id 
      //只下载id为pdfDom的内容
      html2Canvas(document.body, { //body是下载整个界面
        useCORS: true, //是否尝试使用CORS从服务器加载图像
        allowTaint: true,
        dpi: 300, //解决生产图片模糊
        // width: 490, //canvas宽度
        // height: 240, //canvas高度
        // x: 0, //x坐标
        // y: 0, //y坐标
        async: false, //是否异步解析和呈现元素
        foreignObjectRendering: true, //是否在浏览器支持的情况下使用ForeignObject渲染
      }).then(function (canvas) {
        let contentWidth = canvas.width
        let contentHeight = canvas.height
        let pageHeight = contentWidth / 592.28 * 841.89 // 一页pdf显示html页面生成的canvas高度;
        let leftHeight = contentHeight //未生成pdf的html页面高度
        let position = 0 //pdf页面偏移
        //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
        let imgWidth = 595.28
        let imgHeight = 592.28 / contentWidth * contentHeight
        let pageData = canvas.toDataURL('image/jpeg', 1.0)
        let 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', 20, position, imgWidth, imgHeight)
            leftHeight -= pageHeight
            position -= 841.89
            if (leftHeight > 0) {
              PDF.addPage()
            }
          }
        }
        PDF.save(title + '.pdf')
      })
    }
  }
}

  1. 在main.js中注册我们自定义的插件htmlToPdf.js
import htmlToPdf from '@/utils/htmlToPdf'
Vue.use(htmlToPdf)

4.在按钮上直接绑定getPdf方法,即可实现导出功能

   <el-button
      size="small"
      type="text"
      @click="getPdf()"
      style="float: right; margin-right: 60px;"
    >
      下载
    </el-button>
    <div id="pdfDom" ref="orderForm">
      <h1>封面设计数据</h1>

getPdf()是我们在main.js中绑定在Vue中的,固定名称,直接调用即可下载,无需在methods中写方法

export default {  //
  data () {
      return {
      htmlTitle: '页面导出PDF文件名'  //这个也是固定写法,pdf文件下载的名称
      }
  }
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容