如何用Python验证PDF数字签名并提取元信息与签名者姓名?
Python提取PDF数字签名及元信息方案
当然有合适的Python库能帮你完成这项工作!不用局限于Java的iText,我给你推荐几个实用的选项,完全可以复刻Adobe Acrobat提取证书信息和PDF元数据的功能:
1. PyPDF2
这是一个广泛使用的PDF处理库,支持提取数字签名信息和PDF元数据,上手简单。
安装
pip install PyPDF2
示例代码
from PyPDF2 import PdfReader from cryptography import x509 from cryptography.hazmat.backends import default_backend # 加载目标PDF文件 reader = PdfReader("你的签名文档.pdf") # 提取PDF元信息(标题、作者、创建日期等) print("=== PDF元信息 ===") metadata = reader.metadata for key, value in metadata.items(): print(f"{key}: {value}") # 提取数字签名及签名者信息 if reader.has_signatures: print("\n=== 数字签名信息 ===") for signature in reader.signatures: # 尝试从签名字典中直接获取姓名 signer_name = signature.get("/Name", "未直接标注姓名") # 如果有证书数据,解析证书获取更准确的签名者姓名 cert_data = signature.get("/Cert") if cert_data: try: cert = x509.load_der_x509_certificate(cert_data, default_backend()) # 从证书主题中提取通用名称(即签名者姓名) common_name = cert.subject.get_attributes_for_oid(x509.NameOID.COMMON_NAME)[0].value signer_name = common_name except Exception as e: print(f"解析证书出错: {e}") print(f"签名者姓名: {signer_name}") print(f"签名日期: {signature.get('/M', '未知')}") print("---") else: print("\n该PDF未包含数字签名")
2. PyMuPDF(fitz)
这个库以高效著称,不仅能处理PDF元数据,也能快速提取签名信息,API设计更简洁。
安装
pip install pymupdf
示例代码
import fitz # PyMuPDF的别名 # 打开PDF文档 doc = fitz.open("你的签名文档.pdf") # 提取PDF元信息 print("=== PDF元信息 ===") metadata = doc.metadata for key, value in metadata.items(): print(f"{key}: {value}") # 提取数字签名信息 signatures = doc.get_signatures() if signatures: print("\n=== 数字签名信息 ===") for sig in signatures: print(f"签名者姓名: {sig.get('name', '未知')}") print(f"签名日期: {sig.get('date', '未知')}") print(f"签名类型: {sig.get('type', '未知')}") print("---") else: print("\n该PDF未包含数字签名")
补充说明
- 这两个库都是直接解析PDF的内部结构和签名数据,完全不需要计算机视觉技术,和Adobe Acrobat的处理逻辑一致。
- 如果需要验证签名的有效性(不仅仅是提取信息),也可以基于这些库结合
cryptography库做进一步的证书链验证。
内容的提问来源于stack exchange,提问作者Brorx




