首页 / 博客中心 / 如何以编程方式在 PDF 表单中启用数字签名?

如何以编程方式在 PDF 表单中启用数字签名?

顺访
2025-12-25
3min
Twitter Facebook Linkedin

程序化数字签名在业务流程中的兴起

在当今以数字为先的商业环境中,通过编程方式在 PDF 表单中启用数字签名已成为简化合同、审批和合规流程的必需手段。从自动化人力资源入职到保障财务协议,企业越来越多地转向代码驱动的解决方案,将电子签名无缝集成到其应用程序中。这种方法不仅减少了手动错误,还确保了跨司法管辖区的法律有效性,从而节省时间和成本。

Top DocuSign Alternatives in 2026

理解 PDF 表单中的数字签名

数字签名超越了简单的电子签名,通过使用加密技术来验证文档的真实性和完整性。在 PDF 表单中,它们创建了一个防篡改封印,确保签署后任何更改都会使签名失效。这在金融、医疗保健和法律服务等受监管行业中尤为宝贵,这些行业中审计跟踪和不可否认性至关重要。

编程方式启用这些签名涉及将签名字段嵌入 PDF 中,并通过 API 或库应用证书。与手动签名工具不同,这种方法允许开发者将签名集成到自定义工作流程中,例如 Web 应用程序或移动平台,从而提升企业处理大量文档的可扩展性。

如何编程方式在 PDF 表单中启用数字签名

要实现数字签名的编程方式,开发者通常利用开源库或基于云的 API。此过程需要了解 PDF 标准,如 PDF/A 或 ISO 32000,这些标准定义了签名的结构。下面,我们将概述使用流行库的逐步指南,重点关注 Java 或 Python 等语言的实际代码示例。此方法确保符合全球标准,如美国的 ESIGN 法案或欧盟的 eIDAS,尽管区域差异——如亚洲的生态系统集成法规——可能需要额外的身份验证层。

步骤 1: 准备您的开发环境

首先选择一个强大的 PDF 操作库。Apache PDFBox(基于 Java,免费)或 iText(有商业/开源版本)是行业首选,因为它们支持数字签名。对于 Python 用户,PyPDF2 结合 endesive 提供了一个轻量级替代方案。

  • 安装依赖项:对于使用 PDFBox 的 Java,添加 Maven 工件 org.apache.pdfbox:pdfbox:3.0.0。对于 iText,使用 com.itextpdf:itext7-core:7.2.5
  • 获取数字证书:您需要从受信任的证书颁发机构 (CA) 如 DigiCert 或 GlobalSign 获取 PKCS#12 (.p12) 文件。这包括用于签名的私钥和用于验证的公钥。

企业应评估 CA 成本,因为每位签名者的年度费用可能在 100–500 美元之间,从而影响总实施费用。

步骤 2: 创建或修改带有签名字段的 PDF 表单

首先打开现有 PDF 或生成一个新的,然后添加一个不可见或可见的签名字段。

使用 Java 中的 PDFBox:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField;

PDDocument document = PDDocument.load(new File("input.pdf"));
PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm();
PDSignatureField signatureField = (PDSignatureField) acroForm.getField("Signature1"); // Or create new
if (signatureField == null) {
    // Create a new signature field
    signatureField = new PDSignatureField(acroForm, rectangle); // Define position
    signatureField.setPartialName("Signature1");
    acroForm.getFields().add(signatureField);
}
document.save("form_with_signature.pdf");

此代码在指定的矩形区域(例如页面坐标)添加一个签名字段。对于表单,确保字段使用 AcroForm 标准具有交互性。

在 Python 中使用 PyPDF2 和 reportlab 创建表单:

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from PyPDF2 import PdfReader, PdfWriter

c = canvas.Canvas("base_form.pdf", pagesize=letter)
c.acroForm.textfield(name='Signature1', tooltip='Digital Signature Field',
                     x=100, y=700, borderStyle='inset', forceBorder=True)
c.save()

# Merge or modify existing PDF
reader = PdfReader("base_form.pdf")
writer = PdfWriter()
writer.append(reader)
writer.add_annotation(page_number=0, annotation=...)  # Add signature annotation
with open("form_with_signature.pdf", "wb") as output:
    writer.write(output)

这建立了基础,允许 PDF 接受签名而无需更改文档结构。

