Vue使用html2Canvas+printJS实现分页导出,打印

Vue使用html2Canvas+printJS实现分页导出,打印

1.插件引入

npm i html2canvas
npm i print-js

2.使用模板

<template>
  <div class="dymb">
    <el-button @click="getPdf()">导出PDF</el-button>
    <el-button @click="goPrint()">打印PDF</el-button>
    <div class="pdfContent " id="pdfDom" ref="print">

      <!-- 正面模板 -->
      <div class="content marginBottom" style="page-break-after:always">
        <!-- <div v-for="i in 83" :key="i">
          {{i}}
        </div> -->
      </div>

      <!-- 背面模板 -->
      <div class="content content2 " style="page-break-after:always">
        <!-- <div v-for="i in 83" :key="i">
          {{i}}
        </div> -->
      </div>
    </div>
  </div>

</template>

<script>
import html2Canvas from 'html2Canvas'
import printJS from 'print-js'
export default {
  name: 'dymb',
  data () {
    return {
      htmlTitle: '标题',
    }
  },
  watch: {
  },
  created () {
  },
  mounted () {

  },
  methods: {
    goPrint () {
      this.isPrint = true
      html2Canvas(this.$refs.print, {
        allowTaint: true,
        taintTest: false,
        useCORS: true,
        dpi: window.devicePixelRatio * 4,
        scale: 4
      }).then((canvas) => {
        const url = canvas.toDataURL('image/jpeg', 1.0)
        printJS({
          printable: url, // 要打印的id
          type: 'image',
          style: '@page{size:auto;margin: 1.5cm 1cm 1.5cm 1cm;}' //去除页眉页脚
        })
        this.isPrint = false
      })
    }
  }
}
</script>

<style lang="scss" scoped>
//  @page {
//    size: auto;
//    margin: 0 5px;
//  }
.dymb {
  width: 100%;
  height: 100%;
  overflow: auto;

  .pdfContent {
    width: 1240px;
    margin: 0 auto;
    box-sizing: border-box;
  }

  .content {
    width: 1240px;
    height: 1754px;
    border: 1px #1c1 solid;
    box-sizing: border-box;
    // margin: 0 auto;
  }

  .content2 {
    width: 1240px;
    height: 1700px;
    border: 1px #1c1 solid;
    box-sizing: border-box;
  }

  .marginBottom {
    margin-bottom: 30px;
  }

  .zm {}
  .bm {}
}
</style>


3.导出方法封装

// htmlToPdf.js
// 导出页面为PDF格式
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: 1, // 对Y轴进行裁切
        // width:1200,
        // height:5000,
        // width: 1240,
        // height: 3508,
        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')
      })
    }
  }
}

4.main.js引入

// 导出
import htmlToPdf from './utils/htmlToPDF.js'
Vue.use(htmlToPdf)

如有不足,请多指教,
未完待续,持续更新!
大家一起进步!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Vue.js是一种流行的JavaScript框架,它可以帮助开发人员构建交互式Web应用程序。而print.js是一个简单的JavaScript库,它可以帮助我们轻松地打印HTML元素。本文将介绍如何在Vue.js应用程序中使用print.js实现分页打印。 步骤一:安装print.js 首先,我们需要安装print.js库。可以使用npm来安装: ``` npm install print-js ``` 步骤二:创建一个组件 接下来,我们需要创建一个Vue组件,用于显示我们要打印的内容。在这个例子中,我们将创建一个简单的表格来演示打印。 ```html <template> <div> <table> <thead> <tr> <th>ID</th> <th>Name</th> <th>Age</th> </tr> </thead> <tbody> <tr v-for="person in people" :key="person.id"> <td>{{ person.id }}</td> <td>{{ person.name }}</td> <td>{{ person.age }}</td> </tr> </tbody> </table> <button @click="printTable">Print</button> </div> </template> <script> import printJS from "print-js"; export default { data() { return { people: [ { id: 1, name: "Alice", age: 25 }, { id: 2, name: "Bob", age: 30 }, { id: 3, name: "Charlie", age: 35 }, { id: 4, name: "David", age: 40 }, { id: 5, name: "Eve", age: 45 }, ], }; }, methods: { printTable() { printJS({ printable: "table", type: "html", css: "/path/to/style.css", scanStyles: true, }); }, }, }; </script> ``` 在组件中,我们定义了一个表格来显示数据。我们还定义了一个按钮,当用户点击按钮时,我们将调用printTable方法来打印表格。 步骤三:使用print.js打印printTable方法中,我们使用print.js库来打印表格。我们需要传递以下参数给printJS方法: - printable:要打印的元素的ID或HTML字符串。 - type:要打印的内容的类型,可以是html、image、pdf或json。 - css:打印时要使用的样式表的URL或路径。 - scanStyles:是否扫描打印内容中的样式。 在本例中,我们将表格的ID传递给printable参数,将type设置为html,将样式表的路径传递给css参数,并将scanStyles设置为true。 完成后,我们就可以点击按钮来打印表格了。print.js将会自动分页打印所有内容。 总结 在本文中,我们介绍了如何在Vue.js应用程序中使用print.js实现分页打印。我们创建了一个简单的表格来演示打印。我们使用npm来安装print.js,然后在Vue组件中使用它来打印表格。当然,print.js还有许多其他的功能,可以满足我们的各种打印需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

東三城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值