TPDFlibSignDoc

Security and Signatures

Opis

TPDFlibSignDoc daje bezpośredni dostęp do pól podpisu dokumentu bez ładowania całego PDF-a do pamięci

Klasa otwiera plik, strumień należący do wywołującego albo ANSI-owy ciąg bajtów, wylicza pola podpisu AcroForm i odczytuje surowe wartości istniejącego podpisu, tak by weryfikator mógł przeliczyć skrót /ByteRange

Wykonuje też stronę zapisu aktualizacji przyrostowych: Append rozpoczyna nową rewizję, AddSignatureField rejestruje świeże pole, a rodzina SetSignatureValue pisze do zarezerwowanego miejsca, nie ruszając wcześniejszych rewizji

Demo SigningWorkbench prowadzi tę klasę od początku do końca, od wyliczenia pól po inspekcję ByteRange i wyodrębnienie certyfikatu

Składnia

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;

Metody

Open, OpenStream, OpenStringOtwiera plik, strumień albo ANSI-owy ciąg w pamięci, opcjonalnie do odczytu i zapisu; Open przyjmuje hasło i flagę odczytu-zapisu
Append, AppendToFile, AppendToStreamRozpoczyna nową rewizję przyrostową w miejscu albo dopisuje rewizję do nowego pliku lub strumienia
CloseZwalnia leżącego u podstaw czytnika i uchwyty dokumentu
AddSignatureFieldRejestruje nowe pole podpisu na podanej stronie i zwraca jego numer obiektu albo 0 przy niepowodzeniu
HasSignatureFieldTrue, gdy istnieje pole podpisu o w pełni kwalifikowanej nazwie
GetSignatureFieldNamesWypełnia TStrings nazwami wszystkich pól podpisu w AcroForm
GetSignatureValueObjNumNumer obiektu słownika wartości podpisu albo 0, gdy pole jest niepodpisane
GetSignatureValueByNameSurowe wartości binarne wybierane przez ValueKey: 0 = /Contents, 1 = /Cert, 2 = /Filter, 3 = /SubFilter, 11-14 = wpisy 0-3 /ByteRange jako łańcuchy dziesiętne
GetSignatureTextValueByNameWartości tekstowe wybierane przez ValueKey: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type
GetSignatureDocMDPLevelByNamePoziom transformacji DocMDP (wartość P) podpisu poświadczającego, 0 gdy go brak
GetSignaturePermissionInfoByNameAnalizuje ograniczenia DocMDP i FieldMDP podpisu do rekordu raportu
GetSignatureSeedValueExCzyta słownik wartości startowych /SV, który ogranicza, co podpisujący może zapisać w polu
GetSignatureContentsHashHexByNameSkrót heksadecymalny podpisanej zawartości objętej ByteRange
SetSignatureValueZapisuje gotowy podpis do zarezerwowanego miejsca /Contents i notuje poziom DocMDP
SetSignatureFieldLockZapisuje słownik blokady pola z akcją i listą nazw pól
SetSignatureImage, SetSignatureAppearanceText, SetSignatureBoundsSterowanie widocznym wyglądem: narysowany obraz, strumień wyglądu tylko z tekstem zbudowany w v3.221.0 oraz jawne granice pola
GetDocumentBytes, GetDocumentSize, ReadDocumentRangeSurowy dostęp do leżących u podstaw bajtów, więc cały plik albo segment ByteRange można hashować zewnętrznie
GetDSSValidationMaterialZwraca certyfikaty DSS, listy CRL i odpowiedzi OCSP dla pola i raportuje, czy użyto dowodów VRI
SetSignatureFlags, EnsurePAdESExtensionsDostosowuje /SigFlags i dodaje schemę rozszerzeń ETSI PAdES

Parametry

IsOpenTrue od udanego otwarcia do Close
SignatureFieldPositionPrzesunięcie plikowe zawartości wybranego pola podpisu
SignatureFieldLengthDługość w bajtach zarezerwowana dla zawartości wybranego podpisu

Uwagi

Cały plik jest materializowany przez GetDocumentBytes, bo dwa segmenty ByteRange razem pokrywają praktycznie cały plik

Żeby podpisywać bez dotykania tej niskopoziomowej warstwy, fasada wystawia równoważny potok przez udokumentowane funkcje SignProcess

Zobacz również

TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange