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
GetSignatureFieldNamesAcroForm의 모든 시그니처 필드 이름을 TStrings에 채웁니다
GetSignatureValueObjNum시그니처 값 딕셔너리의 객체 번호. 필드가 서명되지 않았으면 0
GetSignatureValueByNameValueKey로 고르는 날 바이트 값: 0 = /Contents, 1 = /Cert, 2 = /Filter, 3 = /SubFilter, 11~14 = /ByteRange 항목 0~3(10진 문자열)
GetSignatureTextValueByNameValueKey로 고르는 텍스트 값: 0 = /M, 1 = /Name, 2 = /Reason, 3 = /Location, 4 = /ContactInfo, 5 = /Type
GetSignatureDocMDPLevelByName인증(certifying) 서명의 DocMDP 변환 레벨(P 값). 없으면 0
GetSignaturePermissionInfoByName서명의 DocMDP와 FieldMDP 제약을 보고용 레코드로 해석합니다
GetSignatureSeedValueEx서명자가 필드에 기록할 수 있는 내용을 제약하는 /SV 시드 값 딕셔너리를 읽습니다
GetSignatureContentsHashHexByNameByteRange가 덮는 서명 대상 내용의 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