Метод THotPDF.AddLoadedSignedSignatureField
Добавляет в загруженный документ поле подписи, готовое к подписанию. Поле несёт словарь подписи с зарезервированным местом под /ByteRange и /Contents, так что SignPDFWithPFX, PreparePDFForSigning и InsertSignatureHex могут подписать его после сохранения документа. Вместе с BeginIncrementalUpdate это способ получить вторую подпись в уже подписанном PDF
Объявление
function AddLoadedSignedSignatureField(PageIndex: Integer; X1, Y1, X2, Y2: Single;
const AFieldName: AnsiString; ContentsBytes: Integer = 8192;
const SubFilter: AnsiString = 'adbe.pkcs7.detached';
const Reason: AnsiString = ''; const Location: AnsiString = '';
const ContactName: AnsiString = ''): Integer;
Модуль
HPDFDoc
Параметры
| Имя | Назначение |
|---|---|
PageIndex | Отсчитываемый от нуля индекс загруженной страницы, на которой размещается widget подписи |
X1, Y1, X2, Y2 | Прямоугольник widget в пользовательской системе координат PDF (пункты, начало в левом нижнем углу); ширина и высота должны быть положительными |
AFieldName | Имя нового поля подписи; оно не должно быть пустым и не должно уже существовать в документе |
ContentsBytes | Байты, зарезервированные под подпись CMS (записываются как вдвое большее число hex-цифр); их должно хватать на полную подпись, включая сертификаты и любой токен метки времени |
SubFilter | Формат подписи, например adbe.pkcs7.detached или ETSI.CAdES.detached |
Reason, Location, ContactName | Необязательные записи /Reason, /Location и /ContactInfo словаря подписи |
Возвращаемое значение
Возвращает индекс нового поля формы или -1, когда PageIndex вне диапазона
Примечания по использованию
- После
BeginIncrementalUpdateилиLoadFromFileтекущей страницы нет, поэтому используйте этот метод, а неTHPDFPage.AddSignedSignatureField, который рассчитан на документы, созданные черезBeginDoc - В инкрементальном режиме поле, его словарь подписи, обновлённый AcroForm и page
/Annotsдописываются как новая редакция. Байты, покрытые прежними подписями, не меняются, поэтому те подписи остаются валидными, а новая подпись покрывает весь файл - AcroForm получает
/SigFlags 3(подписи существуют, только дописывание). В отличие от остальных методов полейAddLoaded*, он не добавляет/NeedAppearances, который заставил бы читалки переписывать подписанный документ - Подпишите сохранённый файл через
SignPDFWithPFX. Для внешнего подписанта или HSM прочитайте файл вAnsiString, вызовитеPreparePDFForSigning, чтобы получить два диапазона байтов для хеширования, постройте CMS над ними и запишите её hex черезInsertSignatureHex - Используйте AddLoadedSignatureField для пустого поля, которое читалка или другой инструмент подпишет позже
Пример
PDF := THotPDF.Create(nil);
try
PDF.BeginIncrementalUpdate('Signed.pdf');
PDF.AddLoadedSignedSignatureField(0, 300, 120, 500, 160, 'Approver', 8192,
'adbe.pkcs7.detached', 'Approved');
PDF.SaveIncrementalUpdate('Prepared.pdf');
finally
PDF.Free;
end;
// Signs the reserved field; the first signature stays valid
THotPDF.SignPDFWithPFX('Prepared.pdf', 'SignedTwice.pdf', 'Signer.pfx', 'password');