在电子文档处理中,数字签名是一种重要的安全措施,可用于验证 PDF 文件的真实性和完整性。通过验证数字签名,可以确认签名是否有效,以及文档是否被篡改。此外,提取数字签名信息如签名图片,可用于进一步分析或存档。了解如何验证和提取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
验证 PDF 数字签名
Spire.PDF for Python 提供了 PdfDocument.VerifySignature(signName: str) 方法,用于检查 PDF 文档中数字签名的有效性。具体步骤如下:
- 创建 PdfDocument 类的对象。
- 使用 PdfDocument.LoadFromFile() 方法加载 PDF 文件。
- 通过 PdfDocument.Form 属性获取 PDF 文件的表单。
- 遍历表单中的所有域并查找签名域。
- 使用 PdfSignatureFieldWidget.FullName 属性获取签名域的名称。
- 使用 PdfSignature.VerifySignature(signName: str) 方法验证签名的有效性。
- Python
from spire.pdf.common import *
from spire.pdf import *
# 加载PDF文档
doc = PdfDocument()
doc.LoadFromFile("签名.pdf")
# 访问文档中的表单
pdfform = doc.Form
formWidget = PdfFormWidget(pdfform)
# 检查表单中是否有域
if formWidget.FieldsWidget.Count > 0:
# 遍历表单中的所有域
for i in range(formWidget.FieldsWidget.Count):
field = formWidget.FieldsWidget.get_Item(i)
# 检查域是否为PdfSignatureFieldWidget
if isinstance(field, PdfSignatureFieldWidget):
# 将域转换为PdfSignatureFieldWidget实例
signatureField = PdfSignatureFieldWidget(field)
# 获取签名域的完整名称
fullName = signatureField.FullName
# 验证签名
valid = doc.VerifySignature(fullName)
# 根据验证结果确定签名状态
if valid:
print("签名有效")
else:
print("签名无效")
doc.Close()
检测签名 PDF 是否已被修改
要确定 PDF 文档在签署后是否被修改,可以使用 Security_PdfSignature.VerifyDocModified() 方法。此方法返回布尔值:True 表示文档已被修改,签名无效;False 表示文档自签署以来未被修改。具体步骤如下:
- 创建 PdfDocument 类的对象。
- 使用 PdfDocument.LoadFromFile() 方法加载 PDF 文件。
- 通过 PdfDocument.Form 属性获取 PDF 文件的表单。
- 遍历表单中的所有域并查找签名域。
- 使用 PdfSignatureFieldWidget.Signature 属性获取签名。
- 使用 Security_PdfSignature.VerifyDocModified() 方法验证文档自签署以来是否已被修改。
- Python
from spire.pdf.common import *
from spire.pdf import *
# 加载PDF文档
doc = PdfDocument()
doc.LoadFromFile("签名.pdf")
# 访问文档中的表单
pdfform = doc.Form
formWidget = PdfFormWidget(pdfform)
# 检查表单中是否有域
if formWidget.FieldsWidget.Count > 0:
# 遍历表单中的所有域
for i in range(formWidget.FieldsWidget.Count):
field = formWidget.FieldsWidget.get_Item(i)
# 检查域是否为PdfSignatureFieldWidget
if isinstance(field, PdfSignatureFieldWidget):
# 将域转换为PdfSignatureFieldWidget实例
signatureField = PdfSignatureFieldWidget(field)
# 获取签名
signature = signatureField.Signature
# 验证文档自签署以来是否已被修改
modified = signature.VerifyDocModified()
# 根据验证结果确定文档状态
if modified:
print("文档已被修改")
else:
print("文档未被修改")
doc.Close()
提取 PDF 中的签名图片
Spire.PDF for Python 还提供了 PdfFormWidget.ExtractSignatureAsImages 属性,支持提取 PDF 文档中的所有签名图片。具体步骤如下:
- 创建 PdfDocument 类的对象。
- 使用 PdfDocument.LoadFromFile() 方法加载 PDF 文件。
- 通过 PdfDocument.Form属性获取 PDF 文件的表单。
- 使用 PdfFormWidget.ExtractSignatureAsImages 属性从表单中提取签名图片。
- 将提取的图片保存为图片文件。
- Python
from spire.pdf.common import *
from spire.pdf import *
# 加载PDF文档
doc = PdfDocument()
doc.LoadFromFile("签名.pdf")
# 访问文档中的表单
pdfform = doc.Form
formWidget = PdfFormWidget(pdfform)
i = 0
# 从表单中提取签名图片并保存为文件
for image in formWidget.ExtractSignatureAsImages:
filename = "Signature/" + f"Signature-{i}.png"
# 将图片保存为文件
image.Save(filename)
i = i + 1
doc.Close()
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。