在电子文档处理中,数字签名是一种重要的安全措施,可用于验证 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 天的临时许可证。