TPDFlibSignDoc

Security and Signatures

Beschrijving

TPDFlibSignDoc geeft directe toegang tot de handtekeningvelden van een document zonder de volledige PDF in het geheugen te laden

De klasse opent een bestand, een door de aanroeper beheerde stream of een ANSI-bytetekenreeks, somt de AcroForm-handtekeningvelden op en leest de ruwe waarden van een bestaande handtekening zodat een verifieerder de /ByteRange-digest opnieuw kan berekenen

Hij verzorgt ook de schrijfkant van incrementele updates: Append start een nieuwe revisie, AddSignatureField registreert een nieuw veld, en de SetSignatureValue-familie schrijft in de gereserveerde ruimte terwijl eerdere revisies onaangetast blijven

De SigningWorkbench-demo drijft deze klasse volledig, van veldenumeratie tot ByteRange-inspectie en certificaatextractie

Syntaxis

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;

Methoden

Open, OpenStream, OpenStringOpent een bestand, stream of ANSI-tekenreeks in het geheugen, optioneel voor lees-schrijftoegang; Open accepteert een wachtwoord en een lees-schrijfflag
Append, AppendToFile, AppendToStreamStart ter plekke een nieuwe incrementele revisie, of voegt de revisie toe aan een nieuw bestand of een nieuwe stream
CloseGeeft de onderliggende smart reader en documenthandles vrij
AddSignatureFieldRegistreert een nieuw handtekeningveld op de opgegeven pagina en geeft diens objectnummer terug, of 0 bij mislukking
HasSignatureFieldTrue wanneer er een handtekeningveld met de volledig gekwalificeerde naam bestaat
GetSignatureFieldNamesVult een TStrings met alle handtekeningveldnamen in het AcroForm
GetSignatureValueObjNumObjectnummer van het handtekeningwaarde-woordenboek, of 0 wanneer het veld niet is ondertekend
GetSignatureValueByNameRuwe binaire waarden geselecteerd via ValueKey: 0 = /Contents, 1 = /Cert, 2 = /Filter, 3 = /SubFilter, 11 tot 14 = /ByteRange-items 0 tot 3 als decimale tekenreeksen
GetSignatureTextValueByNameTekstwaarden geselecteerd via ValueKey: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type
GetSignatureDocMDPLevelByNameHet DocMDP-transformatieniveau (P-waarde) van een certificerende handtekening, 0 indien afwezig
GetSignaturePermissionInfoByNameParseert de DocMDP- en FieldMDP-beperkingen van een handtekening naar een rapportrecord
GetSignatureSeedValueExLeest het /SV-seed-value-woordenboek dat beperkt wat een ondertekenaar in het veld mag schrijven
GetSignatureContentsHashHexByNameHex-digest van de ondertekende inhoud die de ByteRange dekt
SetSignatureValueSchrijft een voltooide handtekening in de gereserveerde /Contents-ruimte en legt het DocMDP-niveau vast
SetSignatureFieldLockSchrijft een veldvergrendelingswoordenboek met een actie en een lijst met veldnamen
SetSignatureImage, SetSignatureAppearanceText, SetSignatureBoundsRegelt het zichtbare uiterlijk: een getekende afbeelding, een in v3.221.0 gebouwde alleen-tekst appearance stream en expliciete veldgrenzen
GetDocumentBytes, GetDocumentSize, ReadDocumentRangeRuwe toegang tot de onderliggende bytes zodat het hele bestand of een ByteRange-segment extern gehasht kan worden
GetDSSValidationMaterialGeeft de DSS-certificaten, CRL's en OCSP-antwoorden voor een veld terug en meldt of VRI-bewijs is gebruikt
SetSignatureFlags, EnsurePAdESExtensionsPast /SigFlags aan en voegt het ETSI PAdES-uitbreidingsschema toe

Parameters

IsOpenTrue tussen een geslaagde open en Close
SignatureFieldPositionBestandsoffset van de inhoud van het geselecteerde handtekeningveld
SignatureFieldLengthBytelengte gereserveerd voor de inhoud van de geselecteerde handtekening

Opmerkingen

Het hele bestand wordt door GetDocumentBytes gerealiseerd, want de twee ByteRange-segmenten dekken samen wezenlijk het hele bestand

Wie wil tekenen zonder dit laagniveau-aanraakvlak aan te raken, krijgt dezelfde pijplijn via de gedocumenteerde SignProcess-functies van de façade

Zie ook

TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange