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完全修飾名を持つ署名フィールドが存在するとき 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認証署名の 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選択した署名内容のために予約されたバイト長

備考

2 つの ByteRange セグメントを合わせると実質ファイル全体を覆うため、GetDocumentBytes はファイル全体をメモリ化します

この低レベル層に触れない署名には、ファサードがドキュメント化された SignProcess 関数群で同等のパイプラインを公開しています

関連項目

TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange