使用 CoSign 对位于 SharePoint 中的文档进行签名



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

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

我已经在下面发布了我正在使用的帮助程序方法,FileHandle 返回一个对象,但 SAPI。SignatureFieldEnumInitEx 方法返回 0 个字段,使用 SharePoint 加载项检查文档,示例代码返回 2 个字段。问题似乎出在我发送的字节数组中,该项目。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 方法。

最新更新