认证签名与字段锁
HotPDF 可以编写附加到认证签名和已签字段锁的 PDF 权限结构,然后在已加载文档中检查相同的结构
生产者 API
procedure AddCertificationSignatureField(
const FieldName: AnsiString;
Rectangle: TRect;
Permission: THPDFDocMDPPermission;
ContentsBytes: Integer = 8192;
const SubFilter: AnsiString = 'adbe.pkcs7.detached';
const Reason: AnsiString = '';
const Location: AnsiString = '';
const ContactName: AnsiString = '';
Flags: THPDFFormFieldFlags = []);
procedure ConfigureCertificationSignature(
const FieldName: AnsiString;
Permission: THPDFDocMDPPermission);
procedure AttachSignatureFieldLock(
const FieldName: AnsiString;
Action: THPDFFieldLockAction;
const Fields: array of AnsiString);
AddCertificationSignatureField 将已签占位符创建与认证配置结合在一起
ConfigureCertificationSignature 用于已存在的已编写已签占位符,并要求该字段是第一个携带签名字典的字段
一个文档只能包含一个认证签名,因此在对象图被更改之前会拒绝第二个配置请求
这些 API 自动协商 PDF 1.5 输出
DocMDP 权限级别
| 值 | 认证权限 |
|---|---|
dmpNoChanges | 认证后不允许任何更改 |
dmpFormFillAndSign | 允许表单填写、模板实例化和签名 |
dmpFormFillSignAndAnnotate | 允许上述更改以及注释的创建、删除和修改 |
dmpNone 保留用于没有 DocMDP 转换的检查结果,生产者方法会拒绝它
字段锁范围
| 值 | Fields 参数 | 签名后的效果 |
|---|---|---|
flaAll | 必须为空 | 锁定每个表单字段 |
flaInclude | 一个或多个唯一字段名 | 仅锁定列出的字段 |
flaExclude | 一个或多个唯一字段名 | 锁定除列出字段外的每个字段 |
AttachSignatureFieldLock 拒绝空名称、重复名称、无效的动作值、不兼容的 Fields 形状、未签名的目标字段,或已经携带锁或 FieldMDP 策略的字段
生成的结构
- 认证签名携带一个直接
/Reference数组,包含直接 DocMDP 签名引用字典和直接转换参数 - Catalog
/Perms /DocMDP条目指向同一个间接签名字典 - 字段
/Lock条目指向一个间接/Type /SigFieldLock字典 - 锁范围被复制到一个直接 FieldMDP 签名引用中,其
/Data条目指向间接 Catalog 根 - 签名字典通过
/V 1
Delphi 示例
var
LockedFields: THPDFAnsiStringArray;
begin
HotPDF.CurrentPage.AddTextField(
'InternalCode', '', Rect(40, 80, 220, 108));
HotPDF.CurrentPage.AddCertificationSignatureField(
'CertSig', Rect(40, 140, 260, 190),
dmpFormFillAndSign, 8192,
'adbe.pkcs7.detached', 'Document approval');
SetLength(LockedFields, 1);
LockedFields[0] := 'InternalCode';
HotPDF.CurrentPage.AttachSignatureFieldLock(
'CertSig', flaInclude, LockedFields);
end;
已加载检查
function GetLoadedSignaturePermissions(
SigIndex: Integer;
out Info: THPDFSignaturePermissionInfo): Boolean;
读取器报告 DocMDP 权限、Catalog 链接、SigFieldLock 范围、FieldMDP 范围、字段名称、结构有效性和诊断问题字符串
它验证必需的直接和间接对象形状,并确认 Catalog /Perms /DocMDP目标、transform 版本、重复引用、UR 与 UR3 限制,以及可选的 DocMDP /P 2 默认值
如果 SigFieldLock 和 FieldMDP 都存在,它们的动作和字段列表必须一致
读取器执行有界的字典和数组检查,不执行 JavaScript、动作或签名内容
标准变换覆盖
| 方法 | 报告的策略 |
|---|---|
DocMDP | 认证权限及匹配的 Catalog /Perms /DocMDP 目标 |
UR | 文档、注释、表单、签名与嵌入文件使用权,外加旧式 /UR 或字节区间 /UR3 来源 |
FieldMDP | All、Include 或 Exclude 字段锁作用域及复制的 SigFieldLock 协定 |
Identity | 从必需的间接 /Data 根可达的、无环的传递对象号 |
未知方法名保留在 UnknownTransformMethods 中并使权限结构无效,关键变换不会被漏看
验证边界
GetLoadedSignaturePermissions 仅报告策略结构
VerifyLoadedSignature 继续单独报告密码学完整性
AnalyzeLoadedSignatureRevisions 对字节区间 DocMDP、FieldMDP、UR3 与 Identity 策略做逐修订的语义更改分析;已弃用的非字节区间 UR 对象摘要签名仍可做结构检查
SaveIncrementalUpdateAuthenticated 把检查变成强制:从签名快照读取策略、认证控制签名、验证所有后续修订,只有在全部策略通过后才经原子替换发布
性能
生成器验证只扫描已编写的 AcroForm 字段和小的签名引用数组;已加载检查只读取选定的签名、其锁、其引用与 Catalog 权限条目
不解码任何页面内容、图像流、字体程序或无关的间接对象