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, OpenString | Otwiera 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, AppendToStream | Rozpoczyna nową rewizję przyrostową w miejscu albo dopisuje rewizję do nowego pliku lub strumienia |
| Close | Zwalnia leżącego u podstaw czytnika i uchwyty dokumentu |
| AddSignatureField | Rejestruje nowe pole podpisu na podanej stronie i zwraca jego numer obiektu albo 0 przy niepowodzeniu |
| HasSignatureField | True, gdy istnieje pole podpisu o w pełni kwalifikowanej nazwie |
| GetSignatureFieldNames | Wypełnia TStrings nazwami wszystkich pól podpisu w AcroForm |
| GetSignatureValueObjNum | Numer obiektu słownika wartości podpisu albo 0, gdy pole jest niepodpisane |
| GetSignatureValueByName | Surowe 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 |
| GetSignatureTextValueByName | Wartości tekstowe wybierane przez ValueKey: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type |
| GetSignatureDocMDPLevelByName | Poziom transformacji DocMDP (wartość P) podpisu poświadczającego, 0 gdy go brak |
| GetSignaturePermissionInfoByName | Analizuje ograniczenia DocMDP i FieldMDP podpisu do rekordu raportu |
| GetSignatureSeedValueEx | Czyta słownik wartości startowych /SV, który ogranicza, co podpisujący może zapisać w polu |
| GetSignatureContentsHashHexByName | Skrót heksadecymalny podpisanej zawartości objętej ByteRange |
| SetSignatureValue | Zapisuje gotowy podpis do zarezerwowanego miejsca /Contents i notuje poziom DocMDP |
| SetSignatureFieldLock | Zapisuje słownik blokady pola z akcją i listą nazw pól |
| SetSignatureImage, SetSignatureAppearanceText, SetSignatureBounds | Sterowanie widocznym wyglądem: narysowany obraz, strumień wyglądu tylko z tekstem zbudowany w v3.221.0 oraz jawne granice pola |
| GetDocumentBytes, GetDocumentSize, ReadDocumentRange | Surowy dostęp do leżących u podstaw bajtów, więc cały plik albo segment ByteRange można hashować zewnętrznie |
| GetDSSValidationMaterial | Zwraca certyfikaty DSS, listy CRL i odpowiedzi OCSP dla pola i raportuje, czy użyto dowodów VRI |
| SetSignatureFlags, EnsurePAdESExtensions | Dostosowuje /SigFlags i dodaje schemę rozszerzeń ETSI PAdES |
Parametry
| IsOpen | True od udanego otwarcia do Close |
|---|---|
| SignatureFieldPosition | Przesunięcie plikowe zawartości wybranego pola podpisu |
| SignatureFieldLength | Dł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