Skip to content

签名

福昕 PDF SDK iOS 版通过 Core SDK 提供了数字签名的创建、验证、删除和属性管理能力。通过数字签名,接收者可验证文档来源与内容是否被篡改。

UI Extensions 内置签名功能

如果您使用的是完整阅读器(UI Extensions),已内置数字签名模块(SignatureModule)用于签名和验证,无需额外编码。

默认支持的签名类型

SDK 内置默认签名回调,支持以下两种 filter/subfilter 组合,无需注册自定义回调:

  • Adobe.PPKLite + adbe.pkcs7.detached
  • Adobe.PPKLite + adbe.pkcs7.sha1

核心类

说明
FSSignature签名对象,管理签名的创建、签署、验证和属性。通过 [FSPDFPage addSignature:] 创建,通过 [FSPDFDoc getSignature:] 获取

摘要算法常量

常量说明
FSSignatureDigestSHA1SHA-1
FSSignatureDigestSHA256SHA-256
FSSignatureDigestSHA384SHA-384
FSSignatureDigestSHA512SHA-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 手册