Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Наши способы организации безопасного удалённого доступа к рабочим местам и корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline terehov  
#1 Оставлено : 9 апреля 2021 г. 10:54:46(UTC)
terehov

Статус: Участник

Группы: Участники
Зарегистрирован: 03.09.2014(UTC)
Сообщений: 10
Российская Федерация
Откуда: Саратов

Доброго дня!

Исходные данные
Windows 10
Adobe Acrobat XI Pro
КриптоПро PDF последняя версия
КриптоПро CSP 4.0.9963

Пытаюсь из 1С подписать PDF файл, не видимая подпись устанавливается на ура, хочу установить видимую по ФЗ-63.
Для этого я обернул типовую функцию в скрипте на свою следующим образом

function AddSignature(certificateHEX, pin, pdfLockMode, signReason, signLocation, signContactInfo, timeStamp, bShowCertificatesDialog, bShowSignDialogs,pageNumber,LeftDownX,LeftUPY,RightUpX,RightDownY,logoFile,cadesType)
{
var myAppearance =
{
pageNumber: pageNumber,
coords: [LeftDownX, LeftUPY, RightUpX, RightDownY],
customAppearance:
{
appearanceType: 4,
logoFile: logoFile
}
};

return CPSign (certificateHEX, pin, pdfLockMode, signReason, signLocation, signContactInfo, timeStamp, bShowCertificatesDialog, bShowSignDialogs, myAppearance, cadesType);
}

При попытке установить подпись происходит исключение
Произошла исключительная ситуация (Acrobat JavaScript): TypeError: theDoc.getField is not a function

Проверяю это следующим образом
Функция СоздатьПолеПодписи(jso,error)

//*------ задаем параметры поля sigField, в котором будет размещаться наша подпись
inch = 72;
box = jso.getPageBox();
box.SetValue(0, box.GetValue(0) + 0.5*inch);
box.SetValue(2, box.GetValue(0) + 2*inch);
box.SetValue(1, box.GetValue(1) - 0.5*inch);
box.SetValue(3, box.GetValue(1) - 0.5*inch);
//*--------------------------------------------------------------------------------
попытка
sigField = jso.addField("Sig_pdf","signature", 0, box); //устанавливаем поле на форму документа
Исключение
jso.ResetForm();
error = "Не удалось подписать документ. Не удалось добавить поле подписи";
jso.closeDoc();
gPDDoc = Неопределено;
jso = Неопределено;
Возврат Неопределено;
КонецПопытки;

Возврат sigField;

КонецФункции

После установки пытаюсь считать
sigField = jso.getField("Sig_pdf");
и получаю такую же ошибку, при этом поле в документе установилось

Произошла исключительная ситуация (Acrobat JavaScript): TypeError: theDoc.getField is not a function

кто знает как это побороть ???

Отредактировано пользователем 9 апреля 2021 г. 10:59:06(UTC)  | Причина: Не указана

Offline two_oceans  
#2 Оставлено : 9 апреля 2021 г. 11:37:29(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,219
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 80 раз
Поблагодарили: 285 раз в 269 постах
Добрый день.
Точного ответа мне не известно, но по описанию наводит на мысль, что некое исключение происходит по другой причине, но при обработке исключения Вы закрываете документ и уничтожаете переменную, а потом пытаетесь снова к ней обратиться и конечно функции после уничтожения уже нет. После чего новое исключение об отсутствии функции перебивает информацию о старом исключении (в смысле, старое уже отмечено как обработанное).
Можно либо не уничтожать объект внутри функции либо проверять после возврата из функции "а существует ли объект".

Цитата:
pageNumber: pageNumber,
logoFile: logoFile
На проблему это наверно не влияет, но такого я тоже стараюсь избегать - например, дать разные имена или заключить имя поля в кавычки.

Отредактировано пользователем 9 апреля 2021 г. 11:43:14(UTC)  | Причина: Не указана

Offline terehov  
#3 Оставлено : 9 апреля 2021 г. 12:03:17(UTC)
terehov

Статус: Участник

Группы: Участники
Зарегистрирован: 03.09.2014(UTC)
Сообщений: 10
Российская Федерация
Откуда: Саратов

Цитата:
На проблему это наверно не влияет, но такого я тоже стараюсь избегать - например, дать разные имена или заключить имя поля в кавычки.


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

Сейчас сношу 11 Adobe pro и покупаю DC, попробую на нем. По результату отпишусь
Offline terehov  
#4 Оставлено : 9 апреля 2021 г. 13:20:49(UTC)
terehov

Статус: Участник

Группы: Участники
Зарегистрирован: 03.09.2014(UTC)
Сообщений: 10
Российская Федерация
Откуда: Саратов

Итак ситуация прежняя Adobe DC не сильно проясняет ситуацию по ошибке

Ошибка при создании поля для подписи. theDoc.getField is not a functionВозможно изменения в документе запрещены.

UPD. Попробовал самостоятельно создать поле подписи и все прошло на ура, даже неоткрывая файл как ранее, в общем перепишу исходный скрипт под себя

UPD2. Я не спец по JS и методам Adobe но похоже что оно и не должно работать так как я хочу, так как я уже открыл документ методом
gPDDoc = Новый COMОбъект("AcroExch.PDDoc");
ПФ = gPDDoc.Open(Объект.ПодписываемыйФайл);

и пытаюсь обратиться к методам форм, интерактивно открытого документа, что не совсем кооректно, так как в скрипте я по сути еще раз пытаюсь "открыть" документ


var theDoc = this;
signatureField = theDoc.getField(signatureFieldName);


