vue项目页面的打印和下载PDF加loading效果的实现(加水印)

yizhihongxing

要实现Vue项目页面的打印和下载PDF加loading效果的实现(加水印),需要按照以下步骤进行:

1. 安装依赖

需要安装以下两个依赖:

  • html2canvas:用于将页面截图并转换为canvas。
  • jspdf:用于将canvas转成PDF。

可以使用以下命令进行安装:

npm install html2canvas jspdf --save

2. 实现打印功能

使用 html2canvas 将页面截图,然后使用 window.print() 进行打印。这个过程我们可以封装成一个函数:

const print = () => {
  // 获取要截图的容器
  const el = document.getElementById('print')

  // 使用html2canvas将容器截图
  html2canvas(el).then((canvas) => {
    // 将canvas转成图片
    const dataURL = canvas.toDataURL('image/png')

    // 调用系统打印功能
    const printWindow = window.open('', 'PrintWindow')
    printWindow.document.write(`<img src="${dataURL}" />`)
    printWindow.document.close()
    printWindow.print()
    printWindow.close()
  })
}

需要注意的是,html2canvas 实现在一些场景下可能会存在一定的兼容性问题。如果面临一些特定的场景下,可以考虑寻找其他替代方案。

3. 实现PDF下载

和打印功能类似,我们需要使用 html2canvas 将页面截图,然后使用 jspdf 将截图转成 PDF。

实现过程如下:

const downloadPDF = () => {
  // 获取要截图的容器
  const el = document.getElementById('download')

  // 使用html2canvas将容器截图
  html2canvas(el).then((canvas) => {
    // 将canvas转成图片
    const imgData = canvas.toDataURL('image/png')

    // 计算PDF页面大小
    const pageWidth = 210
    const pageHeight = canvas.height * pageWidth / canvas.width

    // 初始化jspdf对象
    const pdf = new jsPDF('p', 'mm', 'a4')

    // 将图片添加到PDF
    pdf.addImage(imgData, 'PNG', 0, 0, pageWidth, pageHeight)

    // 下载PDF
    pdf.save('download.pdf')
  })
}

这个函数中,我们首先获取要下载的容器,然后使用 html2canvas 将容器截图,将截图转成图片。接着,我们计算需要将图片放入的 PDF 页面的大小,然后使用 jspdf 创建 PDF 对象,并将图片放入 PDF。最后,我们调用 pdf.save() 方法下载 PDF。

需要注意的是,html2canvas 处理网页时遇到的第三方库或者CSS3动画/特效等会存在兼容性问题,因此要保证页面的简单、清晰才能减少兼容性问题。

4. 添加Loading效果和水印

在进行页面截图时,如果页面过于复杂,截图和转换会耗费一定的时间。因此,在进行页面截图时,我们可以添加一个 Loading 效果来提示用户正在进行处理。

我们可以在函数开始时显示 Loading,函数结束时隐藏 Loading。

const downloadPDF = () => {
  // 显示loading
  showLoading()

  html2canvas(el).then((canvas) => {
    hideLoading()
    // ...
  })
}

在显示和隐藏 Loading 时,我们可以使用某些第三方库或自己实现。

另外,我们也可以在打印或者下载 PDF 时,添加水印。为了保证页面数据不被非法传播、盗取,我们可以在 PDF 的每一页上添加一个透明的水印。

添加水印的方法如下:

const addWatermark = (pdf, text) => {
  const totalPages = pdf.getNumberOfPages()
  for (let i = 1; i <= totalPages; i++) {
    // 选择当前页
    pdf.setPage(i)

    // 计算水印位置
    const x = pdf.internal.pageSize.getWidth() / 2
    const y = pdf.internal.pageSize.getHeight() / 2
    pdf.setFontSize(100)
    pdf.setTextColor(150, 150, 150, 0.8)
    pdf.setOpacity(0.5)
    pdf.text(text, x, y, null, null, "center", null);
  }
}

在这个函数中,我们首先获取当前 PDF 的总页数,然后循环每一页,计算水印的位置,使用 pdf.text() 添加水印。

将函数封装起来,我们可以这样使用:

const downloadPDF = () => {
  // 显示loading
  showLoading()

  const pdf = new jsPDF('p', 'mm', 'a4')
  const el = document.getElementById('download')

  html2canvas(el).then((canvas) => {
    // 隐藏loading
    hideLoading()

    const imgData = canvas.toDataURL('image/png')

    // 计算PDF页面大小
    const pageWidth = 210
    const pageHeight = canvas.height * pageWidth / canvas.width

    // 将图片添加到PDF
    pdf.addImage(imgData, 'PNG', 0, 0, pageWidth, pageHeight)

    // 添加水印
    addWatermark(pdf, 'My Watermark')

    // 下载PDF
    pdf.save('download.pdf')
  })
}

在这个函数中,我们首先创建 PDF 对象,然后截图,将截图转成图片,并添加到 PDF 中。我们接着添加水印,最后下载 PDF。

示例1:实现vue项目页面截图下载的demo

<template>
  <div>
    <button @click="downloadPDF">下载PDF</button>
    <div id="download">
      <!-- 需要截图下载的内容 -->
    </div>
  </div>
</template>

<script>
import html2canvas from 'html2canvas'
import jsPDF from 'jspdf'

