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, AppendToStreamStartet eine neue inkrementelle Revision an Ort und Stelle oder hängt die Revision an eine neue Datei oder einen Stream an
CloseGibt den zugrunde liegenden Smart Reader und die Dokument-Handles frei
AddSignatureFieldRegistriert ein neues Signaturfeld auf der angegebenen Seite und gibt seine Objektnummer zurück, im Fehlerfall 0
HasSignatureFieldTrue, wenn ein Signaturfeld mit dem vollqualifizierten Namen existiert
GetSignatureFieldNamesFüllt eine TStrings mit allen Signaturfeldnamen im AcroForm
GetSignatureValueObjNumObjektnummer des Signaturwert-Wörterbuchs, oder 0, wenn das Feld unsigniert ist
GetSignatureValueByNameRoh-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
GetSignatureTextValueByNameTextwerte, ausgewählt über ValueKey: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type
GetSignatureDocMDPLevelByNameDie DocMDP-Transformationsstufe (P-Wert) einer Zertifizierungssignatur, 0 wenn nicht vorhanden
GetSignaturePermissionInfoByNameParst die DocMDP- und FieldMDP-Einschränkungen einer Signatur in einen Report-Record
GetSignatureSeedValueExLiest das /SV-Seed-Value-Wörterbuch, das einschränkt, was ein Unterzeichner ins Feld schreiben darf
GetSignatureContentsHashHexByNameHex-Digest der signierten Inhalte, die der ByteRange abdeckt
SetSignatureValueSchreibt eine fertige Signatur in den reservierten /Contents-Bereich und vermerkt die DocMDP-Stufe
SetSignatureFieldLockSchreibt ein Feldsperren-Wörterbuch mit einer Aktion und einer Feldnamenliste
SetSignatureImage, SetSignatureAppearanceText, SetSignatureBoundsSteuert das sichtbare Erscheinungsbild: ein gezeichnetes Bild, ein in v3.221.0 eingebauter Nur-Text-Appearance-Stream und explizite Feldgrenzen
GetDocumentBytes, GetDocumentSize, ReadDocumentRangeRoher Zugriff auf die zugrunde liegenden Bytes, damit sich die ganze Datei oder ein ByteRange-Segment extern hashen lässt
GetDSSValidationMaterialLiefert die DSS-Zertifikate, CRLs und OCSP-Antworten für ein Feld und meldet, ob VRI-Evidenz verwendet wurde
SetSignatureFlags, EnsurePAdESExtensionsPasst /SigFlags an und ergänzt das ETSI-PAdES-Erweiterungsschema

Parameter

IsOpenTrue zwischen einem erfolgreichen Öffnen und Close
SignatureFieldPositionDateioffset der Inhalte des ausgewählten Signaturfelds
SignatureFieldLengthReservierte 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