2014-09-17 3 views
1

Я хочу подписать документ PDF, я использую API CoSign, код написан на vb6. Когда я использую SAPI.SignetureFieldCreateSign (создаю подпись и подписываюсь в документе), этот метод должен возвращать 0, если все нормально, но возвращает -1878850896. В чем проблема?cosign - api: ошибка при вызове SignetureFieldCreateSign

Мой код:

Private Sub SignPDF() 

'Пользовательские значения

Dim rc As Integer 
Dim SAPI As New SAPICrypt 
Dim SESHandle As New SESHandle 
Dim SFS As New SAPILib.SigFieldSettings 
Dim TF As New SAPILib.timeFormat 
Dim fileType As SAPI_ENUM_FILE_TYPE 
Dim objFSO As FileSystemObject 
Dim objFile As File 
Dim objFolder As Folder 

Dim strFolderPath As String 
Dim flags As Integer 
Dim filePath As String 'PDF file to sign 
Dim username As String 'CoSign account username 
Dim password As String 'CoSign account password 
Dim domain As String 'CoSign account domain 
Dim sigPageNum As Integer 'Create signature on the first page 
Dim sigX As Integer 'Signature field X location 
Dim sigY As Integer 'Signature field Y location 
Dim sigWidth As Integer 'Signature field width 
Dim sigHeight As Integer 'Signature field height 
Dim timeFormat As String 'The display format of the time 
Dim dateFormat As String 'The display format of the date 
Dim appearanceMask As Integer 'Elements to display on the signature field 


'Initialize variables 
fileType = SAPI_ENUM_FILE_TYPE.SAPI_ENUM_FILE_ADOBE 'Type of the file to sign - PDF 
flags = 0 
strFolderPath = "C:\Users\jennya\Desktop\pdfFiles\" 
username = "MyUsername" 
password = "MyPassword" 
domain = "" 
sigPageNum = 1 
sigX = 145 
sigY = 125 
sigWidth = 160 
sigHeight = 45 
timeFormat = "hh:mm:ss" 
dateFormat = "dd/MM/yyyy" 
appearanceMask = SAPI_ENUM_DRAWING_ELEMENT.SAPI_ENUM_DRAWING_ELEMENT_GRAPHICAL_IMAGE Or _ 
       SAPI_ENUM_DRAWING_ELEMENT.SAPI_ENUM_DRAWING_ELEMENT_SIGNED_BY Or _ 
       SAPI_ENUM_DRAWING_ELEMENT.SAPI_ENUM_DRAWING_ELEMENT_TIME 

' Instantiate и Init SAPI

'Initialize SAPI library 
rc = SAPI.Init 
If rc <> SAPI_OK Then 
    MsgBox "error initializing SAPI", vbOKOnly, "Error" 
    'Exit Sub 
End If 

«HandleAcquire

'Acquire SAPI session handle 
rc = SAPI.HandleAcquire(SESHandle) 
If rc <> SAPI_OK Then 
    MsgBox "Failed in SAPIHandleAcquire" 
End If 

'Logon

'Personalize SAPI Session 
rc = SAPI.Logon(SESHandle, username, domain, password) 
If rc <> SAPI_OK Then 
    MsgBox "Failed to authenticate user" 
End If 

' Определение настройки поля подписи

'Define signature field settings 
SFS.Page = sigPageNum 
SFS.x = sigX 
SFS.y = sigY 
SFS.Width = sigWidth 
SFS.Height = sigHeight 
SFS.appearanceMask = appearanceMask 
SFS.SignatureType = SAPI_ENUM_SIGNATURE_TYPE.SAPI_ENUM_SIGNATURE_DIGITAL 
SFS.DependencyMode = SAPI_ENUM_DEPENDENCY_MODE.SAPI_ENUM_DEPENDENCY_MODE_INDEPENDENT 
TF.dateFormat = dateFormat 
TF.timeFormat = timeFormat 
TF.ExtTimeFormat = SAPI_ENUM_EXTENDED_TIME_FORMAT.SAPI_ENUM_EXTENDED_TIME_FORMAT_GMT 'Display GMT offset 
SFS.timeFormat = TF 

'Подписание

Set objFSO = New FileSystemObject 'creates a new File System Object reference 

If objFSO.FolderExists(strFolderPath) Then 'check if Source folder exists 
    Set objFolder = objFSO.GetFolder(strFolderPath) 'get Source folder 
    For Each objFile In objFolder.Files 'for every file in the folder. 

     filePath = objFile.Path 

     'Create and sign a new signature field in the document 
     rc = SAPI.SignatureFieldCreateSign(SESHandle, fileType, filePath, SFS, flags, "") 
     If rc <> SAPI_OK Then 
      MsgBox "Failed in SAPISignatureFieldCreateSign" 
     End If 
    Next 
Else 
    MsgBox "Folder not exists" 
End If 

' Очистка Up

'Release user context 
rc = SAPI.Logoff(SESHandle) 
If rc <> SAPI_OK Then 
    MsgBox "Failed to Logoff" 
End If 
SAPI.Finalize 

End Sub

Thenks.

ответ

2

Ошибка при использовании «-1878850896» при преобразовании в Hex составляет 900302B0. Если вы смотрите эту ошибку в справочном руководстве SAPI (вы можете найти онлайн-версию под: http://www.arx.com/api - см точное местоположение here) вы найдете следующее:

SAPI_ERR_TOO_MANY_CERTS_TO_SELECT_FROM Не удалось получить сертификат по умолчанию. У пользователя есть несколько сертификатов, и SAPI не может определить, какой из них следует использовать по умолчанию. 0x900302b0

Это означает, что учетная запись CoSign, с которой вы пытались подписать, содержит больше одного сертификата подписи, а в коде SAPI вы не указали сертификат по умолчанию для использования.

Ari

Смежные вопросы