TPDFlibSignDoc
Security and Signatures
설명
TPDFlibSignDoc은 PDF 전체를 메모리에 올리지 않고 문서의 시그니처 필드에 직접 접근하는 수단을 제공합니다
이 클래스는 파일, 호출자 소유 스트림, ANSI 바이트 문자열을 열어 AcroForm 시그니처 필드를 나열하고, 기존 서명의 날 바이트 값을 읽습니다. 베리파이어가 /ByteRange 다이제스트를 다시 계산할 때 쓸 수 있습니다
증분 업데이트의 쓰기 쪽도 맡습니다. Append가 새 리비전을 시작하고, AddSignatureField가 새 필드를 등록하며, SetSignatureValue 계열은 이전 리비전을 그대로 둔 채 예약 공간에 기록합니다
SigningWorkbench 데모는 필드 나열부터 ByteRange 검사, 인증서 추출까지 이 클래스를 처음부터 끝까지 구동합니다
구문
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; 메서드
| Open, OpenStream, OpenString | 파일, 스트림, 메모리상의 ANSI 문자열을 엽니다. 읽기·쓰기로 열 수도 있으며, Open은 비밀번호와 읽기·쓰기 플래그를 받습니다 |
|---|---|
| Append, AppendToFile, AppendToStream | 그 자리에서 새 증분 리비전을 시작하거나, 리비전을 새 파일이나 스트림에 덧붙입니다 |
| Close | 내부 스마트 리더와 문서 핸들을 해제합니다 |
| AddSignatureField | 지정한 페이지에 새 시그니처 필드를 등록하고 그 객체 번호를 반환합니다. 실패하면 0 |
| HasSignatureField | 완전한 이름(fully qualified name)을 가진 시그니처 필드가 있으면 True |
| GetSignatureFieldNames | AcroForm의 모든 시그니처 필드 이름을 TStrings에 채웁니다 |
| GetSignatureValueObjNum | 시그니처 값 딕셔너리의 객체 번호. 필드가 서명되지 않았으면 0 |
| GetSignatureValueByName | ValueKey로 고르는 날 바이트 값: 0 = /Contents, 1 = /Cert, 2 = /Filter, 3 = /SubFilter, 11~14 = /ByteRange 항목 0~3(10진 문자열) |
| GetSignatureTextValueByName | ValueKey로 고르는 텍스트 값: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type |
| GetSignatureDocMDPLevelByName | 인증(certifying) 서명의 DocMDP 변환 레벨(P 값). 없으면 0 |
| GetSignaturePermissionInfoByName | 서명의 DocMDP와 FieldMDP 제약을 보고용 레코드로 해석합니다 |
| GetSignatureSeedValueEx | 서명자가 필드에 기록할 수 있는 내용을 제약하는 /SV 시드 값 딕셔너리를 읽습니다 |
| GetSignatureContentsHashHexByName | ByteRange가 덮는 서명 대상 내용의 16진 다이제스트 |
| SetSignatureValue | 완성된 서명을 예약된 /Contents 공간에 기록하고 DocMDP 레벨을 남깁니다 |
| SetSignatureFieldLock | 액션과 필드 이름 목록이 담긴 필드 잠금 딕셔너리를 기록합니다 |
| SetSignatureImage, SetSignatureAppearanceText, SetSignatureBounds | 보이는 모양을 제어합니다. 그려진 이미지, v3.221.0에서 만들어진 텍스트 전용 외관 스트림, 명시적 필드 경계 |
| GetDocumentBytes, GetDocumentSize, ReadDocumentRange | 기반이 되는 바이트에 직접 접근합니다. 파일 전체나 ByteRange 구간을 외부에서 해시할 수 있습니다 |
| GetDSSValidationMaterial | 필드의 DSS 인증서, CRL, OCSP 응답을 반환하고 VRI 증거를 썼는지 알려줍니다 |
| SetSignatureFlags, EnsurePAdESExtensions | /SigFlags를 조정하고 ETSI PAdES 확장 스키마를 추가합니다 |
매개변수
| IsOpen | 성공적으로 연 뒤 Close까지는 True |
|---|---|
| SignatureFieldPosition | 선택한 시그니처 필드 내용의 파일 오프셋 |
| SignatureFieldLength | 선택한 시그니처 내용을 위해 예약된 바이트 길이 |
비고
ByteRange 두 구간을 합치면 사실상 파일 전체를 덮기 때문에, GetDocumentBytes는 파일 전체를 메모리에 올립니다
이 저수준 표면을 건드리지 않는 서명에는 파사드가 문서화된 SignProcess 함수들로 동일한 파이프라인을 노출합니다
참고 항목
TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange