Vue.js组件开发-实现导出PDF文件可自定义添加水印及水印样式方向

使用 Vue 实现导出 PDF 文件并添加水印,同时支持设置水印样式、方向和自定义水印内容。

步骤

  1. 安装依赖 :使用 html2canvas 将 HTML 内容转换为 canvas,使用 jspdf 生成 PDF 文件。
  2. 创建 Vue 组件:在组件中实现水印生成、HTML 转 canvas、canvas 转 PDF 的功能。
  3. 设置水印样式和方向:支持自定义水印内容、字体、颜色、透明度、旋转角度等。
  4. 导出 PDF 文件:将带有水印的 HTML 内容导出为 PDF 文件。

详细代码及注释

vue 复制代码
<template>
  <div>
    <!-- 输入水印内容 -->
    <input v-model="watermarkText" placeholder="请输入水印内容" />
    <!-- 选择水印旋转角度 -->
    <select v-model="watermarkAngle">
      <option value="0">0°</option>
      <option value="30">30°</option>
      <option value="45">45°</option>
      <option value="60">60°</option>
      <option value="90">90°</option>
    </select>
    <!-- 导出 PDF 按钮 -->
    <button @click="exportPDF">导出 PDF</button>
    <!-- 要导出的内容 -->
    <div id="content" ref="contentRef">
      <h1>这是要导出的内容</h1>
      <p>这里可以是任意 HTML 内容。</p>
    </div>
  </div>
</template>

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

export default {
  data() {
    return {
      // 水印内容
      watermarkText: '水印内容',
      // 水印旋转角度
      watermarkAngle: '45',
    };
  },
  methods: {
    // 生成水印 canvas
    generateWatermark() {
      // 创建一个新的 canvas 元素
      const canvas = document.createElement('canvas');
      // 设置 canvas 的宽度和高度
      canvas.width = 200;
      canvas.height = 100;
      // 获取 canvas 的 2D 绘图上下文
      const ctx = canvas.getContext('2d');
      // 保存当前的绘图状态
      ctx.save();
      // 设置文本对齐方式为居中
      ctx.textAlign = 'center';
      // 设置文本垂直对齐方式为中间
      ctx.textBaseline = 'middle';
      // 设置字体样式
      ctx.font = '20px Arial';
      // 设置文本颜色
      ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';
      // 旋转画布
      ctx.rotate((this.watermarkAngle * Math.PI) / 180);
      // 在画布上绘制水印文本
      ctx.fillText(this.watermarkText, canvas.width / 2, canvas.height / 2);
      // 恢复之前保存的绘图状态
      ctx.restore();
      return canvas;
    },
    // 导出 PDF 文件
    async exportPDF() {
      try {
        // 生成水印 canvas
        const watermarkCanvas = this.generateWatermark();
        // 将水印 canvas 转换为 base64 格式的图片
        const watermarkImage = watermarkCanvas.toDataURL('image/png');
        // 获取要导出的内容元素
        const content = this.$refs.contentRef;
        // 使用 html2canvas 将 HTML 内容转换为 canvas
        const canvas = await html2canvas(content);
        // 获取 canvas 的宽度和高度
        const imgWidth = 210;
        const pageHeight = 295;
        const imgHeight = (canvas.height * imgWidth) / canvas.width;
        let heightLeft = imgHeight;
        // 创建一个新的 PDF 对象
        const pdf = new jsPDF('p', 'mm');
        let position = 0;
        // 将 canvas 转换为图片并添加到 PDF 中
        pdf.addImage(canvas.toDataURL('image/png'), 'PNG', 0, 0, imgWidth, imgHeight);
        // 添加水印到 PDF 中
        pdf.addImage(watermarkImage, 'PNG', 50, 100, 100, 50);
        heightLeft -= pageHeight;
        // 处理超出一页的内容
        while (heightLeft >= 0) {
          position = heightLeft - imgHeight;
          pdf.addPage();
          pdf.addImage(canvas.toDataURL('image/png'), 'PNG', 0, position, imgWidth, imgHeight);
          pdf.addImage(watermarkImage, 'PNG', 50, 100, 100, 50);
          heightLeft -= pageHeight;
        }
        // 保存 PDF 文件
        pdf.save('exported_file.pdf');
      } catch (error) {
        console.error('导出 PDF 失败:', error);
      }
    },
  },
};
</script>

<style scoped>
/* 可以在这里添加样式 */
</style>

使用说明

  1. 安装依赖 :在项目根目录下运行以下命令安装 html2canvasjspdf
bash 复制代码
npm install html2canvas jspdf
  1. 引入组件 :将上述代码保存为一个 Vue 组件文件(例如 ExportPDF.vue),然后在需要使用的地方引入并使用该组件。
vue 复制代码
<template>
  <div>
    <ExportPDF />
  </div>
</template>

<script>
import ExportPDF from './ExportPDF.vue';

export default {
  components: {
    ExportPDF,
  },
};
</script>
  1. 自定义水印内容和样式
    • 在输入框中输入自定义的水印内容。
    • 通过下拉框选择水印的旋转角度。
  2. 导出 PDF 文件:点击"导出 PDF"按钮,即可将带有水印的 HTML 内容导出为 PDF 文件。

注意事项

  • 由于 html2canvasjspdf 是基于浏览器环境的库,因此该功能只能在浏览器中使用。
  • 导出的 PDF 文件可能会受到浏览器渲染和字体支持的影响,建议在不同浏览器中进行测试。
相关推荐
Easonmax44 分钟前
【javaSE】内部类(来自类和对象的补充)
开发语言·javascript·ecmascript
计算机-秋大田2 小时前
基于SpringBoot的假期周边游平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
java·vue.js·spring boot·后端·课程设计
新青年.3 小时前
【uniapp】uniapp使用java线程池
javascript·uni-app
答题卡上的情书3 小时前
uniapp版本升级
前端·javascript·uni-app
大叔_爱编程3 小时前
wx044基于springboot+vue+uniapp的智慧物业平台小程序
vue.js·spring boot·小程序·uni-app·毕业设计·源码·课程设计
枫叶丹44 小时前
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
开发语言·前端·javascript·华为·harmonyos
有杨既安然4 小时前
Vue.js组件开发深度指南:从零到可复用的艺术
前端·javascript·vue.js·npm
小韩学长yyds5 小时前
前端实战:小程序搭建商品购物全流程
javascript·css·vue.js·小程序·前端框架·node.js·html5
NoneCoder7 小时前
JavaScript系列(50)--编译器实现详解
开发语言·javascript·ecmascript
我命由我123458 小时前
脚本运行禁止:npm 无法加载文件,因为在此系统上禁止运行脚本
前端·javascript·前端框架·npm·node.js·html·js