THotPDF.AddLoadedSignedSignatureField 方法
向已加载的文档添加一个随时可签名的签名字段。该字段携带的签名字典预留了 /ByteRange 和 /Contents 空间,因此文档保存后,SignPDFWithPFX、PreparePDFForSigning 和 InsertSignatureHex 即可对其签名。配合 BeginIncrementalUpdate 使用,已签名的 PDF 就能通过这种方式获得第二个签名
声明
function AddLoadedSignedSignatureField(PageIndex: Integer; X1, Y1, X2, Y2: Single;
const AFieldName: AnsiString; ContentsBytes: Integer = 8192;
const SubFilter: AnsiString = 'adbe.pkcs7.detached';
const Reason: AnsiString = ''; const Location: AnsiString = '';
const ContactName: AnsiString = ''): Integer;
单元
HPDFDoc
参数
| 名称 | 用途 |
|---|---|
PageIndex | 显示签名控件的已加载页面的从零起算索引 |
X1, Y1, X2, Y2 | PDF 用户空间中的控件矩形(单位为点,原点在左下角);宽度和高度必须为正值 |
AFieldName | 新签名字段的名称;不能为空,也不能与文档中已有字段重名 |
ContentsBytes | 为 CMS 签名预留的字节数(写入时会占用两倍数量的十六进制字符);必须能容纳完整签名,包括证书和任何时间戳令牌 |
SubFilter | 签名格式,例如 adbe.pkcs7.detached 或 ETSI.CAdES.detached |
Reason, Location, ContactName | 签名字典中可选的 /Reason、/Location 和 /ContactInfo 条目 |
返回值
返回新表单字段的索引;当 PageIndex 超出范围时返回 -1
使用说明
- 调用
BeginIncrementalUpdate或LoadFromFile之后没有当前页面,因此应使用本方法而不是THPDFPage.AddSignedSignatureField,后者面向以BeginDoc创建的文档 - 在增量模式下,字段、其签名字典、更新后的 AcroForm 和页面
/Annots会作为新修订版追加。早期签名覆盖的字节不会改变,因此那些签名仍然有效,而新签名覆盖整个文件 - AcroForm 会被设置
/SigFlags 3(存在签名、只允许追加)。与其他AddLoaded*字段方法不同,它不会添加/NeedAppearances,因为那会要求查看器重写已签名的文档 - 用
SignPDFWithPFX对保存后的文件签名。若使用外部签名器或 HSM,则把文件读入AnsiString,调用PreparePDFForSigning取得需要哈希的两段字节范围,在其上构造 CMS,再用InsertSignatureHex写入其十六进制值 - 如果要添加的是留待查看器或其他工具稍后签名的空字段,请改用 AddLoadedSignatureField
示例
PDF := THotPDF.Create(nil);
try
PDF.BeginIncrementalUpdate('Signed.pdf');
PDF.AddLoadedSignedSignatureField(0, 300, 120, 500, 160, 'Approver', 8192,
'adbe.pkcs7.detached', 'Approved');
PDF.SaveIncrementalUpdate('Prepared.pdf');
finally
PDF.Free;
end;
// Signs the reserved field; the first signature stays valid
THotPDF.SignPDFWithPFX('Prepared.pdf', 'SignedTwice.pdf', 'Signer.pfx', 'password');