TPDFlibSignDoc
Security and Signatures
Description
TPDFlibSignDoc donne un accès direct aux champs de signature d'un document sans charger le PDF complet en mémoire
La classe ouvre un fichier, un flux détenu par l'appelant ou une chaîne d'octets ANSI, énumère les champs de signature AcroForm et lit les valeurs brutes d'une signature existante pour qu'un vérificateur puisse recalculer le digest de /ByteRange
Elle assure aussi le versant écriture des mises à jour incrémentales : Append démarre une nouvelle révision, AddSignatureField enregistre un champ neuf, et la famille SetSignatureValue écrit dans l'espace réservé en laissant les révisions antérieures intactes
La démo SigningWorkbench pilote cette classe de bout en bout, de l'énumération des champs à l'inspection du ByteRange et à l'extraction de certificats
Syntaxe
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éthodes
| Open, OpenStream, OpenString | Ouvre un fichier, un flux ou une chaîne ANSI en mémoire, éventuellement en lecture-écriture ; Open accepte un mot de passe et un drapeau lecture-écriture |
|---|---|
| Append, AppendToFile, AppendToStream | Démarre une nouvelle révision incrémentale sur place, ou ajoute la révision à un nouveau fichier ou flux |
| Close | Libère le smart reader sous-jacent et les handles du document |
| AddSignatureField | Enregistre un nouveau champ de signature sur la page indiquée et renvoie son numéro d'objet, ou 0 en cas d'échec |
| HasSignatureField | True quand un champ de signature portant le nom complet existe |
| GetSignatureFieldNames | Remplit un TStrings avec tous les noms de champs de signature de l'AcroForm |
| GetSignatureValueObjNum | Numéro d'objet du dictionnaire de valeur de signature, ou 0 quand le champ n'est pas signé |
| GetSignatureValueByName | Valeurs binaires brutes sélectionnées par ValueKey : 0 = /Contents, 1 = /Cert, 2 = /Filter, 3 = /SubFilter, 11 à 14 = entrées 0 à 3 de /ByteRange sous forme de chaînes décimales |
| GetSignatureTextValueByName | Valeurs texte sélectionnées par ValueKey : 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type |
| GetSignatureDocMDPLevelByName | Le niveau de transformation DocMDP (valeur P) d'une signature de certification, 0 en son absence |
| GetSignaturePermissionInfoByName | Analyse les contraintes DocMDP et FieldMDP d'une signature dans un enregistrement de rapport |
| GetSignatureSeedValueEx | Lit le dictionnaire de seed values /SV qui contraint ce qu'un signataire peut écrire dans le champ |
| GetSignatureContentsHashHexByName | Digest hexadécimal des contenus signés couverts par le ByteRange |
| SetSignatureValue | Écrit une signature achevée dans l'espace réservé de /Contents et consigne le niveau DocMDP |
| SetSignatureFieldLock | Écrit un dictionnaire de verrou de champ avec une action et une liste de noms de champs |
| SetSignatureImage, SetSignatureAppearanceText, SetSignatureBounds | Maîtrisent l'apparence visible : une image dessinée, un flux d'apparence texte seul introduit en v3.221.0, et des bornes de champ explicites |
| GetDocumentBytes, GetDocumentSize, ReadDocumentRange | Accès brut aux octets sous-jacents pour hacher à l'extérieur le fichier entier ou un segment du ByteRange |
| GetDSSValidationMaterial | Renvoie les certificats DSS, les CRL et les réponses OCSP d'un champ et indique si une preuve VRI a été utilisée |
| SetSignatureFlags, EnsurePAdESExtensions | Ajustent /SigFlags et ajoutent le schéma d'extension ETSI PAdES |
Paramètres
| IsOpen | True entre une ouverture réussie et Close |
|---|---|
| SignatureFieldPosition | Décalage fichier des contenus du champ de signature sélectionné |
| SignatureFieldLength | Longueur en octets réservée aux contenus de la signature sélectionnée |
Remarques
Le fichier entier est matérialisé par GetDocumentBytes parce que les deux segments du ByteRange couvrent ensemble quasiment tout le fichier
Pour signer sans toucher cette surface de bas niveau, la façade expose le pipeline équivalent via les fonctions SignProcess documentées
Voir aussi
TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange