1

PDF ドキュメントに署名したい. CoSign API を使用する. コードは vb6 で書かれています. SAPI.SignetureFieldCreateSign (署名を作成し、ドキュメントに署名する) を使用する場合、このメソッドはすべて問題なければ 0 を返す必要がありますが、-1878850896 を返します。

私のコード:

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

'SAPI のインスタンス化と初期化

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

'ハンドル取得

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

'ログオン

'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

'清掃

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

サブ終了

4

1 に答える 1

2

Hex に変換すると「-1878850896」と表示されるエラーは 900302B0 です。このエラーを SAPI リファレンス ガイド (オンライン バージョンはhttp://www.arx.com/api - 正確な場所はこちら) で調べると、次のように表示されます。

SAPI_ERR_TOO_MANY_CERTS_TO_SELECT_FROM デフォルト証明書の取得に失敗しました。ユーザーは複数の証明書を持っており、SAPI はどれをデフォルトとして使用する必要があるかを判断できません。0x900302b0

これは、署名しようとしていた CoSign アカウントに複数の署名証明書が含まれており、SAPI コードで署名に使用するデフォルトの証明書を指定していないことを示しています。

アリ

于 2014-09-18T08:13:49.590 に答える