Подписание документов, расположенных в SharePoint, с помощью CoSign - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь использовать CoSign API для получения полей подписи и подписания документа docx, расположенного в SharePoint.

Я могу получить поток памяти или байтовый массив из файла SharePoint, используя байтовый массив I 'Мы создали объект FileHandler, но он возвращает поля подписи.

Я разместил вспомогательные методы, которые я использую ниже, FileHandle возвращает объект, но метод SAPI.SignatureFieldEnumInitEx возвращает 0 полей, проверяя документ с помощьюНадстройка SharePoint и пример кода возвращают 2 поля.Кажется, проблема заключается в байтовом массиве, который я отправляю, метод 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;
}

1 Ответ

0 голосов
/ 28 октября 2018

CoSign API не поддерживает использование потока памяти для DOCX (только PDF).Единственный вариант - сохранить поток памяти как временный файл, а затем вызвать методы SAPI с путем к файлу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...