步骤 3: 应用数字签名

现在,使用您的证书对 PDF 进行签名。这涉及创建签名字典并对文档字节进行哈希。

使用 PDFBox:

import org.apache.pdfbox.io.IOUtils;
import org.apache.pdfbox.pdmodel.interactive.digitalsignature.*;

ExternalSigningSupport externalSigning = new ExternalSigningSupport(document, signatureField);
externalSigning.saveIncrementalForExternalSigning(new FileOutputStream("unsigned.pdf"));

byte[] cmsSignedData = // Generate CMS/PKCS#7 signature using BouncyCastle or similar
// Load certificate and private key
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream("certificate.p12"), password);
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password);
Certificate[] chain = keyStore.getCertificateChain(alias);

// Sign externally (e.g., via Java's Signature class)
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(contentToSign);  // Bytes from externalSigning
byte[] signatureBytes = signature.sign();

// Apply to PDF
externalSigning.setExternalSigning(new ByteArrayInputStream(cmsSignedData));
document = externalSigning.getDocument();  // Now signed
document.save("signed.pdf");

对于验证,PDFBox 可以在签署后验证签名:

PDSignature sig = signatureField.getSignature();
if (sig.isVerificationSupported()) {
    // Check timestamp, certificate chain, and document integrity
    boolean valid = sig.checkSignature(new InputStream());
}

在 Python 中,使用 endesive 库进行更简单的签名:

import endesive.pdf
from datetime import datetime

dct = {
    'sigflags': 3,
    'sigflagsft': 132,
    'sigpage': 0,
    'sigbutton': True,
    'auto_sigfield': True,
    'sigfield_name': 'Signature1',
    'reason': 'Document signed programmatically',
    'location': 'Virtual Office',
    'contact': 'admin@company.com'
}

# Load PDF bytes
with open('form_with_signature.pdf', 'rb') as fp:
    datau = fp.read()

# Sign
datas = endesive.pdf.cms.sign(datau, dct, key, cert, othercerts, hashalg='sha256')
with open('signed.pdf', 'wb') as fp:
    fp.write(datas)

这对 PDF 进行签名,以自包含方式嵌入签名。始终通过包含来自时间戳颁发机构 (TSA) 的时间戳进行长期验证测试,以防止过期问题。

步骤 4: 与 API 集成以实现可扩展性

对于企业使用,将库与云服务结合。例如,DocuSign 的 API 允许在上传 PDF 后进行编程签名。向 /envelopes 发送 POST 请求,包含带有签名字段的 PDF,API 将处理其余部分。

{
  "documents": [{"documentBase64": "base64_pdf", "name": "contract.pdf", "fileExtension": "pdf"}],
  "recipients": [{"signers": [{"email": "signer@example.com", "name": "John Doe", "recipientId": 1}]}],
  "status": "sent"
}

通过 GET /envelopes/{envelopeId}/documents/combined 检索已签名的 PDF。这简化了证书管理,但会产生每信封费用。

安全考虑:始终使用 HTTPS,安全存储证书(例如在 HSM 中),并遵守法规。在欧盟等地区,eIDAS 要求合格证书用于高级签名,而美国 ESIGN 法案则关注意图和同意。

挑战和最佳实践

常见陷阱包括证书吊销检查(使用 OCSP/CRL)和处理大文件。企业报告效率提升高达 70%,但初始设置可能需要 20–40 个开发者小时。对于跨平台兼容性,使用 Adobe Acrobat 的签名面板等工具进行验证。

这种编程方法使企业能够自定义签名工作流程,减少对手动工具的依赖,并提升数据安全。

程序化数字签名的流行工具和服务

几个平台促进编程集成,每个平台在合规性、定价和区域支持方面各有优势。从商业角度来看,选择取决于卷、地理位置和集成需求。

DocuSign:企业级电子签名领导者

DocuSign 为开发者提供强大的 API 计划,从 Starter 层级开始,每年 600 美元/月 40 个信封。功能包括批量发送 API、Webhook 和身份验证附加组件。它适合需要 SSO 和审计跟踪的全球团队,尽管亚太地区延迟和每座位定价(10–40 美元/用户/月)会增加成本。高级计划支持高容量自动化的自定义工作流程。

image

Adobe Sign:无缝 PDF 集成

