当前位置:首页 > JavaScript

js实现pdf签名

2026-02-03 00:06:44JavaScript

实现PDF签名的基本方法

使用JavaScript实现PDF签名通常涉及前端库或后端服务处理。以下是几种常见方法:

前端实现(浏览器环境) 使用PDF库如pdf-libpdf.js添加签名:

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

async function addSignatureToPDF(pdfBytes, signatureImage) {
  const pdfDoc = await PDFDocument.load(pdfBytes);
  const page = pdfDoc.getPages()[0];

  // 添加签名图像
  const signature = await pdfDoc.embedPng(signatureImage);
  page.drawImage(signature, {
    x: 50,
    y: 50,
    width: 100,
    height: 50,
  });

  return await pdfDoc.save();
}

数字签名(加密验证) 使用node-forgepkijs进行数字签名:

const forge = require('node-forge');

function signPDF(pdfBuffer, privateKeyPem) {
  const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);
  const md = forge.md.sha256.create();
  md.update(pdfBuffer.toString('binary'));
  return privateKey.sign(md);
}

完整解决方案示例

依赖库选择

  • 纯前端:pdf-lib + 画布签名(如signature_pad
  • 后端处理:pdfkit(Node.js)或iText(Java/Python桥接)
  • 全栈方案:前端收集签名图像,后端通过PDFtkGhostscript合并

实现步骤

创建画布签名板(前端):

const canvas = document.getElementById('signature-pad');
const ctx = canvas.getContext('2d');
let drawing = false;

canvas.addEventListener('mousedown', startDrawing);
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mouseup', stopDrawing);

function startDrawing(e) {
  drawing = true;
  draw(e);
}

function draw(e) {
  if (!drawing) return;
  ctx.lineWidth = 2;
  ctx.lineCap = 'round';
  ctx.strokeStyle = '#000';
  ctx.lineTo(e.clientX, e.clientY);
  ctx.stroke();
}

function stopDrawing() {
  drawing = false;
  ctx.beginPath();
}

将签名嵌入PDF(Node.js后端示例):

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

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

  const pngImage = await pdfDoc.embedPng(fs.readFileSync(signatureImage));
  const pages = pdfDoc.getPages();
  pages[0].drawImage(pngImage, {
    x: 100,
    y: 100,
    width: 150,
    height: 50,
  });

  fs.writeFileSync(outputPath, await pdfDoc.save());
}

安全注意事项

  • 数字签名应使用证书颁发机构(CA)签发的密钥对
  • 前端实现的图形签名需通过HTTPS传输防止篡改
  • 考虑使用WebAssembly加速加密运算(如libsodium.js
  • 敏感操作建议在后端完成,避免暴露私钥

云服务方案

对于企业级需求,可集成第三方API:

  • Adobe Sign API
  • Docusign REST API
  • PandaDoc电子签名服务

调用示例(以Docusign为例):

js实现pdf签名

const axios = require('axios');

async function createEnvelopeWithSignature(docBase64, signerEmail) {
  const response = await axios.post('https://demo.docusign.net/restapi/v2.1/envelopes', {
    documents: [{
      documentBase64: docBase64,
      fileExtension: 'pdf'
    }],
    recipients: {
      signers: [{
        email: signerEmail,
        tabs: {
          signHereTabs: [{
            xPosition: '100',
            yPosition: '100'
          }]
        }
      }]
    }
  }, {
    headers: { Authorization: `Bearer ${accessToken}` }
  });
  return response.data;
}

标签: jspdf
分享给朋友:

相关文章

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…