powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Взаимодействие Delphi c КриптоПро PDF
11 сообщений из 11, страница 1 из 1
Взаимодействие Delphi c КриптоПро PDF
    #39989120
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача: В Delphi подписать PDF видимой ЭЦП. Почитав мануалы, темы, написал следующее:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
uses OleServer, Acrobat_TLB, OleCtrls, ComObj, QStrings;

type
  PAppearance = ^TAppearance;
  TAppearance = record
    pageNumber: Integer;
    coords: array[0..3] of integer;
    appearanceFilter: string;
  end;

function BytesToHex(Value: PAnsiChar; Count: Integer): string;
var
  i: Integer;
begin
  Result := '';
  for i := 0 to Count - 1 do
  begin
    Result := Result + IntToHex(Byte(Value[i]), 2);
  end;
end;

function GetCertificate(Cert: PCCERT_CONTEXT): string;
var
  certValue: string;
begin
  SetLength(certValue, Cert.pCertInfo.SubjectPublicKeyInfo.PublicKey.cbData);
  system.Move(Cert.pCertInfo.SubjectPublicKeyInfo.PublicKey.pbData^, Pointer(certValue)^, Cert.pCertInfo.SubjectPublicKeyInfo.PublicKey.cbData);
  Result := BytesToHex(PAnsiChar(certValue), Cert.pCertInfo.SubjectPublicKeyInfo.PublicKey.cbData);
end;

procedure SignPDF;
var
  gApp: CAcroApp;
  PDDoc: CAcroPDDoc;
  AVDoc: CAcroAVDoc;
  jso: Variant;
  Appearance: PAppearance;
begin
  gApp := CoAcroApp.Create;
  gApp.Show;
  AVDoc := CoAcroAVDoc.Create;
  if AVDoc.Open('c:\1.pdf', 'c:\1.pdf') then
  begin
    PDDoc := AVDoc.GetPDDoc as CAcroPDDoc;
    jso := PDDoc.GetJSObject;
    GetMem(Appearance, SizeOf(TAppearance));
    Appearance^.pageNumber := PDDoc.GetNumPages - 1;
    Appearance^.coords[0] := 122;
    Appearance^.coords[1] := 539;
    Appearance^.coords[2] := 422;
    Appearance^.coords[3] := 122;
    Appearance^.appearanceFilter := 'Shuraken';
    jso.CPSign(GetCertificate(FMyCertificate), '', 1, 'Причина: Хотелка',
               'Местоположение: Санкт-Петербург', '', false, true, integer(Appearance));
  end;
end;



Если ставлю предпоследний параметр в false, то подпись не создаётся. Параметр bShowSignDialogs: Флаг, указывающий будут ли отображены диалог с параметрами подписи и диалог для сохранения файла. Ставлю в true, выводится окно, где выбираю сертификат и подпись - невидимая - создаётся.

Вопросы:
1. Первым параметром передал открытый ключ. Почему он не подхватывается и его приходится выбирать в окне диалога?
2. Как из Delphi проинициализировать и передать последний параметр: appearance? Пробовал как record - ругается. Пропускает лишь integer, поэтому пришлось изгаляться.
3. По какой причине не удаётся создать видимую подпись?
...
Рейтинг: 0 / 0
Взаимодействие Delphi c КриптоПро PDF
    #39989139
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а саппорт шо говорит?
...
Рейтинг: 0 / 0
Взаимодействие Delphi c КриптоПро PDF
    #39989163
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,
молчит.
...
Рейтинг: 0 / 0
Взаимодействие Delphi c КриптоПро PDF
    #39989242
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken
Мимопроходящий,
молчит.


может нужно на портал техподдержки написать, а не просто на форуме оставить?
На форуме низкий приоритет.
...
Рейтинг: 0 / 0
Взаимодействие Delphi c КриптоПро PDF
    #39989257
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012,

благодарю.
...
Рейтинг: 0 / 0
Взаимодействие Delphi c КриптоПро PDF
    #39989758
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалось разобраться без support-а. Выкладываю ответ, может пригодится кому-то ещё.

