TPDFlibSignDoc
Security and Signatures
Описание
TPDFlibSignDoc даёт прямой доступ к полям подписи документа, не загружая весь PDF в память
Класс открывает файл, управляемый вызывающим поток или ANSI-строку байтов, перечисляет поля подписи AcroForm и читает необработанные значения существующей подписи, чтобы проверяющий мог пересчитать дайджест /ByteRange
Он же выполняет и запись при инкрементальных обновлениях: Append начинает новую редакцию, AddSignatureField регистрирует свежее поле, а семейство SetSignatureValue пишет в зарезервированное пространство, оставляя прежние редакции нетронутыми
Демонстрация SigningWorkbench использует этот класс от начала до конца — от перечисления полей до инспекции ByteRange и извлечения сертификата
Синтаксис
Delphi
TPDFlibSignDoc = Class
Public
Destructor Destroy; Override;
Function Open(Const FileName: WideString; Const Password: WideString; ReadWrite: Boolean): Boolean;
Function OpenStream(SourceStream: TStream; Const Password: WideString): Boolean;
Function OpenString(Const SourceData: AnsiString; Const Password: WideString): Boolean;
Procedure Append;
Function AppendToFile(Const FileName: WideString): Boolean;
Function AppendToStream(TargetStream: TStream): Boolean;
Procedure Close;
Function AddSignatureField(Const FieldName: WideString; PageNumber: Integer): Integer;
Function HasSignatureField(Const FieldName: WideString): Boolean;
Procedure GetSignatureFieldNames(Names: TStrings);
Function GetSignatureValueObjNum(Const FieldName: WideString): Integer;
Function GetSignatureValueByName(Const FieldName: WideString; ValueKey: Integer): AnsiString;
Function GetSignatureTextValueByName(Const FieldName: WideString; ValueKey: Integer): WideString;
Function GetSignatureDocMDPLevelByName(Const FieldName: WideString): Integer;
Function GetSignaturePermissionInfoByName(Const FieldName: WideString;
Out Report: TPDFlibSignaturePermissionReport): Boolean;
Function GetSignatureSeedValueEx(Const FieldName: WideString;
Out SeedValue: TPDFSignatureSeedValue): Boolean;
Function GetSignatureContentsHashHexByName(Const FieldName: WideString): AnsiString;
Function SetSignatureValue(Const FieldName: WideString; Const NewValue: AnsiString;
DocMDPLevel: Integer): Boolean;
Function SetSignatureFieldLock(Const FieldName: WideString;
Const Action: AnsiString; Const Fields: TArray): Boolean;
Procedure SetSignatureImage(Const FieldName: WideString; Const ImageData: AnsiString; ImageOptions: Integer);
Procedure SetSignatureAppearanceText(Const FieldName, Text: WideString; FontSize, FontRed, FontGreen, FontBlue: Double);
Procedure SetSignatureBounds(Const FieldName: WideString; Left, Top, Width, Height: Double);
Function GetDocumentBytes: TBytes;
Function GetDocumentSize: Int64;
Function ReadDocumentRange(Offset: Int64; Buffer: Pointer; Count: Integer): Integer;
Function GetDSSValidationMaterial(Const FieldName: WideString;
Out Certs, CRLs, OCSPs: TStructStrArray; Out UsedVRI: Boolean): Boolean;
Procedure SetSignatureFlags(NewFlags: Integer);
Procedure EnsurePAdESExtensions(ESICLevel: Integer);
Property IsOpen: Boolean Read FIsOpen;
Property SignatureFieldPosition: Int64 Read FSignatureFieldPosition;
Property SignatureFieldLength: Integer Read FSignatureFieldLength;
End; Методы
| Open, OpenStream, OpenString | Открывает файл, поток или ANSI-строку в памяти, при необходимости с доступом на чтение и запись; Open принимает пароль и флаг чтения-записи |
|---|---|
| Append, AppendToFile, AppendToStream | Начинает новую инкрементальную редакцию на месте или дописывает редакцию в новый файл либо поток |
| Close | Освобождает лежащий в основе объект чтения и дескрипторы документа |
| AddSignatureField | Регистрирует новое поле подписи на указанной странице и возвращает его номер объекта или 0 при неудаче |
| HasSignatureField | True, если существует поле подписи с полным составным именем |
| GetSignatureFieldNames | Заполняет TStrings именами всех полей подписи в AcroForm |
| GetSignatureValueObjNum | Номер объекта словаря значения подписи или 0, если поле не подписано |
| GetSignatureValueByName | Необработанные двоичные значения, выбираемые ValueKey: 0 = /Contents, 1 = /Cert, 2 = /Filter, 3 = /SubFilter, 11-14 = записи 0-3 /ByteRange в виде десятичных строк |
| GetSignatureTextValueByName | Текстовые значения, выбираемые ValueKey: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type |
| GetSignatureDocMDPLevelByName | Уровень преобразования DocMDP (значение P) сертифицирующей подписи; 0, если отсутствует |
| GetSignaturePermissionInfoByName | Разбирает ограничения DocMDP и FieldMDP подписи в запись-отчёт |
| GetSignatureSeedValueEx | Читает словарь начальных значений /SV, ограничивающий, что подписант может записать в поле |
| GetSignatureContentsHashHexByName | Шестнадцатеричный дайджест подписанного содержимого, охваченного ByteRange |
| SetSignatureValue | Записывает готовую подпись в зарезервированное пространство /Contents и фиксирует уровень DocMDP |
| SetSignatureFieldLock | Записывает словарь блокировки поля с действием и списком имён полей |
| SetSignatureImage, SetSignatureAppearanceText, SetSignatureBounds | Управление видимым обликом: нарисованное изображение, поток внешнего вида только с текстом, появившийся в v3.221.0, и явные границы поля |
| GetDocumentBytes, GetDocumentSize, ReadDocumentRange | Прямой доступ к лежащим в основе байтам, чтобы хешировать весь файл или сегмент ByteRange внешними средствами |
| GetDSSValidationMaterial | Возвращает сертификаты DSS, списки CRL и ответы OCSP для поля и сообщает, использовались ли свидетельства VRI |
| SetSignatureFlags, EnsurePAdESExtensions | Корректирует /SigFlags и добавляет схему расширений ETSI PAdES |
Параметры
| IsOpen | True от успешного открытия до Close |
|---|---|
| SignatureFieldPosition | Файловое смещение содержимого выбранного поля подписи |
| SignatureFieldLength | Длина в байтах, зарезервированная для содержимого выбранной подписи |
Примечания
Весь файл материализуется через GetDocumentBytes, поскольку два сегмента ByteRange вместе покрывают практически весь файл
Чтобы подписывать, не трогая этот низкоуровневый слой, фасад открывает эквивалентный конвейер через документированные функции SignProcess
См. также
TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange