认证签名与字段锁
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 指向同一个签名字典
如果 SigFieldLock 和 FieldMDP 都存在,它们的动作和字段列表必须一致
读取器执行有界的字典和数组检查,不执行 JavaScript、动作或签名内容
验证边界
GetLoadedSignaturePermissions 仅报告策略结构
VerifyLoadedSignature 继续单独报告密码学完整性
两个方法都不声称每个后续增量修订都遵守报告的 DocMDP 或 FieldMDP 权限,因为这需要逐修订的语义更改分析
性能
生产者验证只扫描已编写的 AcroForm 字段和小的签名引用数组,而已加载检查只读取选定的签名、其锁、其引用和 Catalog 权限条目
不解码任何页面内容、图像流、字体程序或无关的间接对象