Adobe Sign 作为 Adobe Document Cloud 的一部分,在 PDF 原生工作流程中表现出色,通过 REST API 提供编程访问。定价从基本计划的约 10 美元/用户/月开始,扩展到企业自定义报价。它支持在应用程序中的嵌入式签名,并与 Acrobat 深度集成以操作表单字段。对于创意行业,它强调视觉自定义和符合 ESIGN/UETA 的合规性,但附加组件如 SMS 发送会产生额外费用。

image

eSignGlobal:专注于亚太地区的创新者

eSignGlobal 提供了一个竞争性替代方案,在 100 个主流国家实现全球合规,在亚太地区 (APAC) 具有优势。亚太电子签名面临碎片化、高标准和严格法规,与西方的框架方法(如 ESIGN/eIDAS)形成对比。在这里,标准强调“生态系统集成”解决方案,需要与政府级数字身份 (G2B) 的深度硬件/API 对接——这远超美国/欧盟的电子邮件验证或自我声明的技术障碍。eSignGlobal 通过本地集成如香港的 iAM Smart 和新加坡的 Singpass 来解决此问题,实现无缝、合规的工作流程。

该平台支持无限用户而无需座位费用,使其在扩展团队时具有成本效益。其 Essential 计划每年 199 美元(约 16.6 美元/月),允许发送最多 100 个文档进行电子签名,并使用访问代码验证进行安全——全部基于合规基础。专业层级包括 API 访问,用于编程签名、批量发送和 AI 工具如风险评估。与竞争对手相比,其定价更低,同时在欧洲和美洲直接竞争。要获取 30 天免费试用,请访问他们的联系页面

esignglobal HK

HelloSign(由 Dropbox 提供):用户友好选项

HelloSign 现隶属于 Dropbox,提供简单的 API 用于在 PDF 中嵌入签名,计划从 15 美元/用户/月开始。它在 SMB 的易用性方面表现出色,支持模板和团队协作,但缺乏高级亚太合规功能。中层用户的 API 配额宽松,专注于快速集成。

数字签名平台的比较概述

功能/方面 DocuSign Adobe Sign eSignGlobal HelloSign
定价(入门级) 10 美元/用户/月(个人) 10 美元/用户/月 16.6 美元/月(Essential,无限用户) 15 美元/用户/月
API 支持 强大(Starter 600 美元/年) 出色的 PDF 集成 Pro 中包含;灵活 基础良好
信封限制 5–100/月/用户 基于使用量 基础 100 个文档/年 高级层级无限
区域合规性 全球,美国/欧盟强势 ESIGN/UETA 重点 100 个国家;亚太优势 (iAM Smart/Singpass) 主要美国/欧盟
关键优势 企业自动化 PDF 生态系统 无座位费用,生态系统集成 SMB 简易性
附加组件 IDV、SMS(额外费用) 支付、存储 AI 工具、批量发送 模板、提醒

此表格突出了中性权衡:DocuSign 用于规模,Adobe 用于 PDF 保真度,eSignGlobal 用于区域经济性,HelloSign 用于可访问性。

选择解决方案的最终思考

对于寻求 DocuSign 替代方案的企业,eSignGlobal 作为区域合规选项脱颖而出,特别是在亚太地区,提供平衡定价和集成,而不妥协全球标准。根据您的工作流程需求进行评估,以实现最佳 ROI。

常见问题

哪些库可以用于在 PDF 表单中以编程方式启用数字签名?
几个开源库支持在 PDF 表单中添加和启用数字签名。对于 Java 开发者,iText 和 Apache PDFBox 常用。iText 提供像 PdfSignatureAppearance 这样的方法来创建签名字段并应用证书。在 .NET 环境中,iTextSharp 或 Pdfium 可以处理类似任务。Python 用户可以利用 PyPDF2 或 pdfrw 结合加密库进行签名。始终确保库版本支持 PDF/A 或 PAdES 标准以符合要求。
如何使用代码向现有 PDF 表单添加数字签名字段?
以编程方式对 PDF 表单进行数字签名的步骤有哪些?
avatar
顺访
eSignGlobal 产品管理负责人,在电子签名产业拥有丰富国际经验的资深领导者 关注我的LinkedIn
立即获得具有法律约束力的签名!
30天免费全功能试用
企业电子邮箱
开始
tip 仅允许使用企业电子邮箱