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
GetSignatureFieldNames把 AcroForm 中所有签名字段名填入 TStrings
GetSignatureValueObjNum签名值字典的对象编号;字段未签名时为 0
GetSignatureValueByName由 ValueKey 选择的原始二进制值:0 = /Contents、1 = /Cert、2 = /Filter、3 = /SubFilter、11 到 14 = /ByteRange 条目 0 到 3(十进制字符串)
GetSignatureTextValueByName由 ValueKey 选择的文本值:0 = /M、1 = /Name、2 = /Reason、3 = /Location、4 = /ContactInfo、5 = /Type
GetSignatureDocMDPLevelByName认证签名的 DocMDP 变换级别(P 值),缺失时为 0
GetSignaturePermissionInfoByName把签名的 DocMDP 与 FieldMDP 约束解析成报告记录
GetSignatureSeedValueEx读取约束签署者可写入内容的 /SV seed 值字典
GetSignatureContentsHashHexByNameByteRange 覆盖的已签名内容的十六进制摘要
SetSignatureValue把完成的签名写入预留的 /Contents 空间并记录 DocMDP 级别
SetSignatureFieldLock写入带动作和字段名列表的字段锁定字典
SetSignatureImage, SetSignatureAppearanceText, SetSignatureBounds控制可见外观:绘制的图像、v3.221.0 实现的纯文本外观流,以及显式的字段边界
GetDocumentBytes, GetDocumentSize, ReadDocumentRange直接访问底层字节,可在外部对整个文件或 ByteRange 区段做哈希
GetDSSValidationMaterial返回字段的 DSS 证书、CRL 和 OCSP 响应,并报告是否使用了 VRI 证据
SetSignatureFlags, EnsurePAdESExtensions调整 /SigFlags 并添加 ETSI PAdES 扩展 schema

参数

IsOpen成功打开后到 Close 之前为 True
SignatureFieldPosition所选签名字段内容的文件偏移
SignatureFieldLength为所选签名内容预留的字节长度

备注

由于两个 ByteRange 区段加起来几乎覆盖整个文件,GetDocumentBytes 会把整个文件物化到内存

若签名流程不想碰这个底层接口,facade 通过文档化的 SignProcess 函数暴露等价管线

另请参阅

TPDFlibSignatureVerifier, TPDFlibPFXFile, TPDFlibSigner, NewSignProcessFromFile, GetSignProcessByteRange