当前位置:首页 > VUE

vue实现pdf水印

2026-02-18 14:08:19VUE

实现思路

在Vue中实现PDF水印通常涉及两种方式:前端生成水印后叠加到PDF上,或后端处理PDF文件添加水印。以下是两种方案的实现方法。

前端方案(基于PDF.js)

使用PDF.js库渲染PDF,通过Canvas叠加水印层。

安装依赖:

npm install pdfjs-dist

示例代码:

<template>
  <div class="pdf-container">
    <canvas ref="pdfCanvas"></canvas>
    <canvas ref="watermarkCanvas" class="watermark-layer"></canvas>
  </div>
</template>

<script>
import * as pdfjsLib from 'pdfjs-dist'

export default {
  props: ['pdfUrl'],
  mounted() {
    this.renderPdf()
  },
  methods: {
    async renderPdf() {
      const loadingTask = pdfjsLib.getDocument(this.pdfUrl)
      const pdf = await loadingTask.promise
      const page = await pdf.getPage(1)

      const viewport = page.getViewport({ scale: 1.5 })
      const canvas = this.$refs.pdfCanvas
      const context = canvas.getContext('2d')

      canvas.height = viewport.height
      canvas.width = viewport.width

      await page.render({
        canvasContext: context,
        viewport: viewport
      }).promise

      this.addWatermark()
    },

    addWatermark() {
      const canvas = this.$refs.watermarkCanvas
      const pdfCanvas = this.$refs.pdfCanvas
      canvas.width = pdfCanvas.width
      canvas.height = pdfCanvas.height

      const ctx = canvas.getContext('2d')
      ctx.font = '20px Arial'
      ctx.fillStyle = 'rgba(200, 200, 200, 0.5)'
      ctx.rotate(-0.785)

      for (let x = 0; x < canvas.width; x += 200) {
        for (let y = 0; y < canvas.height; y += 100) {
          ctx.fillText('CONFIDENTIAL', x, y)
        }
      }
    }
  }
}
</script>

<style>
.pdf-container {
  position: relative;
}
.watermark-layer {
  position: absolute;
  top: 0;
  left: 0;
  pointer-events: none;
}
</style>

后端方案(Node.js)

使用pdf-lib等库处理PDF文件。

安装依赖:

npm install pdf-lib

示例代码:

const { PDFDocument, rgb } = require('pdf-lib')
const fs = require('fs')

async function addWatermark(inputPath, outputPath) {
  const pdfBytes = fs.readFileSync(inputPath)
  const pdfDoc = await PDFDocument.load(pdfBytes)

  const pages = pdfDoc.getPages()
  pages.forEach(page => {
    const { width, height } = page.getSize()
    page.drawText('CONFIDENTIAL', {
      x: width / 2,
      y: height / 2,
      size: 50,
      opacity: 0.5,
      rotate: Math.PI / -4,
      color: rgb(0.9, 0.9, 0.9)
    })
  })

  const modifiedPdf = await pdfDoc.save()
  fs.writeFileSync(outputPath, modifiedPdf)
}

注意事项

前端方案的水印容易被移除,适合展示场景。后端方案生成的水印更持久,但需要服务器支持。水印内容应考虑使用半透明、倾斜排版等方式增加美观性和防篡改性。

vue实现pdf水印

对于生产环境,建议结合两种方案:前端展示时添加临时水印,下载时通过后端API生成带永久水印的PDF。

标签: 水印vue
分享给朋友:

相关文章

vue实现div

vue实现div

Vue 实现 DIV 元素的方法 在 Vue 中实现 DIV 元素可以通过多种方式,以下是几种常见的实现方法: 使用模板语法 在 Vue 的模板中直接使用 HTML 的 <div> 标签…

vue实现 单选

vue实现 单选

实现 Vue 单选功能 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 可以轻松实现单选功能,将单选按钮的值绑定到同…

vue实现追加

vue实现追加

追加数据到数组或列表 在Vue中追加数据到数组或列表,可以通过push方法或concat方法实现。以下是几种常见的实现方式: 方法一:使用push方法 this.items.push(newIte…

vue 实现vshow

vue 实现vshow

Vue 实现 v-show 在 Vue 中,v-show 是一个常用的指令,用于根据条件控制元素的显示或隐藏。与 v-if 不同,v-show 不会移除 DOM 元素,而是通过 CSS 的 displ…

vue源码实现

vue源码实现

Vue 源码实现解析 Vue.js 的核心实现可以分为响应式系统、虚拟 DOM、模板编译、组件化等几个关键部分。以下是对这些核心机制的详细解析。 响应式系统 Vue 的响应式系统基于 Object.…

vue实现导航栏

vue实现导航栏

使用 Vue 实现导航栏 基础导航栏结构 在 Vue 中实现导航栏通常使用 <router-link> 或自定义组件。以下是一个基础示例: <template> <…