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 文件可能会受到浏览器渲染和字体支持的影响,建议在不同浏览器中进行测试。
相关推荐
灵感__idea7 小时前
Hello 算法:贪心的世界
前端·javascript·算法
killerbasd10 小时前
牧苏苏传 我不装了 4/7
前端·javascript·vue.js
橘子编程11 小时前
JavaScript与TypeScript终极指南
javascript·ubuntu·typescript
叫我一声阿雷吧12 小时前
JS 入门通关手册(45):浏览器渲染原理与重绘重排(性能优化核心,面试必考
javascript·前端面试·前端性能优化·浏览器渲染·浏览器渲染原理,重排重绘·reflow·repaint
大家的林语冰12 小时前
《前端周刊》尤大开源 Vite+ 全家桶,前端工业革命启动;尤大爆料 Void 云服务新产品,Vite 进军全栈开发;ECMA 源码映射规范......
前端·javascript·vue.js
jiayong2312 小时前
第 8 课:开始引入组合式函数
前端·javascript·学习
天若有情67313 小时前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串
M ? A13 小时前
Vue 迁移 React 实战:VuReact 一键自动化转换方案
前端·vue.js·经验分享·react.js·开源·自动化·vureact
yuki_uix13 小时前
重排、重绘与合成——浏览器渲染性能的底层逻辑
前端·javascript·面试
Burt14 小时前
我的 2026 全栈选型:Vue3 + Elysia + Bun + AlovaJS
vue.js·全栈·bun