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, OpenString | Abre 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, AppendToStream | Inicia una revisión incremental nueva in situ, o añade la revisión a un archivo o stream nuevo |
| Close | Libera el smart reader subyacente y los handles del documento |
| AddSignatureField | Registra un campo de firma nuevo en la página indicada y devuelve su número de objeto, o 0 si falla |
| HasSignatureField | True cuando existe un campo de firma con el nombre completo |
| GetSignatureFieldNames | Rellena un TStrings con todos los nombres de campos de firma del AcroForm |
| GetSignatureValueObjNum | Número de objeto del diccionario de valor de firma, o 0 cuando el campo no está firmado |
| GetSignatureValueByName | Valores 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 |
| GetSignatureTextValueByName | Valores de texto seleccionados por ValueKey: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type |
| GetSignatureDocMDPLevelByName | El nivel de transformación DocMDP (valor P) de una firma de certificación, 0 si está ausente |
| GetSignaturePermissionInfoByName | Analiza las restricciones DocMDP y FieldMDP de una firma y las vuelca en un registro de informe |
| GetSignatureSeedValueEx | Lee el diccionario de valores semilla /SV que restringe qué puede escribir un firmante en el campo |
| GetSignatureContentsHashHexByName | Digest hexadecimal de los contenidos firmados que cubre el ByteRange |
| SetSignatureValue | Escribe una firma terminada en el espacio reservado de /Contents y registra el nivel DocMDP |
| SetSignatureFieldLock | Escribe un diccionario de bloqueo de campo con una acción y una lista de nombres de campos |
| SetSignatureImage, SetSignatureAppearanceText, SetSignatureBounds | Controlan 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, ReadDocumentRange | Acceso en bruto a los bytes subyacentes para poder calcular el hash del archivo completo o de un segmento del ByteRange externamente |
| GetDSSValidationMaterial | Devuelve los certificados DSS, las CRL y las respuestas OCSP de un campo e informa de si se usó evidencia VRI |
| SetSignatureFlags, EnsurePAdESExtensions | Ajusta /SigFlags y añade el esquema de extensión ETSI PAdES |
Parámetros
| IsOpen | True entre una apertura correcta y Close |
|---|---|
| SignatureFieldPosition | Desplazamiento en el archivo de los contenidos del campo de firma seleccionado |
| SignatureFieldLength | Longitud 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