TPDFlibSignDoc

Security and Signatures

Descripción

TPDFlibSignDoc proporciona acceso directo a los campos de firma de un documento sin cargar el PDF completo en memoria

La clase abre un archivo, un stream propiedad de quien llama o una cadena de bytes ANSI, enumera los campos de firma AcroForm y lee los valores en bruto de una firma existente para que un verificador pueda recalcular el digest de /ByteRange

También se encarga de la parte de escritura de las actualizaciones incrementales: Append inicia una revisión nueva, AddSignatureField registra un campo nuevo y la familia SetSignatureValue escribe en el espacio reservado manteniendo intactas las revisiones anteriores

La demo SigningWorkbench maneja esta clase de principio a fin, desde la enumeración de campos hasta la inspección del ByteRange y la extracción de certificados

Sintaxis

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;

Métodos

Open, OpenStream, OpenStringAbre un archivo, un stream o una cadena ANSI en memoria, opcionalmente con acceso de lectura-escritura; Open acepta una contraseña y un indicador de lectura-escritura
Append, AppendToFile, AppendToStreamInicia una revisión incremental nueva in situ, o añade la revisión a un archivo o stream nuevo
CloseLibera el smart reader subyacente y los handles del documento
AddSignatureFieldRegistra un campo de firma nuevo en la página indicada y devuelve su número de objeto, o 0 si falla
HasSignatureFieldTrue cuando existe un campo de firma con el nombre completo
GetSignatureFieldNamesRellena un TStrings con todos los nombres de campos de firma del AcroForm
GetSignatureValueObjNumNúmero de objeto del diccionario de valor de firma, o 0 cuando el campo no está firmado
GetSignatureValueByNameValores binarios en bruto seleccionados por ValueKey: 0 = /Contents, 1 = /Cert, 2 = /Filter, 3 = /SubFilter, 11 a 14 = entradas 0 a 3 de /ByteRange como cadenas decimales
GetSignatureTextValueByNameValores de texto seleccionados por ValueKey: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type
GetSignatureDocMDPLevelByNameEl nivel de transformación DocMDP (valor P) de una firma de certificación, 0 si está ausente
GetSignaturePermissionInfoByNameAnaliza las restricciones DocMDP y FieldMDP de una firma y las vuelca en un registro de informe
GetSignatureSeedValueExLee el diccionario de valores semilla /SV que restringe qué puede escribir un firmante en el campo
GetSignatureContentsHashHexByNameDigest hexadecimal de los contenidos firmados que cubre el ByteRange
SetSignatureValueEscribe una firma terminada en el espacio reservado de /Contents y registra el nivel DocMDP
SetSignatureFieldLockEscribe un diccionario de bloqueo de campo con una acción y una lista de nombres de campos
SetSignatureImage, SetSignatureAppearanceText, SetSignatureBoundsControlan la apariencia visible: una imagen dibujada, un stream de apariencia de solo texto introducido en v3.221.0 y límites explícitos del campo
GetDocumentBytes, GetDocumentSize, ReadDocumentRangeAcceso en bruto a los bytes subyacentes para poder calcular el hash del archivo completo o de un segmento del ByteRange externamente
GetDSSValidationMaterialDevuelve los certificados DSS, las CRL y las respuestas OCSP de un campo e informa de si se usó evidencia VRI
SetSignatureFlags, EnsurePAdESExtensionsAjusta /SigFlags y añade el esquema de extensión ETSI PAdES

Parámetros

IsOpenTrue entre una apertura correcta y Close
SignatureFieldPositionDesplazamiento en el archivo de los contenidos del campo de firma seleccionado
SignatureFieldLengthLongitud en bytes reservada para los contenidos de la firma seleccionada

Observaciones

El archivo completo se materializa con GetDocumentBytes porque los dos segmentos del ByteRange juntos cubren prácticamente todo el archivo

Para firmar sin tocar esta superficie de bajo nivel, la fachada expone el pipeline equivalente mediante las funciones SignProcess documentadas

Véase también

TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange