|
THotPDF.SignPDFWithPFX
|
Sebelumnya Metode AddPubKeyRecipient |
|
Menandatangani placeholder PDF yang sudah ada menggunakan file PFX / PKCS#12, membangun container CMS SignedData, dan menulis PDF yang sudah ditandatangani dalam satu panggilan
Delphi syntax (file overload): class function SignPDFWithPFX( const InputPDFPath: string; const OutputPDFPath: string; const PFXFilePath: string; const Password: AnsiString): boolean; overload; static;
Delphi syntax (stream overload): class function SignPDFWithPFX( InputStream: TStream; OutputStream: TStream; const PFXFilePath: string; const Password: AnsiString): boolean; overload; static;
Deskripsi SignPDFWithPFX adalah titik masuk penandatanganan PFX end-to-end yang ditambahkan di v2.119.27. PDF input harus sudah berisi placeholder tanda tangan yang dikeluarkan oleh THPDFPage.AddSignedSignatureField (atau wrapper PAdES-nya) dengan subFilter
1. Memuat PDF input, menemukan placeholder sentinel /ByteRange + /Contents, dan menambal /ByteRange dengan offset byte yang sesungguhnya. 2. Memuat file PFX dan mendekripsinya dengan kata sandi yang diberikan. PBES2 dengan PBKDF2-HMAC-SHA-256 + AES-256-CBC didukung (ini adalah bawaan untuk file PFX yang diekspor oleh OpenSSL 3.0+, certutil Windows 11+, dan macOS Keychain Access). File PBE-SHA1-3DES lawas akan memunculkan diagnostic; ekspor ulang dengan 3. Menghitung SHA-256 atas byte dokumen yang tercakup /ByteRange dan membangun blob DER CMS SignedData (RFC 5652) yang berisi sertifikat X.509, atribut yang ditandatangani (contentType + messageDigest + signingTime), dan tanda tangan RSA + SHA-256 atas atribut yang diberi tag SET 4. Men-hex-encode DER CMS, memverifikasi bahwa ukurannya muat dalam budget /Contents yang dicadangkan oleh AddSignedSignatureField (default 8 KB mencakup RSA 1024 / 2048-bit), lalu menyuntikkannya ke placeholder 5. Menulis byte yang sudah ditambal ke jalur atau stream keluaran
Mengembalikan True saat berhasil. Melempar
Alur kerja tipikal
Doc := THotPDF.Create(nil); Doc.FileName := 'unsigned.pdf'; Doc.BeginDoc; Doc.CurrentPage.AddSignedSignatureField( 'Sig1', Rect(60, 60, 260, 90), 8192, 'adbe.pkcs7.detached', 'Approved', 'Brussels', '', []); Doc.EndDoc; Doc.Free; THotPDF.SignPDFWithPFX('unsigned.pdf', 'signed.pdf', 'mykey.pfx', 'mypassword');
Catatan Algoritme tanda tangan adalah RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Identifier penandatangan adalah IssuerAndSerialNumber yang diambil dari sertifikat X.509. encapContentInfo bersifat detached (eContent dihilangkan). Atribut yang ditandatangani diurutkan menurut string byte DER menaik per RFC 5652 ยง5.4 sebelum di-hash
Untuk alur kerja PAdES B-T / B-LT / B-LTA yang memerlukan timestamp RFC 3161, dictionary DSS, atau tanda tangan timestamp dokumen, helper sisi produsen (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature) tetap berlaku; SignPDFWithPFX sendiri mengeluarkan tanda tangan dasar CMS-only (setara PAdES-B-B)
See also: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField |