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 值字典 |
| GetSignatureContentsHashHexByName | ByteRange 覆盖的已签名内容的十六进制摘要 |
| 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