数字签名在确保 PDF 文档的真实性和完整性方面发挥着至关重要的作用。它们不仅能可靠地验证签署人的身份,还能确保文档在签名后未被篡改。利用数字签名,你可以显著提升文档的安全性和可信度。在本文中,我们将介绍如何使用 Spire.PDF for Python 和 Python 在 PDF 文件中添加和删除数字签名。
安装 Spire.PDF for Python
本教程需要 Spire.PDF for Python 和 plum-dispatch v1.7.4。您可以通过以下 pip 命令将它们轻松安装到 Windows 中。
pip install Spire.PDF
如果您不确定如何安装,请参考此教程: 如何在 Windows 中安装 Spire.PDF for Python
Python 给 PDF 添加数字签名
你可以使用 Spire.PDF for Python 提供的 PdfOrdinarySignatureMaker.MakeSignature(sigFieldName: str, page: PdfPageBase, x: float, y: float, width: float, height: float, signatureAppearance: IPdfSignatureAppearance) 方法给 PDF 文档的特定页面添加可见数字签名。详细步骤如下:
- 创建 PdfDocument 类的实例。
- 使用 PdfDocument.LoadFromFile() 方法加载 PDF 文档。
- 创建 PdfOrdinarySignatureMaker 实例,并将 PdfDocument 对象、证书(.pfx)文件路径和证书密码作为参数传递给该类的构造函数。
- 使用 PdfOrdinarySignatureMaker 类的属性设置签名详细信息,如签署人的姓名、联系信息、位置和签名原因。
- 为签名创建 PdfSignatureAppearance 实例,然后自定义签名标签并设置签名图片。
- 使用 PdfDocument.Pages[] 属性获取 PDF 文档中的特定页面。
- 使用 PdfOrdinarySignatureMaker.MakeSignature(sigFieldName: str, page: PdfPageBase, x: float, y: float, width: float, height: float, signatureAppearance: IPdfSignatureAppearance) 方法,将数字签名添加到页面的指定位置。
- 使用 PdfDocument.SaveToFile() 方法保存结果文档。
- Python
from spire.pdf.common import *
from spire.pdf import *
# 创建 PdfDocument 实例
doc = PdfDocument()
# 加载PDF文件
doc.LoadFromFile("测试.pdf")
# 创建 PdfOrdinarySignatureMaker 实例
signatureMaker = PdfOrdinarySignatureMaker(doc, "gary.pfx", "e-iceblue")
# 设置签名属性,如签署人的姓名、联系信息、位置和签名原因
signature = signatureMaker.Signature
signature.Name = "Gary"
signature.ContactInfo = "+86 12345678"
signature.Location = "中国"
signature.Reason = "我是文档作者"
# 创建 PdfSignatureAppearance 实例
appearance = PdfSignatureAppearance(signature)
# 为“签署人姓名”设置标签
appearance.NameLabel = "签署人:"
# 为“联系信息”设置标签
appearance.ContactInfoLabel = "电话:"
# 为“位置”设置标签
appearance.LocationLabel = "地址:"
# 为“签名原因”设置标签
appearance.ReasonLabel = "原因:"
# 设置签名图片
appearance.SignatureImage = PdfImage.FromFile("SigImg.png")
# 设置签名的图形渲染/显示模式(仅显示签名图片)
appearance.GraphicMode = GraphicMode.SignImageOnly
# 设置签名图片的布局
appearance.SignImageLayout = SignImageLayout.none
# 获取第一页
page = doc.Pages[0]
# 将签名添加到页面的指定位置
signatureMaker.MakeSignature("签名", page, 90.0, 650.0, 260.0, 100.0, appearance)
# 保存已签名的文档
doc.SaveToFile("数字签名.pdf")
doc.Close()
Python 给 PDF 添加不可见数字签名
PDF 中的不可见签名是一种特殊的数字签名,它提供了与可见数字签名相同的安全性,但在文档本身中不可见。使用 Spire.PDF for Python 的 PdfOrdinarySignatureMaker.MakeSignature(sigFieldName: str) 方法,你可以将不可见数字签名添加到 PDF 文档中。详细步骤如下:
- 创建 PdfDocument 类的实例。
- 使用 PdfDocument.LoadFromFile() 方法加载 PDF 文档。
- 创建 PdfOrdinarySignatureMaker 实例,并将 PdfDocument 对象、证书(.pfx)文件路径和密码作为参数传递给该类的构造函数。
- 使用 PdfOrdinarySignatureMaker.MakeSignature(sigFieldName: str) 方法将不可见数字签名添加到 PDF 文档中。
- 使用 PdfDocument.SaveToFile() 方法保存结果文档。
- Python
from spire.pdf.common import *
from spire.pdf import *
# 创建 PdfDocument 实例
doc = PdfDocument()
# 加载PDF文档
doc.LoadFromFile("测试.pdf")
# 创建 PdfOrdinarySignatureMaker 实例
signatureMaker = PdfOrdinarySignatureMaker(doc, "gary.pfx", "e-iceblue")
# 给文档添加不可见数字签名
signatureMaker.MakeSignature("签名")
# 保存已签名的文档
doc.SaveToFile("不可见签名.pdf")
doc.Close()
Python 删除 PDF 中的数字签名
要从 PDF 文档中删除数字签名,你需要遍历文档中的所有表单域,找到类型为 PdfSignatureFieldWidget 的表单域,然后将其从文档中删除。详细步骤如下:
- 创建 PdfDocument 类的实例。
- 使用 PdfDocument.LoadFromFile() 方法加载 PDF 文档。
- 使用 PdfDocument.Form 属性获取文档的表单域集合。
- 从后往前遍历表单域集合。
- 判断域是否为 PdfSignatureFieldWidget 对象。
- 如果结果为真,则使用 PdfFormFieldWidgetCollection.FieldsWidget.RemoveAt(index) 方法从文档中删除该域。
- 使用 PdfDocument.SaveToFile() 方法保存结果文档。
- Python
from spire.pdf.common import *
from spire.pdf import *
# 创建 PdfDocument 实例
doc = PdfDocument()
# 加载PDF文档
doc.LoadFromFile("数字签名.pdf")
# 获取文档中的表单域集合
pdfForm = doc.Form
formWidget = PdfFormWidget(pdfForm)
# 检查集合中是否有表单域
if formWidget.FieldsWidget.Count > 0:
# 从后往前遍历所有表单域
for i in range(formWidget.FieldsWidget.Count - 1, -1, -1):
field = formWidget.FieldsWidget[i]
# 检查域是否为PdfSignatureFieldWidget
if isinstance(field, PdfSignatureFieldWidget):
# 删除域
formWidget.FieldsWidget.RemoveAt(i)
# 保存文档
doc.SaveToFile("删除签名.pdf")
doc.Close()
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。