使用 CoSign 签署位于 SharePoint 中的文档

Signing documents located in SharePoint with CoSign

我正在尝试使用 CoSign API 获取签名字段并签署位于 SharePoint 中的 docx 文档。

我可以使用字节数组从 SharePoint 文件中获取内存流或字节数组我创建了一个 FileHandler 对象,但它 returns 符号字段。

我在下面发布了我正在使用的辅助方法,FileHandle returns 一个对象但是 SAPI.SignatureFieldEnumInitEx 方法 returns 0 个字段,使用 SharePoint 添加检查文档-in 和示例代码 returns 2 个字段。问题似乎出在我发送的 byteArray 上,打开文档的 item.File.OpenBinary() 方法似乎不正确。

using (SPSite site = new SPSite("http://sharepointweburl"))
    {
        using (SPWeb web = site.OpenWeb())
        {
            SPList documents = web.Lists["Documents"];
            SPListItem item = documents.GetItemById(8);
            Console.WriteLine("Item: {0}", item.Name);
            var binaryFile = item.File.OpenBinary();

            var handle = DocuSign.GetFileHandleFromStream(binaryFile);
            var fields = DocuSign.GetSignatureFieldsFromHandle(handle);
        }
    }

public static FileHandle GetFileHandleFromStream(byte[] byteArray)
{
    FileHandle fileHandle = null;
    var sapiByteArray = new SAPIByteArray();
    sapiByteArray.FromArray(byteArray);
    SAPIContext ctxSigField = new SAPIContextClass();
    SAPI.CreateFileHandleByMem(out fileHandle, SAPI_ENUM_FILE_TYPE.SAPI_ENUM_FILE_OFFICE_XML_PACKAGE, 0, sapiByteArray);
    return fileHandle;
}

public static DOCXField[] GetSignatureFieldsFromHandle(FileHandle fileHandle)
{
    SAPIContext ctxSigField = new SAPIContextClass();
    int rc;
    int NumOfFields = 0;
    rc = SAPI.SignatureFieldEnumInitEx(
        hSession,
        ctxSigField,
        SAPI_ENUM_FILE_TYPE.SAPI_ENUM_FILE_OFFICE_XML_PACKAGE,
        "",
        fileHandle,
        0,
        ref NumOfFields
        );
    DOCXField[] fields = new DOCXField[NumOfFields];
    Console.WriteLine("Found {0} signature fields", NumOfFields);
    for (int i = 0; i < NumOfFields; i++)
    {
        fields[i] = new DOCXField();
        //Get Signature Field Handle
        rc = SAPI.SignatureFieldEnumCont(hSession, ctxSigField, out fields[i].hSigField);
        if (rc != 0) throw new Exception("Failed in SignatureFieldEnumCont (" + rc.ToString("X") + ")");

        //Get Signature Field Details
        rc = SAPI.SignatureFieldInfoGet(
            hSession,
            fields[i].hSigField,
            fields[i].sSettings,
            fields[i].sInfo);

        if (rc != 0) throw new Exception("Failed in SignatureFieldInfoGet (" + rc.ToString("X") + ")");
    }
    SAPI.ContextRelease(ctxSigField);
    return fields;
}

CoSign API 不支持对 DOCX(仅 PDF)使用内存流。唯一的选择是将内存流保存为临时文件,然后使用文件路径调用 SAPI 方法。