TPDFlibSignDoc
Security and Signatures
Beschreibung
TPDFlibSignDoc bietet direkten Zugriff auf die Signaturfelder eines Dokuments, ohne das komplette PDF in den Speicher zu laden
Die Klasse öffnet eine Datei, einen Stream des Aufrufers oder eine ANSI-Bytezeichenkette, zählt die AcroForm-Signaturfelder auf und liest die Rohwerte einer vorhandenen Signatur, damit ein Verifizierer den /ByteRange-Digest nachrechnen kann
Sie übernimmt auch die Schreibseite inkrementeller Updates: Append startet eine neue Revision, AddSignatureField registriert ein neues Feld, und die SetSignatureValue-Familie schreibt in den reservierten Bereich, während frühere Revisionen unangetastet bleiben
Das SigningWorkbench-Demo treibt diese Klasse komplett durch, von der Feldaufzählung bis zur ByteRange-Inspektion und Zertifikatsextraktion
Syntax
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 | Öffnet eine Datei, einen Stream oder eine ANSI-Zeichenkette im Speicher, optional mit Lese-Schreib-Zugriff; Open nimmt ein Passwort und ein Lese-Schreib-Flag entgegen |
|---|---|
| Append, AppendToFile, AppendToStream | Startet eine neue inkrementelle Revision an Ort und Stelle oder hängt die Revision an eine neue Datei oder einen Stream an |
| Close | Gibt den zugrunde liegenden Smart Reader und die Dokument-Handles frei |
| AddSignatureField | Registriert ein neues Signaturfeld auf der angegebenen Seite und gibt seine Objektnummer zurück, im Fehlerfall 0 |
| HasSignatureField | True, wenn ein Signaturfeld mit dem vollqualifizierten Namen existiert |
| GetSignatureFieldNames | Füllt eine TStrings mit allen Signaturfeldnamen im AcroForm |
| GetSignatureValueObjNum | Objektnummer des Signaturwert-Wörterbuchs, oder 0, wenn das Feld unsigniert ist |
| GetSignatureValueByName | Roh-Binärwerte, ausgewählt über ValueKey: 0 = /Contents, 1 = /Cert, 2 = /Filter, 3 = /SubFilter, 11 bis 14 = /ByteRange-Einträge 0 bis 3 als Dezimalzeichenketten |
| GetSignatureTextValueByName | Textwerte, ausgewählt über ValueKey: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type |
| GetSignatureDocMDPLevelByName | Die DocMDP-Transformationsstufe (P-Wert) einer Zertifizierungssignatur, 0 wenn nicht vorhanden |
| GetSignaturePermissionInfoByName | Parst die DocMDP- und FieldMDP-Einschränkungen einer Signatur in einen Report-Record |
| GetSignatureSeedValueEx | Liest das /SV-Seed-Value-Wörterbuch, das einschränkt, was ein Unterzeichner ins Feld schreiben darf |
| GetSignatureContentsHashHexByName | Hex-Digest der signierten Inhalte, die der ByteRange abdeckt |
| SetSignatureValue | Schreibt eine fertige Signatur in den reservierten /Contents-Bereich und vermerkt die DocMDP-Stufe |
| SetSignatureFieldLock | Schreibt ein Feldsperren-Wörterbuch mit einer Aktion und einer Feldnamenliste |
| SetSignatureImage, SetSignatureAppearanceText, SetSignatureBounds | Steuert das sichtbare Erscheinungsbild: ein gezeichnetes Bild, ein in v3.221.0 eingebauter Nur-Text-Appearance-Stream und explizite Feldgrenzen |
| GetDocumentBytes, GetDocumentSize, ReadDocumentRange | Roher Zugriff auf die zugrunde liegenden Bytes, damit sich die ganze Datei oder ein ByteRange-Segment extern hashen lässt |
| GetDSSValidationMaterial | Liefert die DSS-Zertifikate, CRLs und OCSP-Antworten für ein Feld und meldet, ob VRI-Evidenz verwendet wurde |
| SetSignatureFlags, EnsurePAdESExtensions | Passt /SigFlags an und ergänzt das ETSI-PAdES-Erweiterungsschema |
Parameter
| IsOpen | True zwischen einem erfolgreichen Öffnen und Close |
|---|---|
| SignatureFieldPosition | Dateioffset der Inhalte des ausgewählten Signaturfelds |
| SignatureFieldLength | Reservierte Bytelänge für die Inhalte der ausgewählten Signatur |
Anmerkungen
Die ganze Datei wird von GetDocumentBytes materialisiert, weil die beiden ByteRange-Segmente zusammen praktisch die gesamte Datei abdecken
Wer ohne diese Low-Level-Oberfläche signieren will, bekommt dieselbe Pipeline über die dokumentierten SignProcess-Funktionen der Fassade
Siehe auch
TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange