THotPDF.AddLoadedSignedSignatureField メソッド
署名準備の整った署名フィールドをロード済みドキュメントに追加します。フィールドは予約済みの /ByteRange と /Contents 空間を備えた署名辞書を持つため、ドキュメントの保存後すぐに SignPDFWithPFX、PreparePDFForSigning、InsertSignatureHex で署名できます。BeginIncrementalUpdate と組み合わせるのが、署名済み PDF に 2 本目の署名を施す方法です
宣言
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 署名のために予約するバイト数(2 倍の 16 進桁として書き込まれます)。証明書やタイムスタンプトークンを含む署名全体を収める必要があります |
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でハッシュ対象の 2 つのバイト範囲を取得し、それらに対して CMS を構築して、その 16 進表現を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');