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, OpenStringOuvre 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, AppendToStreamDémarre une nouvelle révision incrémentale sur place, ou ajoute la révision à un nouveau fichier ou flux
CloseLibère le smart reader sous-jacent et les handles du document
AddSignatureFieldEnregistre un nouveau champ de signature sur la page indiquée et renvoie son numéro d'objet, ou 0 en cas d'échec
HasSignatureFieldTrue quand un champ de signature portant le nom complet existe
GetSignatureFieldNamesRemplit un TStrings avec tous les noms de champs de signature de l'AcroForm
GetSignatureValueObjNumNuméro d'objet du dictionnaire de valeur de signature, ou 0 quand le champ n'est pas signé
GetSignatureValueByNameValeurs 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
GetSignatureTextValueByNameValeurs texte sélectionnées par ValueKey : 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type
GetSignatureDocMDPLevelByNameLe niveau de transformation DocMDP (valeur P) d'une signature de certification, 0 en son absence
GetSignaturePermissionInfoByNameAnalyse les contraintes DocMDP et FieldMDP d'une signature dans un enregistrement de rapport
GetSignatureSeedValueExLit le dictionnaire de seed values /SV qui contraint ce qu'un signataire peut écrire dans le champ
GetSignatureContentsHashHexByNameDigest 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, SetSignatureBoundsMaî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, ReadDocumentRangeAccès brut aux octets sous-jacents pour hacher à l'extérieur le fichier entier ou un segment du ByteRange
GetDSSValidationMaterialRenvoie les certificats DSS, les CRL et les réponses OCSP d'un champ et indique si une preuve VRI a été utilisée
SetSignatureFlags, EnsurePAdESExtensionsAjustent /SigFlags et ajoutent le schéma d'extension ETSI PAdES

Paramètres

IsOpenTrue entre une ouverture réussie et Close
SignatureFieldPositionDécalage fichier des contenus du champ de signature sélectionné
SignatureFieldLengthLongueur 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