# # 签名流程

本章节将向您详细介绍如何通过 `SignatureWorkflowService` 接口，控制 UIExtension 层的签名流程，以实现自定义签名流程的功能。通过该接口，开发者可以设置签名者覆盖策略、自定义签名以及验证流程等操作。

`SignatureWorkflowService` 是一个用于管理签名流程的服务类，提供了以下功能：

- 设置签名者覆盖策略：自定义签名者名称的显示方式。
- 自定义签名流程：覆盖默认的签名流程，使用自定义的签名设置。
- 自定义验证流程：覆盖默认的签名验证流程，使用自定义的验证逻辑。

## # 方法说明

### # `setSignerOverridePolicy(overridePolicy: SignerOverridePolicy): void`

设定签名者覆盖策略。如果此策略被设置，当用户点击已签名的签名字段以查看其属性时，查看器将会调用此策略。此策略允许您选择使用自定义的签名者名称来替换原有的签名者名称。

参数:

- `overridePolicy`: `SignerOverridePolicy` - 要设置的覆盖策略。

示例:

    const service = pdfui.getSignatureWorkflowService();
    service.setSignerOverridePolicy(async (field) => {
        // 实现逻辑以确定签名者
        return 'the signer';
    });

### # `overrideSigningWorkflow(signingWorkflowHandler: SigningWorkflowHandler): void`

覆盖所有签名字段的签名流程。如果您提供了一个签名回调，当用户点击签名字段进行签名时，Foxit PDF SDK for Web 将不再使用内置的签名 UI，而是调用您提供的回调函数，并将回调函数返回的签名设置用于签名。

开发者可以利用这个特性来实现自定义签名 UI 和流程，从而优化用户体验和签名过程。

参数:

- `signingWorkflowHandler`: `SigningWorkflowHandler` - 要调用的签名回调。

示例:

    const service = pdfui.getSignatureWorkflowService();
    service.overrideSigningWorkflow(async (field) => {
        // 实现逻辑以确定签名设置
        return {
            filter: 'Adobe.PPKLite',
            subfilter: 'adbe.pkcs7.detached',
            signer: 'Signer Name',
            distinguishName: '',
            location: '',
            reason: '',
            defaultContentsLength: 0,
            flag: 0,
            sign: async (signInfo: object, plainBuffer: ArrayBuffer) => {
                // 实现逻辑以签名文档
                return plainBuffer;
            }
        }
    });

### # `overrideVerifyWorkflow(verifyCallback: VerifyWorkflowHandler): void`

覆盖所有签名字段的验证流程。如果设置了自定义验证回调，将使用该回调来验证签名。

参数:

- `verifyCallback`: `VerifyWorkflowHandler` - 要调用的验证回调。

示例:

    const service = pdfui.getSignatureWorkflowService();
    service.overrideVerifyWorkflow(async (signature) => {
        // 实现逻辑以验证签名
        return 0;
    });

### # `verifySignature(signature: ISignatureField): Promise<number>`

验证给定的签名字段。如果设置了自定义验证回调，将使用该回调来验证签名。否则，将使用签名字段的内置验证方法。

参数:

- `signature`: `ISignatureField` - 要验证的签名字段。

返回值:

- `Promise<number>` - 返回一个解析验证结果的 Promise 对象。

## # 集成示例

以下是一个完整的使用示例，展示了如何使用 `SignatureWorkflowService` 来控制签名流程。通过以下方法，开发者可以灵活地控制签名流程，以满足各种自定义需求。

    const service = pdfui.getSignatureWorkflowService();

    // 设置签名者覆盖策略
    service.setSignerOverridePolicy(async (field) => {
        // 实现逻辑以确定签名者
        return 'the signer';
    });

    // 覆盖签名流程
    service.overrideSigningWorkflow(async (field) => {
        // 实现逻辑以确定签名设置
        return {
            filter: 'Adobe.PPKLite',
            subfilter: 'adbe.pkcs7.detached',
            signer: 'Signer Name',
            distinguishName: '',
            location: '',
            reason: '',
            defaultContentsLength: 0,
            flag: 0,
            sign: async (signInfo: object, plainBuffer: ArrayBuffer) => {
                // 实现逻辑以签名文档
                return plainBuffer;
            }
        }
    });

    // 覆盖验证流程
    service.overrideVerifyWorkflow(async (signature) => {
        // 实现逻辑以验证签名
        return 0;
    });

    // 验证签名
    const signatureField = ...; // 获取签名字段
    const result = await service.verifySignature(signatureField);
    console.log('Verification result:', result);