当前位置:首页 > VUE

vue实现pdf签名

2026-03-29 23:52:02VUE

Vue 实现 PDF 签名的方法

使用 pdf-lib 和 signature_pad 库

安装依赖库:

npm install pdf-lib signature_pad

创建签名画布组件:

<template>
  <div>
    <canvas ref="signatureCanvas" width="400" height="200"></canvas>
    <button @click="clearSignature">清除</button>
    <button @click="saveSignature">保存</button>
  </div>
</template>

<script>
import SignaturePad from 'signature_pad';

export default {
  mounted() {
    this.signaturePad = new SignaturePad(this.$refs.signatureCanvas);
  },
  methods: {
    clearSignature() {
      this.signaturePad.clear();
    },
    saveSignature() {
      const signatureData = this.signaturePad.toDataURL();
      this.$emit('signature-saved', signatureData);
    }
  }
};
</script>

合并签名到 PDF:

import { PDFDocument, rgb } from 'pdf-lib';

async function addSignatureToPdf(pdfBytes, signatureData) {
  const pdfDoc = await PDFDocument.load(pdfBytes);
  const pages = pdfDoc.getPages();
  const firstPage = pages[0];

  const pngImage = await pdfDoc.embedPng(signatureData);
  const pngDims = pngImage.scale(0.5);

  firstPage.drawImage(pngImage, {
    x: 50,
    y: 50,
    width: pngDims.width,
    height: pngDims.height,
  });

  return await pdfDoc.save();
}

使用 vue-pdf-signature 插件

安装插件:

npm install vue-pdf-signature

在组件中使用:

<template>
  <vue-pdf-signature
    :pdf="pdfUrl"
    @signed="onSigned"
  />
</template>

<script>
import VuePdfSignature from 'vue-pdf-signature';

export default {
  components: {
    VuePdfSignature
  },
  data() {
    return {
      pdfUrl: '/path/to/document.pdf'
    };
  },
  methods: {
    onSigned(signedPdf) {
      // 处理签名后的PDF
    }
  }
};
</script>

使用 PDF.js 和自定义签名层

加载 PDF 文档:

vue实现pdf签名

const loadingTask = pdfjsLib.getDocument(pdfUrl);
loadingTask.promise.then(function(pdf) {
  pdf.getPage(1).then(function(page) {
    const viewport = page.getViewport({ scale: 1.0 });
    const canvas = document.getElementById('pdf-canvas');
    const context = canvas.getContext('2d');

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

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

添加签名层:

<template>
  <div class="pdf-container">
    <canvas id="pdf-canvas"></canvas>
    <div class="signature-overlay" ref="signatureOverlay"></div>
  </div>
</template>

<style>
.pdf-container {
  position: relative;
}
.signature-overlay {
  position: absolute;
  top: 0;
  left: 0;
  pointer-events: auto;
}
</style>

实现签名保存功能

将画布转换为图像:

function canvasToImage(canvas) {
  return canvas.toDataURL('image/png');
}

下载签名后的 PDF:

vue实现pdf签名

function downloadPdf(pdfBytes, fileName) {
  const blob = new Blob([pdfBytes], { type: 'application/pdf' });
  const link = document.createElement('a');
  link.href = URL.createObjectURL(blob);
  link.download = fileName;
  link.click();
}

响应式设计考虑

调整画布大小:

function resizeCanvas() {
  const canvas = this.$refs.signatureCanvas;
  const ratio = Math.max(window.devicePixelRatio || 1, 1);
  canvas.width = canvas.offsetWidth * ratio;
  canvas.height = canvas.offsetHeight * ratio;
  canvas.getContext('2d').scale(ratio, ratio);
  if (this.signaturePad) {
    this.signaturePad.clear();
  }
}

移动端支持

添加触摸事件支持:

this.signaturePad = new SignaturePad(canvas, {
  onBegin: () => {
    // 触摸开始
  },
  onEnd: () => {
    // 触摸结束
  }
});

签名验证功能

验证签名是否存在:

function isSignatureEmpty() {
  return this.signaturePad.isEmpty();
}

时间戳功能

添加签名时间:

function addTimestamp(pdfDoc) {
  const pages = pdfDoc.getPages();
  const firstPage = pages[0];
  const now = new Date();

  firstPage.drawText(now.toLocaleString(), {
    x: 50,
    y: 30,
    size: 12,
    color: rgb(0, 0, 0),
  });
}

这些方法提供了在 Vue 中实现 PDF 签名的不同途径,可以根据项目需求选择适合的方案。

标签: vuepdf
分享给朋友:

相关文章

vue实现逻辑

vue实现逻辑

Vue 实现逻辑的核心概念 Vue.js 是一个渐进式 JavaScript 框架,其核心逻辑围绕数据驱动和组件化开发。通过响应式系统、虚拟 DOM 和组件生命周期等机制,Vue 实现了高效的前端开发…

vue实现水印

vue实现水印

Vue 实现水印的方法 使用 CSS 背景图 通过 CSS 的 background-image 和 background-repeat 属性实现水印效果。创建一个包含水印文本的 Canvas,将其转…

vue实现日历

vue实现日历

Vue 实现日历的基本方法 使用 Vue 实现日历可以通过自定义组件或借助第三方库完成。以下是两种常见实现方式: 自定义日历组件 创建基于 Vue 的日历组件需要处理日期计算和渲染逻辑。核心是生成当…

vue实现回复

vue实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及前端表单交互、数据绑定和后端通信。以下是实现回复功能的详细步骤: 数据绑定与表单设计 使用 Vue 的 v-model 绑定回复框的输入内容,…

vue搜索功能实现

vue搜索功能实现

Vue搜索功能实现方法 在Vue中实现搜索功能可以通过多种方式完成,以下是几种常见的方法: 使用计算属性实现搜索 计算属性非常适合处理需要根据输入值动态过滤数据的情况。创建一个计算属性,根据搜索关键…

使用vue实现搜索

使用vue实现搜索

使用 Vue 实现搜索功能 基础搜索实现 在 Vue 中实现搜索功能通常涉及数据绑定、事件监听和列表过滤。以下是一个简单的实现方式: <template> <div&g…