THotPDF.AddLoadedSignedSignatureField Method
在已載入文件中加入一個立即可簽署的簽章欄位。此欄位帶有保留 /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 | 顯示簽章 widget 之已載入頁面的以零起始索引 |
X1, Y1, X2, Y2 | PDF 使用者空間中的 widget 矩形(單位為 point,原點在左下角);寬度與高度必須為正值 |
AFieldName | 新簽章欄位的名稱;不得為空,也不得與文件中既有欄位同名 |
ContentsBytes | 保留給 CMS 簽章的位元組數(寫入時以兩倍的十六進位位數表示);必須容得下完整簽章,包括憑證與任何時間戳記權杖 |
SubFilter | 簽章格式,例如 adbe.pkcs7.detached 或 ETSI.CAdES.detached |
Reason, Location, ContactName | 簽章字典中選填的 /Reason、/Location 與 /ContactInfo 項目 |
傳回值
傳回新表單欄位的索引;當 PageIndex 超出範圍時傳回 -1
使用說明
BeginIncrementalUpdate或LoadFromFile之後沒有任何目前頁面,因此請用本方法,而不是專為BeginDoc建立的文件設計的THPDFPage.AddSignedSignatureField- 在增量模式下,欄位本身、其簽章字典、更新後的 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');