Статус: Участник
Группы: Участники
Зарегистрирован: 19.09.2019(UTC) Сообщений: 28 Откуда: МСК
|
Код взят с поста на форуме и переписан. Функция создания подписи для документа: Код:
Uses Soap.Win.CertHelper, {описание структур для ЭЦП}
Acrobat_TLB; {для подписи PDF, появляется в списке Type Library после установки Adobe Acrobat DC}
Function CreateDigitalSignature(const FileNameIn,FileNameOut:string; pCert:PCERT_CONTEXT):WideString;
Var
I: Integer;
AVDoc: CAcroAVDoc;
PDDoc: CAcroPDDoc;
jso: Variant{IDispatch};
CertificateHEX,pin:string;
pdfLockMode:Integer;
signReason,signLocation,signContactInfo,timeStamp: string;
bShowCertificatesDialog,bShowSignDialogs: Boolean;
// gApp: CAcroApp;
Begin
Result:='';
if Assigned(pCert) then
if FileExists(FileNameIn) then
Begin
{
//Не понятно зачем эта часть кода так как она дальше не используется:
//единственное что в голову пришло чтобы посмотреть настройки программы Acrobat Reader.
gApp := CoAcroApp.Create;
gApp.Show;
}
AVDoc:= CoAcroAVDoc.Create;
if AVDoc.Open(FileNameIn,FileNameOut) then
begin
PDDoc:=AVDoc.GetPDDoc as CAcroPDDoc;
jso:=PDDoc.GetJSObject;
// 1. certificateHEX String. Обязательный параметр. Массив байт сертификата, используемого для создания ЭП, в
// виде строки шестнадцатеричных цифр. Сертификат должен быть установлен в хранилище «Личные»
// текущего пользователя и иметь ссылку на закрытый ключ.
CertificateHEX:=CertificateToHEX(pCert);
// 2. pin String. PIN-код для доступа к закрытому ключу.
pin:='...';
// 3. pdfLockMode Numeric. Число, характеризующее тип создаваемой
// подписи и действия, разрешенные с документом после подписания:
// 0 - обычная подпись, изменения разрешены;
// 1 - обычная подпись, документ заблокирован;
// 2 - сертифицирующая подпись, изменения запрещены;
// 3 - сертифицирующая подпись, разрешается заполнение полей форм и создание ЭП;
// 4 - сертифицирующая подпись, разрешается добавление комментариев,
// заполнение полей форм и создание ЭП.
pdfLockMode:=1;
// 4. signReason String. Причина подписи.
signReason:='signReason:причина подписи';
// 5. signLocation String Местоположение.
signLocation:='signLocation:Москва';
// 6. signContactInfo String. Контактная информация.
signContactInfo:='signContactInfo:Контактная информация';
// 7. timeStamp String. URL службы штампов времени. Если данный
// параметр задан, то будет сделана усовершенствованная подпись.
timeStamp:='http://qs.cryptopro.ru/tsp/tsp.srf';
// 8. bShowCertificatesDialog Boolean. Флаг, указывающий будут ли отображены
// диалог со списком сертификатов и диалог для ввода ПИН-кода.
bShowCertificatesDialog:=False;
// 9. bShowSignDialogs Boolean Флаг, указывающий будут ли отображены
// диалог с параметрами подписи и диалог для сохранения файла.
bShowSignDialogs:=False;
// 10. appearance Object. Объект, определяющий параметры поля
// подписи и его содержимое.
// Если параметр не задан, то будет создана невидимая подпись.
// Как корректно описать данный объект я не понял вопросы по нему будут ниже.
// НА текущий момент считаем что appearance=''.
Result:=jso.CPSign(certificateHEX,
pin,
pdfLockMode,
signReason,
signLocation,
signContactInfo,
timeStamp,
bShowCertificatesDialog,
bShowSignDialogs,
''
);
end;
End
else Result:=Format('Файл не найден: [%s]',[FileNameIn])
else Result:=Format('Адрес сертификата не найден: [%p]',[pCert]);
Отредактировано пользователем 20 июля 2022 г. 18:05:58(UTC)
| Причина: Не указана
|