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, OpenString | Opent een bestand, stream of ANSI-tekenreeks in het geheugen, optioneel voor lees-schrijftoegang; Open accepteert een wachtwoord en een lees-schrijfflag |
|---|---|
| Append, AppendToFile, AppendToStream | Start ter plekke een nieuwe incrementele revisie, of voegt de revisie toe aan een nieuw bestand of een nieuwe stream |
| Close | Geeft de onderliggende smart reader en documenthandles vrij |
| AddSignatureField | Registreert een nieuw handtekeningveld op de opgegeven pagina en geeft diens objectnummer terug, of 0 bij mislukking |
| HasSignatureField | True wanneer er een handtekeningveld met de volledig gekwalificeerde naam bestaat |
| GetSignatureFieldNames | Vult een TStrings met alle handtekeningveldnamen in het AcroForm |
| GetSignatureValueObjNum | Objectnummer van het handtekeningwaarde-woordenboek, of 0 wanneer het veld niet is ondertekend |
| GetSignatureValueByName | Ruwe binaire waarden geselecteerd via ValueKey: 0 = /Contents, 1 = /Cert, 2 = /Filter, 3 = /SubFilter, 11 tot 14 = /ByteRange-items 0 tot 3 als decimale tekenreeksen |
| GetSignatureTextValueByName | Tekstwaarden geselecteerd via ValueKey: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type |
| GetSignatureDocMDPLevelByName | Het DocMDP-transformatieniveau (P-waarde) van een certificerende handtekening, 0 indien afwezig |
| GetSignaturePermissionInfoByName | Parseert de DocMDP- en FieldMDP-beperkingen van een handtekening naar een rapportrecord |
| GetSignatureSeedValueEx | Leest het /SV-seed-value-woordenboek dat beperkt wat een ondertekenaar in het veld mag schrijven |
| GetSignatureContentsHashHexByName | Hex-digest van de ondertekende inhoud die de ByteRange dekt |
| SetSignatureValue | Schrijft een voltooide handtekening in de gereserveerde /Contents-ruimte en legt het DocMDP-niveau vast |
| SetSignatureFieldLock | Schrijft een veldvergrendelingswoordenboek met een actie en een lijst met veldnamen |
| SetSignatureImage, SetSignatureAppearanceText, SetSignatureBounds | Regelt het zichtbare uiterlijk: een getekende afbeelding, een in v3.221.0 gebouwde alleen-tekst appearance stream en expliciete veldgrenzen |
| GetDocumentBytes, GetDocumentSize, ReadDocumentRange | Ruwe toegang tot de onderliggende bytes zodat het hele bestand of een ByteRange-segment extern gehasht kan worden |
| GetDSSValidationMaterial | Geeft de DSS-certificaten, CRL's en OCSP-antwoorden voor een veld terug en meldt of VRI-bewijs is gebruikt |
| SetSignatureFlags, EnsurePAdESExtensions | Past /SigFlags aan en voegt het ETSI PAdES-uitbreidingsschema toe |
Parameters
| IsOpen | True tussen een geslaagde open en Close |
|---|---|
| SignatureFieldPosition | Bestandsoffset van de inhoud van het geselecteerde handtekeningveld |
| SignatureFieldLength | Bytelengte 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