export default {
  methods: {
    downloadPDF() {
      // 显示loading
      showLoading()

      const pdf = new jsPDF('p', 'mm', 'a4')
      const el = document.getElementById('download')

      html2canvas(el).then((canvas) => {
        hideLoading()

        const imgData = canvas.toDataURL('image/png')

        // 计算PDF页面大小
        const pageWidth = 210
        const pageHeight = canvas.height * pageWidth / canvas.width

        // 将图片添加到PDF
        pdf.addImage(imgData, 'PNG', 0, 0, pageWidth, pageHeight)

        // 添加水印
        addWatermark(pdf, 'My Watermark')

        // 下载PDF
        pdf.save('download.pdf')
      })
    }
  }
}
</script>

示例2:实现vue项目页面打印的demo

<template>
  <div>
    <button @click="print">打印</button>
    <div id="print">
      <!-- 需要打印的内容 -->
    </div>
  </div>
</template>

<script>
import html2canvas from 'html2canvas'

export default {
  methods: {
    print() {
      const el = document.getElementById('print')

      html2canvas(el).then((canvas) => {
        const dataURL = canvas.toDataURL('image/png')

        const printWindow = window.open('', '')
        printWindow.document.write(`<img src="${dataURL}" />`)
        printWindow.document.close()
        printWindow.print()
        printWindow.close()
      })
    }
  }
}
</script>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue项目页面的打印和下载PDF加loading效果的实现(加水印) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • vue中常见的问题及解决方法总结(推荐)

    Vue中常见问题及解决方法总结 1. Vue中常见问题 1.1. Vue组件之间通信 在Vue中,通信是组件之间的一个重要问题。通信包括父子组件之间的通信、兄弟组件之间的通信,还有隔代组件之间的通信等。通信方式有很多种,包括props/$emit、$parent/$children、事件总线、Vuex等。 1.1.1. Props/$emit Props/$…

    Vue 2023年5月27日
    00
  • 前端vue3使用axios调用后端接口的实现方法

    当前端使用Vue3框架时,常常需要通过HTTP请求与后端进行交互从而实现前后端数据的交互。而axios作为一个基于Promise的HTTP客户端,已经成为前端开发中最常用的HTTP请求工具之一。下面是Vue3前端使用axios调用后端接口的实现方法攻略: 1. 安装axios 使用npm可以很容易地安装axios,只需要在项目根目录下运行以下命令即可: np…

    Vue 2023年5月27日
    00
  • Vue实现跑马灯简单效果

    下面是 Vue 实现跑马灯简单效果的攻略: 概述 跑马灯是常用于展示广告、公告等信息的效果。在 Vue 中实现跑马灯,可以使用 Vue 的内置指令 v-for 和过渡效果实现。 实现步骤 使用 v-for 指令循环渲染数据 使用 CSS3 的过渡效果实现轮播效果 使用 computed 计算属性进行数据循环 使用 setInterval() 方法实现自动轮播…

    Vue 2023年5月27日
    00
  • Vue Cli3 创建项目的方法步骤

    Vue Cli3 是 Vue.js 的一个脚手架工具,提供了快速创建 Vue.js 项目的能力。下面将详细讲解 Vue Cli3 创建项目的方法步骤。 第一步:安装 Node.js Vue Cli3 需要依赖 Node.js 环境,所以必须先安装 Node.js。在终端中输入以下命令进行安装: $ curl -o- https://raw.githubuse…

    Vue 2023年5月28日
    00
  • Vue3 – setup script的使用体验分享

    下面我将为你详细讲解“Vue3 – setup script的使用体验分享”的完整攻略。 1. 什么是Vue3 setup script? Vue3的setup script即组件选项中新增的setup函数。这个函数会在组件被创建之前执行,并且返回值将会被传递给模板和其他组件选项中的方法。 setup函数可以方便的访问组件实例,并且可以使用非响应式的引用,避…

    Vue 2023年5月28日
    00
  • Vue.nextTick纯干货使用方法详解

    让我向您介绍Vue.nextTick纯干货使用方法详解。 什么是Vue.nextTick? Vue.nextTick是vue.js的一个API,用于在DOM更新后执行回调。Vue.nextTick(()=>{})将在整个页面渲染完毕后被触发,即在DOM更新周期的下一次微任务队列中执行传入的回调函数。 使用Vue.nextTick的场景 当我们需要操作D…

    Vue 2023年5月28日
    00
  • 详解vue axios二次封装

    下面是“详解vue axios二次封装”的完整攻略。 一、为什么需要封装axios? 在Vue应用中发起网络请求,一般会选择使用axios库。因为axios具有一系列强大的功能,比如:支持Promise,支持取消请求,拦截请求和响应,自动转换JSON格式等。但是,如果我们直接使用axios,会有一些不方便的地方,比如:每个请求都需要设置baseUrl、每个请…

    Vue 2023年5月28日
    00
  • 一文带你搞懂Vue3的基本语法

    一文带你搞懂Vue3的基本语法 Vue.js是一款流行的前端JavaScript框架,Vue.js 3是Vue.js框架的最新版本,其基本语法与Vue.js 2有许多不同之处。 创建Vue应用程序 要创建一个Vue应用程序,您需要创建一个Vue实例。您可以使用Vue.createApp()方法来创建Vue实例。以下是一个基本的Vue应用程序示例: <d…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部