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 | 서명 위젯을 표시할 로드된 페이지의 0 기반 인덱스 |
X1, Y1, X2, Y2 | PDF 사용자 공간에서의 위젯 사각형(단위는 point, 원점은 왼쪽 아래). 가로와 세로는 양수여야 합니다 |
AFieldName | 새 서명 필드의 이름. 비어 있으면 안 되고 문서에 이미 존재하는 이름이어도 안 됩니다 |
ContentsBytes | CMS 서명을 위해 예약하는 바이트 수(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(서명 존재, append only)이 설정됩니다. 다른AddLoaded*필드 메서드와 달리 서명된 문서를 뷰어가 다시 쓰게 만드는/NeedAppearances는 추가하지 않습니다 - 저장된 파일은
SignPDFWithPFX로 서명합니다. 외부 서명자나 HSM이라면 파일을AnsiString으로 읽어 들이고,PreparePDFForSigning을 호출해 해시할 두 바이트 범위를 얻은 뒤 그 위에 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');