当前位置:首页 > 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)
}

注意事项

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

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

vue实现pdf水印

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

相关文章

vue实现自定义登录

vue实现自定义登录

实现自定义登录的基本步骤 在Vue中实现自定义登录功能通常需要结合前端和后端技术。以下是一个基本的实现流程: 创建登录表单组件 使用Vue的单文件组件创建一个登录表单,包含用户名和密码输入框以及提…

vue实现选中单元格

vue实现选中单元格

Vue 实现选中单元格的方法 基础实现思路 在 Vue 中实现选中单元格功能,通常可以通过动态绑定 class 或 style 来实现。以下是一个基于表格的简单实现示例: <template…

ssh vue 实现

ssh vue 实现

使用SSH连接Vue项目部署的服务器 在Vue项目开发或部署过程中,可能需要通过SSH连接到远程服务器进行配置或维护。以下是实现SSH连接并部署Vue项目的关键步骤: 生成SSH密钥对 在本地终端…

vue实现jqueryui

vue实现jqueryui

Vue 实现 jQuery UI 功能 在 Vue 项目中实现类似 jQuery UI 的功能,可以通过原生 Vue 组件或第三方库来实现。以下是几种常见 jQuery UI 功能的 Vue 替代方案…

vue实现picker

vue实现picker

Vue 实现 Picker 组件的方法 在 Vue 中实现 Picker 组件可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 HTML 和 CSS 实现 通过 Vue 的模板和样式绑定…

vue实现看板

vue实现看板

Vue 实现看板功能 使用 Vue 实现看板功能可以通过组件化开发、状态管理和拖拽库结合完成。以下是一个完整的实现方案: 基础项目结构 src/ ├── components/ │ ├── Ka…