Модифицировал CPPDFDSig.js следующим образом.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// перед строкой
CPSign = app.trustedFunction(function(certificateHEX, pin, pdfLockMode, signReason, signLocation,
signContactInfo, timeStamp, bShowCertificatesDialog, bShowSignDialogs, appearance, cadesType)

// Добавил 2 переменные
    var myCoords = {left: 539, bottom: 122, right: 422, top: 439}; 
    var myAppearance = {pageNumber: 0, coords: [myCoords.left, myCoords.bottom, myCoords.right, myCoords.top], appearanceFilter: "fancy" }; 

// Изменил строку
    if (typeof (appearance) === 'undefined') appearance = null;
// на
    if (typeof (appearance) === 'undefined') appearance = myAppearance;


myAppearance прямо в функцию не вставлял, поскольку почему-то не подхватывались координаты из Delphi.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
// Изменил строку
var appearanceCoords = [0, 0, 0, 0];
// на
var appearanceCoords = [myCoords.left, myCoords.bottom, myCoords.right, myCoords.top];

// закомментировал строку
if (typeof (appearance.coords) !== 'undefined') appearanceCoords = appearance.coords;



В Delphi, перед вызовом CPSign инициализирую переменные.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
      jso := PDDoc.GetJSObject;
      jso.myCoords.left := 10;
      jso.myCoords.bottom := 12;
      jso.myCoords.right := 422;
      jso.myCoords.top := 239;
      jso.MyAppearance.PageNumber := PDDoc.GetNumPages - 1;
      jso.MyAppearance.appearanceFilter := '"MyFilter"';



И они корректно подхватываются.
...
Рейтинг: 0 / 0
Взаимодействие Delphi c КриптоПро PDF
    #39989923
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,
ну... и про TSP на портале не помогли... и на форуме)... Всё сам)

GetCertificate - неправильно реализована, не написал сразу тебе.... мегафон помог на 1.5ч выйти в оффлайн
...
Рейтинг: 0 / 0
Взаимодействие Delphi c КриптоПро PDF
    #39990725
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012,

Про GetCertificate понял, разобрался.

Практически со всем разобрался, но... остались нюансы.

Хочу в программу загрузить список подготовленных шаблонов для подписи из Acrobat. Читаю мануалы, вижу, что за это отвечает Acrobat Digital Signature (DigSig) Extended API, и функции
DSAPFileGetCount - Returns the number of configured appearance entries in the appearance database file.
DSAPFileGetNewNthName — Gets a copy of the name of the Nth appearance object in the file. Use this when building a list of appearances for a user to choose from or edit.

И не понимаю, как получить доступ к этому api. Подскажите, пожалуйста.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Взаимодействие Delphi c КриптоПро PDF
    #40110186
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken
sql2012,

Про GetCertificate понял, разобрался.

Практически со всем разобрался, но... остались нюансы.

Хочу в программу загрузить список подготовленных шаблонов для подписи из Acrobat. Читаю мануалы, вижу, что за это отвечает Acrobat Digital Signature (DigSig) Extended API, и функции
DSAPFileGetCount - Returns the number of configured appearance entries in the appearance database file.
DSAPFileGetNewNthName — Gets a copy of the name of the Nth appearance object in the file. Use this when building a list of appearances for a user to choose from or edit.

И не понимаю, как получить доступ к этому api. Подскажите, пожалуйста.


поднимем тему
победил?
...
Рейтинг: 0 / 0
Взаимодействие Delphi c КриптоПро PDF
    #40117627
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поднял соответствующую тему на форуме крипто про, спрошу и тут

в java-скрипт нужно передать следующие данные

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 jso.CPSign(GetCertificateHEX(MyCert.Thumbprint, Cert),      // certificateHEX
               '',                                              // pin
               1,                                               // pdfLockMode
               'Причина: тест',                                 // signReason
               'Местоположение: тестовое',                      // signLocation
               'контакт',                                       // signContactInfo
               'http://qs.cryptopro.ru/tsp/tsp.srf',            // timeStamp
               false,                                           // bShowCertificatesDialog
               false,                                           // bShowSignDialogs
                '{pageNumber: 0, coords: [10, 12, 422, 239], appearanceFilter: "Fancy"'));



и у меня проблема с последним параметром Appearance
передача его в виде строки не прокатывает, передача в виде объекта типа record тоже, компилятор ругается на такое.
пробовал как JSONObject передать, тоже нет. Компилятор отвечает E2281 Type not allowed in Variant Dispatch call
как сделать такой объект типа variant не соображу, подскажите плз


в документации по криптоПроPDF параметр описан так:

авторcustomAppearance - Object - Объект, определяющий параметры поля подписи и его содержимое

Ниже приведен пример инициализации объекта appearance:
var myAppearance =
{
pageNumber: 0,
coords: [122, 539, 422, 439],
appearanceFilter: "Fancy"
};
...
Рейтинг: 0 / 0
Взаимодействие Delphi c КриптоПро PDF
    #40117752
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ларчик просто открывался, оказывается все-таки можно строку передавать
только я забыл что названия параметра тоже нужно в кавычки брать

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    jso.CPSign(GetCertificateHEX(MyCert.Thumbprint, Cert),      // certificateHEX
               '',                                              // pin
               1,                                               // pdfLockMode
               'Причина: тест',                                 // signReason
               'Местоположение: тестовое',                      // signLocation
               'контакт',                                       // signContactInfo
               'http://qs.cryptopro.ru/tsp/tsp.srf',            // timeStamp
               false,                                           // bShowCertificatesDialog
               false,                                           // bShowSignDialogs
               '{"pageNumber": 0, "coords": [10, 12, 422, 239], "appearanceFilter": "Fancy"}'));



в таком виде подписывает, и создается видимая подпись по шаблону Fancy
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Взаимодействие Delphi c КриптоПро PDF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]