в общем надо немного переписать под себя

Отредактировано пользователем 9 апреля 2021 г. 13:40:46(UTC)  | Причина: Не указана

Offline terehov  
#5 Оставлено : 9 апреля 2021 г. 14:42:13(UTC)
terehov

Статус: Участник

Группы: Участники
Зарегистрирован: 03.09.2014(UTC)
Сообщений: 10
Российская Федерация
Откуда: Саратов

Так в общем я почти разобрался с тем что был не прав, и у меня сейчас при подписании возникает следующая ошибка

Документ не подписан. Не удалось выполнить операцию. Невозможно вычислить подпись.---[0xC2100121]Не задан адрес службы штампов времени

В итоге вот мой код, скрипт находиться в исходном состоянии

error ="";
ФайлСертификатаДД = Новый ДвоичныеДанные(Объект.ФайлСертификата);
ФайлСертификата = ПолучитьHexСтрокуИзДвоичныхДанных(ФайлСертификатаДД);
gApp = Новый COMОбъект("AcroExch.App");
gPDDoc = Новый COMОбъект("AcroExch.PDDoc");
ПФ = gPDDoc.Open(Объект.ПодписываемыйФайл);
Если ПФ = Истина Тогда
jso = gPDDoc.GetJSObject(); // подключаемся к внутренним методам JS

МассивКоординат = новый Массив;
МассивКоординат.Добавить(100);
МассивКоординат.Добавить(100);
МассивКоординат.Добавить(200);
МассивКоординат.Добавить(100);

СтруктураПодписи = Новый Структура("pageNumber,coords,appearanceFilter",0,МассивКоординат,"Test");


ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = ЛОЖЬ;
ЗаписьJSON.УстановитьСтроку();

ЗаписатьJSON(ЗаписьJSON, СтруктураПодписи);
СтрокаJSON = ЗаписьJSON.Закрыть();
Результат = jso.CPSign(ФайлСертификата,"12345678",0,"","","","http://tax4.tensor.ru/tsp-tensor_gost2012/tsp.srf",Ложь,ЛОЖЬ,СтрокаJSON,5);
gPDDoc.Save(1,Объект.ПодписываемыйФайл);
gApp.Exit();
КонецЕсли;

Адрес штампа времени я указал, хотя в настройках подписи галка показывать время убрана.

но стакими параметрами подпись просто неустанавливается

PS разобрался, все работает

Отредактировано пользователем 9 апреля 2021 г. 17:33:45(UTC)  | Причина: Не указана

Offline two_oceans  
#6 Оставлено : 12 апреля 2021 г. 6:29:03(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,219
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 80 раз
Поблагодарили: 285 раз в 269 постах
Цитата:
Если ПФ = Истина Тогда
Если уж позволите попридираться, это выражение не совсем корректно, так как:
1) "= Истина" никто не пишет (в любом языке программирования), если полагаться на неявное преобразование типов в логическому, сработает и без него
Цитата:
Если ПФ Тогда
Другое дело, если бы там была операция тождественности (но это как раз отключит неявное преобразование типов, так что не подходит в этом случае).
2) в данном случае такое сравнение с Истиной вообще не охватывает все ситуации, так как Объектный тип может принимать значение и пустое IsNull и неопределенное IsNothing, которые оба преобразуются в Ложь (а теоретически при сбое может вернуться вообще не объект, а скажем мусор из памяти дающий Истину), то есть более корректно проверять что тип переменной объект и потом отрицание состояний IsNull IsNothing.
Offline terehov  
#7 Оставлено : 12 апреля 2021 г. 9:37:31(UTC)
terehov

Статус: Участник

Группы: Участники
Зарегистрирован: 03.09.2014(UTC)
Сообщений: 10
Российская Федерация
Откуда: Саратов

Автор: two_oceans Перейти к цитате
Цитата:
Если ПФ = Истина Тогда
Если уж позволите попридираться, это выражение не совсем корректно, так как:
1) "= Истина" никто не пишет (в любом языке программирования), если полагаться на неявное преобразование типов в логическому, сработает и без него
Цитата:
Если ПФ Тогда
Другое дело, если бы там была операция тождественности (но это как раз отключит неявное преобразование типов, так что не подходит в этом случае).
2) в данном случае такое сравнение с Истиной вообще не охватывает все ситуации, так как Объектный тип может принимать значение и пустое IsNull и неопределенное IsNothing, которые оба преобразуются в Ложь (а теоретически при сбое может вернуться вообще не объект, а скажем мусор из памяти дающий Истину), то есть более корректно проверять что тип переменной объект и потом отрицание состояний IsNull IsNothing.


Спасибо учту, но это не существенно по сравнению с тем что мне стало выдавать сегодня

Вызываю подписание строкой
Результат = jso.CPSign(ФайлСертификата,"12345678",1,,,,"http://tax4.tensor.ru/tsp-tensor_gost2012/tsp.srf",Ложь,ЛОЖЬ,СтрокаJSON,5);

СтрокаJSON

Код:
{
"pageNumber": 1,
"coords": [
10,
10,
20,
10
],
"customAppearance": {
"appearanceType": 4,
"logoFile": "C:\\Users\\Виталий\\Desktop\\logo.JPG"
}
}



в ответ Документ не подписан. Не удалось выполнить операцию. Длина подписи превышает допустимый размер.

PS. Ругаться перестал, но и видимую подпись ставить тоже(((( ставит обычную невидимую

Отредактировано пользователем 12 апреля 2021 г. 9:47:49(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.