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 при неудаче
HasSignatureFieldTrue, если существует поле подписи с полным составным именем
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

Параметры

IsOpenTrue от успешного открытия до Close
SignatureFieldPositionФайловое смещение содержимого выбранного поля подписи
SignatureFieldLengthДлина в байтах, зарезервированная для содержимого выбранной подписи

Примечания

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

Чтобы подписывать, не трогая этот низкоуровневый слой, фасад открывает эквивалентный конвейер через документированные функции SignProcess

См. также

TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange