签名
福昕 PDF SDK iOS 版通过 Core SDK 提供了数字签名的创建、验证、删除和属性管理能力。通过数字签名,接收者可验证文档来源与内容是否被篡改。
UI Extensions 内置签名功能
如果您使用的是完整阅读器(UI Extensions),已内置数字签名模块(SignatureModule)用于签名和验证,无需额外编码。
默认支持的签名类型
SDK 内置默认签名回调,支持以下两种 filter/subfilter 组合,无需注册自定义回调:
Adobe.PPKLite+adbe.pkcs7.detachedAdobe.PPKLite+adbe.pkcs7.sha1
核心类
| 类 | 说明 |
|---|---|
FSSignature | 签名对象,管理签名的创建、签署、验证和属性。通过 [FSPDFPage addSignature:] 创建,通过 [FSPDFDoc getSignature:] 获取 |
摘要算法常量
| 常量 | 说明 |
|---|---|
FSSignatureDigestSHA1 | SHA-1 |
FSSignatureDigestSHA256 | SHA-256 |
FSSignatureDigestSHA384 | SHA-384 |
FSSignatureDigestSHA512 | SHA-512 |
签名键值常量
通过 setKeyValue:value: 设置签名信息:
| 常量 | 说明 |
|---|---|
FSSignatureKeyNameSigner | 签名人 |
FSSignatureKeyNameLocation | 签名地点 |
FSSignatureKeyNameReason | 签名原因 |
FSSignatureKeyNameContactInfo | 联系信息 |
FSSignatureKeyNameDN | 可辨别名称 |
FSSignatureKeyNameText | 自定义文本 |
外观标志位常量
通过 setAppearanceFlags: 控制签名外观中显示的信息:
| 常量 | 说明 |
|---|---|
FSSignatureAPFlagSigner | 显示签名人 |
FSSignatureAPFlagReason | 显示签名原因 |
FSSignatureAPFlagSigningTime | 显示签名时间 |
FSSignatureAPFlagDN | 显示 DN |
FSSignatureAPFlagLocation | 显示签名地点 |
FSSignatureAPFlagBitmap | 显示图片 |
FSSignatureAPFlagText | 显示自定义文本 |
示例:签署并验证
objc
#import <FoxitRDK/FSPDFObjC.h>
FSPDFDoc *doc = [[FSPDFDoc alloc] initWithPath:@"path/to/Sample.pdf"];
[doc load:nil];
FSPDFPage *page = [doc getPage:0];
// 添加签名域
FSRectF *rect = [[FSRectF alloc] initWithLeft1:100 bottom1:600 right1:300 top1:700];
FSSignature *signature = [page addSignature:rect];
// 设置外观
[signature setAppearanceFlags:
FSSignatureAPFlagSigner | FSSignatureAPFlagDN |
FSSignatureAPFlagReason | FSSignatureAPFlagSigningTime |
FSSignatureAPFlagLocation];
// 设置签名信息
[signature setKeyValue:FSSignatureKeyNameSigner value:@"张三"];
[signature setKeyValue:FSSignatureKeyNameLocation value:@"北京"];
[signature setKeyValue:FSSignatureKeyNameReason value:@"文档审批"];
[signature setFilter:@"Adobe.PPKLite"];
[signature setSubFilter:@"adbe.pkcs7.detached"];
// 签署
NSString *certPath = @"path/to/cert.pfx";
NSString *savePath = @"path/to/signed.pdf";
FSProgressive *progressive = [signature startSign:certPath
cert_password:@"123"
digest_algorithm:FSSignatureDigestSHA256
save_path:savePath
client_data:nil
pause:nil];
FSProgressState state = FSProgressiveToBeContinued;
while (state == FSProgressiveToBeContinued) {
state = [progressive resume];
}
// 验证已签署文档中的所有签名
FSPDFDoc *signedDoc = [[FSPDFDoc alloc] initWithPath:savePath];
[signedDoc load:nil];
int count = [signedDoc getSignatureCount];
for (int i = 0; i < count; i++) {
FSSignature *sig = [signedDoc getSignature:i];
if (!sig || [sig isEmpty]) continue;
FSProgressive *verifyProgress = [sig startVerify:nil pause:nil];
FSProgressState vState = FSProgressiveToBeContinued;
while (vState == FSProgressiveToBeContinued) {
vState = [verifyProgress resume];
}
unsigned int verifiedState = [sig getState];
if (verifiedState & FSSignatureStateVerifyValid) {
NSLog(@"签名 %d 有效", i);
}
}
API 参考
FSSignature 的完整接口说明请参阅 API 手册。