当前位置:首页 > 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 中实现定位可以通过以下几种方式: 使用 CSS 定位 通过 CSS 的 position 属性实现定位,Vue 中可以直接在组件的 <style>…

vue实现github

vue实现github

Vue 实现 GitHub 相关功能 创建 GitHub API 请求 在 Vue 项目中,可以使用 axios 或 fetch 与 GitHub API 进行交互。需要在 GitHub 上创建个人访…

vue实现tabbar

vue实现tabbar

Vue 实现 TabBar 的方法 使用 Vue Router 实现基础 TabBar 安装 Vue Router 依赖: npm install vue-router 创建路由配置文件(route…

vue实现按钮

vue实现按钮

Vue 实现按钮的方法 使用原生 HTML 按钮 在 Vue 模板中可以直接使用 HTML 的 <button> 元素,通过 v-on 或 @ 绑定点击事件。 <template&…

vue实现书库

vue实现书库

Vue 实现书库功能 使用 Vue 构建书库功能需要结合前端框架和后端数据管理。以下是实现步骤和关键点: 项目初始化 使用 Vue CLI 或 Vite 初始化项目,安装 Vue Router 和状…

vue路由实现滑动

vue路由实现滑动

实现 Vue 路由滑动效果的方法 使用 Vue Router 结合 CSS 过渡动画 在 Vue Router 的路由视图组件 <router-view> 上添加过渡效果,结合 CSS 实…